Accédez aux accessoires entre guillemets dans React JSX

295

Dans JSX, comment référencez-vous une valeur propsde l'intérieur d'une valeur d'attribut entre guillemets?

Par exemple:

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

La sortie HTML résultante est:

<img class="image" src="images/{this.props.image}">
cantera
la source

Réponses:

476

React (ou JSX) ne prend pas en charge l'interpolation de variable à l'intérieur d'une valeur d'attribut, mais vous pouvez mettre n'importe quelle expression JS entre accolades comme valeur d'attribut entière, donc cela fonctionne:

<img className="image" src={"images/" + this.props.image} />
Sophie Alpert
la source
26
qu'en est-il des backtips dans es6?
David Lavieri
1
@DavidLavieri Voir la réponse de Cristi stackoverflow.com/a/30061326/70345 ci-dessous.
Ian Kemp
235

Si vous souhaitez utiliser les littéraux de modèle es6, vous avez également besoin d'accolades autour des graduations:

<img className="image" src={`images/${this.props.image}`} />
Cristi
la source
futurs littéraux du modèle ES6
zloctb
1
La chaîne entre guillemets est un "modèle littéral": developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jon Schneider
47

Si vous utilisez JSX avec Harmony, vous pouvez le faire:

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

Ici, vous écrivez la valeur de srccomme expression.

user3089094
la source
1
c'est quelque chose qui est difficile à trouver. et pour les conteneurs réutilisables, c'est un incontournable
holms
2
Juste pour que les gens ne se confondent pas avec la mention d'Harmony, cela fait partie de la norme ES6 , tandis que la réponse est datée de quelques mois avant qu'elle ne devienne une norme.
Сергей Гринько
12

Au lieu d'ajouter des variables et des chaînes, vous pouvez utiliser les chaînes de modèle ES6! Voici un exemple:

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

Comme pour tous les autres composants JavaScript à l'intérieur de JSX, utilisez des chaînes de modèle à l'intérieur des accolades. Pour «injecter» une variable, utilisez un signe dollar suivi d'accolades contenant la variable que vous souhaitez injecter. Par exemple:

{`string ${variable} another string`}
Saahil
la source
8

Les meilleures pratiques consistent à ajouter une méthode getter pour cela:

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

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

Ensuite, si vous avez plus de logique plus tard, vous pouvez gérer le code en douceur.

Abdennour TOUMI
la source
2

Pour les personnes qui recherchent des réponses par rapport à la fonction de «cartographie» et aux données dynamiques, voici un exemple pratique.

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

Cela donne l'URL comme " http://examole.com/randomview/images/2/dp_pics/182328.jpg " (exemple aléatoire)

RAM
la source
1

Remarque: En réaction, vous pouvez mettre l'expression javascript entre accolades. Nous pouvons utiliser cette propriété dans cet exemple.
Remarque: jetez un œil à l'exemple ci-dessous:

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
la source
1

Voici la meilleure option pour Dynamic className ou Props, faites juste une concaténation comme nous le faisons en Javascript.

     className={
        "badge " +
        (this.props.value ? "badge-primary " : "badge-danger ") +
        " m-4"
      }
Saad Mirza
la source
Je recommanderais d'utiliser le classnamespackage pour construire des classNames dynamiques
David Lavieri
1

vous pouvez utiliser

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

ou

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

ou

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