const obj = {a: 1, b: 2, c: 3};
<MyComponent {...obj} />
совпадает с <MyComponent a={1} b={2} c={3} />
.Таким образом, вы используете spread
operator ...
для извлечения элементов из объекта или массива.
Outside React, если const test={a: 1, b:2 }
, то const x = {test} //es6 feature
аналогично const x = {test: test}
.Так что это то же самое, что и const x = {test: {a: 1, b:2}}
Где как, <MyComponent {obj} />
создает ошибку в React, потому что внутри MyComponent
, как называется опора, которую можно использовать для доступа, передано obj
?.Здесь ничего нет.Отсюда и ошибка.
function MyComponent(props) {
// What is props.? to access obj
}
Итак, вы используете реквизит с именем,
<MyComponent x={obj} />
function MyComponent(props) {
// props.x has obj
// props.x = obj
console.log(props.x);
return <div />
}
Но оператор распространения автоматически присваивает имена реквизитов с ключами объекта и значениями в качестве значений объекта, как показано в началеэтот ответ.
Как вы сказали в своем вопросе, const newTodos = [...todos, newItem]
создает новый массив со старыми задачами, распределенными из todos
, и добавляет дополнительные newItem
.Если вы не распространили todos
, это создаст newTodos = [[todo1, todo2],newItem]
.