Quelle est la signification de {… this.props} dans Reactjs


119

Quel est le sens de

{...this.props}

J'essaye de l'utiliser comme ça

 <div {...this.props}> Content Here </div>

Réponses:


201

C'est ce qu'on appelle les attributs de propagation et son objectif est de faciliter le passage des accessoires.

Imaginons que vous ayez un composant qui accepte N nombre de propriétés. Les transmettre peut être fastidieux et compliqué si le nombre augmente.

<Component x={} y={} z={} />

Ainsi, à la place, vous faites cela, enveloppez-les dans un objet et utilisez la notation étalée

var props = { x: 1, y: 1, z:1 };
<Component {...props} />

qui le décompressera dans les accessoires de votre composant, c'est-à-dire que vous ne l'utiliserez "jamais" {... props}dans votre render()fonction, uniquement lorsque vous passez les accessoires à un autre composant. Utilisez vos accessoires non emballés comme d'habitude this.props.x.


2
Juste pour ajouter, il peut être utile de le considérer comme un remplacement this.transferPropsToqui était obsolète dans React 0.12.x et sera supprimé dans 0.13.x. Il permet bien sûr une utilisation beaucoup plus avancée, mais la simple traduction de React 0.11.x this.transferPropsTo(<Foo />)en <Foo {...this.props} />est plus utile pour les personnes effectuant cette transition.
Mike Driver

13
Bon awnser, mais "vous" n'utilisez "jamais" {... props} dans votre fonction render (), uniquement lorsque vous passez les props à un autre composant. " Est un terme de phrase très déroutant. Il est recommandé de réécrire comme suit: "Vous n'utilisez {... props} dans votre render () que lorsque vous passez les accessoires à un autre composant." pour plus de clarté.
dprogramz

17

C'est ES6 Spread_operatoret Destructuring_assignment.

<div {...this.props}>
  Content Here
</div>

C'est égal à Class Component

const person = {
    name: "xgqfrms",
    age: 23,
    country: "China"
};

class TestDemo extends React.Component {
    render() {
        const {name, age, country} = {...this.props};
        // const {name, age, country} = this.props;
        return (
          <div>
              <h3> Person Information: </h3>
              <ul>
                <li>name={name}</li>
                <li>age={age}</li>
                <li>country={country}</li>
              </ul>
          </div>
        );
    }
}

ReactDOM.render(
    <TestDemo {...person}/>
    , mountNode
);

entrez la description de l'image ici


ou Function component

const props = {
    name: "xgqfrms",
    age: 23,
    country: "China"
};

const Test = (props) => {
  return(
    <div
        name={props.name}
        age={props.age}
        country={props.country}>
        Content Here
        <ul>
          <li>name={props.name}</li>
          <li>age={props.age}</li>
          <li>country={props.country}</li>
        </ul>
    </div>
  );
};

ReactDOM.render(
    <div>
        <Test {...props}/>
        <hr/>
        <Test 
            name={props.name}
            age={props.age}
            country={props.country}
        />
    </div>
    , mountNode
);

entrez la description de l'image ici

réfs


1

Il compilera à ceci:

React.createElement('div', this.props, 'Content Here');

Comme vous pouvez le voir ci-dessus, il passe tous ses accessoires au div.


1

C'est la fonctionnalité ES-6. Cela signifie que vous extrayez toutes les propriétés des accessoires dans div.{... }

L'opérateur est utilisé pour extraire les propriétés d'un objet.


1

Vous utiliserez des accessoires dans votre composant enfant

par exemple

si vos accessoires maintenant composants sont

{
   booking: 4,
   isDisable: false
}

vous pouvez utiliser ces accessoires dans votre compoenet enfant

 <div {...this.props}> ... </div>

dans votre composant enfant, vous recevrez tous vos accessoires parents.


Bonne réponse mais ce serait encore mieux si vous incluiez une explication sur ce à quoi servent les accessoires.
Mike Poole
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.