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}">

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} />

26
co z oparciem w es6?
David Lavieri

1
@DavidLavieri Zobacz odpowiedź Cristi stackoverflow.com/a/30061326/70345 poniżej.
Ian Kemp,


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.


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`}

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.



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>
      );

  }
}

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"
      }

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>
    )
  }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.