Який сенс {… this.props} у Reactjs


119

Яке значення

{...this.props}

Я намагаюся використовувати це так

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

Відповіді:


201

Це називається атрибутами розповсюдження, а його мета - полегшити передачу реквізиту.

Уявімо собі, що у вас є компонент, який приймає N кількість властивостей. Передача цих даних може бути втомливим і непростим, якщо кількість зростає.

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

Таким чином, замість цього ви робите це, загортайте їх у об'єкт і використовуйте позначення спред

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

який розпакує його в реквізит вашого компонента, тобто ви ніколи не використовуєте {... props}всередині своєї render()функції, лише коли ви передасте реквізит в інший компонент. Використовуйте розпакований реквізит як звичайно this.props.x.


2
Додамо лише, що це може допомогти this.transferPropsToрозглянути це як заміну, яка застаріла в React 0.12.x і буде видалена в 0.13.x. Звичайно, це дозволяє набагато більш розвинене використання, проте просто переклад React 0.11.x this.transferPropsTo(<Foo />)на <Foo {...this.props} />є найбільш корисним для людей, які здійснюють цей перехід.
Водій Майка

13
Добрий awnser, але "ви" ніколи "не використовуйте {... реквізит] у своїй функції render (), лише коли ви передаєте реквізит в інший компонент." Це дуже заплутаний термін фрази. Рекомендувати перезаписати таке: "Ви використовуєте {... props} всередині вашого візуалізації () лише тоді, коли реквізит переносите на інший компонент." для наочності.
dprogramz

17

Це ES6 Spread_operatorі Destructuring_assignment.

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

Це дорівнює 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
);

введіть тут опис зображення


або 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
);

введіть тут опис зображення

реф


1

Він складе до цього:

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

Як ви бачите вище, він передає всі реквізити div.


1

Це особливість ES-6. Це означає, що ви витягуєте всі властивості реквізиту div.{... }

Оператор використовується для отримання властивостей об'єкта.


1

Ви будете використовувати реквізит у своєму дочірньому компоненті

наприклад

якщо зараз ваш реквізит компонента

{
   booking: 4,
   isDisable: false
}

Ви можете використовувати цей реквізит у своєму дитячому композитоні

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

у вашому дочірнім компоненті ви отримаєте всі ваші батьківські реквізити.


Хороша відповідь, але було б ще краще, якби ви включили пояснення про те, для чого потрібний реквізит.
Майк Пул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.