Что означает {… this.props} в Reactjs


119

Каково значение

{...this.props}

Я пытаюсь использовать это так

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

Ответы:


202

Это называется атрибутами распространения, и его цель - упростить передачу реквизита.

Представим, что у вас есть компонент, который принимает 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, но «вы« никогда »не используете {... props} внутри вашей функции render (), только когда вы передаете props другому компоненту». Это очень запутанный термин. Рекомендуется переписать следующее: «Вы используете {... props} внутри вашего 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

Вы будете использовать props в своем дочернем компоненте

например

если ваш теперь компонент props

{
   booking: 4,
   isDisable: false
}

Вы можете использовать этот реквизит в своем детском сообществе

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

в вашем дочернем компоненте вы получите все свои родительские реквизиты.


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