Acessar objetos dentro de aspas no React JSX


295

No JSX, como você faz referência a um valor propsde dentro de um valor de atributo entre aspas?

Por exemplo:

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

A saída HTML resultante é:

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

Respostas:


476

React (ou JSX) não suporta interpolação de variáveis ​​dentro de um valor de atributo, mas você pode colocar qualquer expressão JS dentro de chaves como o valor inteiro do atributo, portanto, isso funciona:

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

26
o que dizer de dicas no es6?
David Lavieri

1
@DavidLavieri Veja a resposta de Cristi stackoverflow.com/a/30061326/70345 abaixo.
22818 Ian Kemp


47

Se você estiver usando JSX com Harmony, poderá fazer o seguinte:

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

Aqui você está escrevendo o valor de srccomo uma expressão.


1
isso é algo difícil de encontrar. e para recipientes reutilizáveis este é um obrigatória-saber
holms

2
Apenas para que as pessoas não se confundam em mencionar Harmony, isso faz parte do padrão ES6 , enquanto a resposta é datada alguns meses antes de se tornar um padrão.
Сергей Гринько

12

Em vez de adicionar variáveis ​​e strings, você pode usar as strings do modelo ES6! Aqui está um exemplo:

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

Como para todos os outros componentes JavaScript dentro do JSX, use cadeias de modelo dentro de chaves. Para "injetar" uma variável, use um cifrão seguido de chaves contendo a variável que você deseja injetar. Por exemplo:

{`string ${variable} another string`}

8

As práticas recomendadas são adicionar o método getter para isso:

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

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

Então, se você tiver mais lógica posteriormente, poderá manter o código sem problemas.



1

Nota: No react, você pode colocar a expressão javascript dentro de colchetes. Podemos usar essa propriedade neste exemplo.
Nota: dê uma olhada no exemplo abaixo:

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

Aqui está a melhor opção para Dynamic className ou Props, apenas faça alguma concatenação como fazemos em Javascript.

     className={
        "badge " +
        (this.props.value ? "badge-primary " : "badge-danger ") +
        " m-4"
      }

Eu recomendo usos classnamespacote para a construção de nomes de classes dinâmicas
David Lavieri

1

você pode usar

<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>
    )
  }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.