Dostęp do rekwizytów w cudzysłowach w React JSX

294

Jak w JSX odwołujesz się do wartości propsz wewnątrz cytowanej wartości atrybutu?

Na przykład:

<img className="image" src="images/{this.props.image}" />

Wynikowy wynik HTML to:

<img class="image" src="images/{this.props.image}">
Cantera
źródło

Odpowiedzi:

475

React (lub JSX) nie obsługuje interpolacji zmiennych w wartości atrybutu, ale możesz umieścić dowolne wyrażenie JS w nawiasach klamrowych jako całą wartość atrybutu, więc działa to:

<img className="image" src={"images/" + this.props.image} />
Sophie Alpert
źródło
26
co z oparciem w es6?
David Lavieri
1
@DavidLavieri Zobacz odpowiedź Cristi stackoverflow.com/a/30061326/70345 poniżej.
Ian Kemp,
235

Jeśli chcesz użyć literałów szablonu es6, potrzebujesz również nawiasów klamrowych wokół znaczników:

<img className="image" src={`images/${this.props.image}`} />
Cristi
źródło
Przyszłe literały szablonów ES6
zloctb
1
Ciąg zamknięty przez backticks to „dosłowny szablon”: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jon Schneider
47

Jeśli używasz JSX z Harmony, możesz to zrobić:

<img className="image" src={`images/${this.props.image}`} />

Tutaj piszesz wartość srcjako wyrażenie.

użytkownik3089094
źródło
1
to jest coś, co trudno znaleźć. a w przypadku pojemników wielokrotnego użytku to trzeba wiedzieć
holms
2
Aby ludzie nie mylili się ze wzmianką o Harmony, jest to część standardu ES6 , a odpowiedź jest datowana na kilka miesięcy, zanim stała się standardem.
Сергей Гринько
12

Zamiast dodawać zmienne i ciągi, możesz użyć ciągów szablonów ES6! Oto przykład:

<img className="image" src={`images/${this.props.image}`} />

Podobnie jak w przypadku wszystkich innych składników JavaScript w JSX, użyj ciągów szablonów w nawiasach klamrowych. Aby „wstrzyknąć” zmienną, użyj znaku dolara, a następnie nawiasów klamrowych zawierających zmienną, którą chcesz wstrzyknąć. Na przykład:

{`string ${variable} another string`}
Saahil
źródło
8

Najlepsze praktyki to dodanie do tego metody gettera:

getImageURI() {
  return "images/" + this.props.image;
}

<img className="image" src={this.getImageURI()} />

Następnie, jeśli masz więcej logiki, możesz płynnie utrzymywać kod.

Abdennour TOUMI
źródło
2

Dla ludzi, którzy szukają odpowiedzi na funkcję „map” i dane dynamiczne, oto działający przykład.

<img src={"http://examole.com/randomview/images" + each_actor['logo']} />

Daje to adres URL jako „ http://examole.com/randomview/images/2/dp_pics/182328.jpg ” (przykład losowy)

Baran
źródło
1

Uwaga: W reakcji możesz umieścić wyrażenie javascript w nawiasach klamrowych. Możemy użyć tej właściwości w tym przykładzie.
Uwaga: spójrz na poniższy przykład:

class LoginForm extends React.Component {

  constructor(props) {
    super(props);

    this.state = {i:1};
  }

  handleClick() {
    this.setState(prevState => ({i : prevState.i + 1}));

    console.log(this.state.j);  
  }


  render() {

    return (
      <div>
        <p onClick={this.handleClick.bind(this)}>Click to change image</p>
        <img src={'images/back'+ this.state.i+'.jpg'}/>
      </div>
      );

  }
}
Kiran
źródło
1

Oto najlepsza opcja dla Dynamic className lub Props, po prostu wykonaj konkatenację, tak jak robimy to w JavaScript.

     className={
        "badge " +
        (this.props.value ? "badge-primary " : "badge-danger ") +
        " m-4"
      }
Saad Mirza
źródło
Polecam używa classnamespakietu do budowania dynamicznych nazw klas
David Lavieri
1

możesz użyć

<img className="image" src=`images/${this.props.image}`>

lub

<img className="image" src={'images/'+this.props.image}>

lub

  render() {
         let imageUrl = this.props.image ? "images/"+this.props.image : 'some placeholder url image';
    return (
       <div>
          <img className="image" src={imageUrl} />
       </div>
    )
  }
Ali Mohammad
źródło