Что ж, для вашего компонента MyProductPage использование this
здесь неверно. MyProductPage - это функциональный компонент, а не компонент класса.
Поскольку props
передается как аргумент, вы можете получить к нему доступ, как и любой другой аргумент.
Итак, приведенный ниже код не должен передавать ошибку ... однако, не зная больше о вашем коде, я не уверен, где вам нужно привязать метод toggle
.
const MyProductPage = (props) => {
return (
<ProductPage
{...props}
toggle={props.toggle}
/>
);
}
Дополнительное примечание: я также почти уверен, что {...props}
нужно указать первым. См. Ниже.
Если у вас по-прежнему возникает проблема с toggle
возвратом неопределенного поведения, вам, вероятно, потребуется изменить лексическую привязку this
выше в родительском компоненте. Это просто не сработает, если вы установите его здесь.
Что касается вашего второго вопроса, {...props}
- это пример оператора спреда. Дружественное к React определение можно найти здесь.
Чтобы немного изменить пример:
var exampleObject= {};
exampleObject.foo = x;
exampleObject.bar = y;
var component = <Component {...exampleObject} />;
... оператор распространения просто говорит: возьмите все методы из exampleObject
и передайте их как свойства. Это еще один способ сказать:
<Component foo={exampleObject.foo} bar={exampleObject.bar} />
Это берет все в exampleObject
и передает его вниз.
Представьте, что у вас есть 20 свойств, которые вы хотите передать дочернему компоненту. Это может очень быстро стать многословным, поэтому оператор распространения - это всего лишь немного синтаксического сахара, так что вам не нужно все это записывать.
РЕДАКТИРОВАТЬ: Чтобы связать это с вашими примерами:
Изображение, если родительский компонент передает реквизиты следующим образом:
<MyProductPage {...exampleObject} />
// Includes .foo and .bar
Затем, если вам не нужно изменять какие-либо сохраненные значения, дочерний компонент может просто выглядеть так
const MyProductPage = (props) => {
return (
<ProductPage {...props} />
);
}
// still contains .foo and .bar
Но, если вам ДЕЙСТВИТЕЛЬНО нужно изменить одно из свойств, вы просто передаете его отдельно (что-то вроде «переопределения»):
const MyProductPage = (props) => {
return (
<ProductPage
{...props}
foo={props.foo + 1}
/>
);
}
// still contains .foo and .bar, but foo will be different.
{...props}
сначала передает все вниз, затем ваш явный вызов foo
отменяет то, что передается, и дает ему новое значение.
person
Denny S. Temple
schedule
17.07.2017