Как получить доступ к реквизитам вне компонента класса React
У меня проблемы с пониманием того, как получить доступ к реквизитам, определенным вне компонента класса в React.
В следующем коде определены все реквизиты, кроме this.props.checkboxArray, который в настоящее время возвращает "не может прочитать свойство" реквизиты "из undefined".
Я знаю, что 'this' не определено вне компонента класса, поэтому я попытался связать 'this' с checkboxArray, но все равно та же ошибка, что и 'props', не определена.
let checkboxObject = this.props.checkboxArray.reduce(
(name, boolean) => ({
...name,
[boolean]: false
}),
{}
);
class CheckboxList extends Component {
constructor(props) {
super(props);
this.state = { checkbox: checkboxObject };
this.checkboxArray = this.checkboxArray.bind(this);
}
handleCheckboxChange = name => {
let checkbox = this.state.checkbox;
for (var key in checkbox) {
if (key === name) {
checkbox[key] = !checkbox[key];
}
}
this.setState({ checkbox });
};
render() {
return (
<div className="row" id="CheckboxList">
{this.props.checkBoxArray.map(checkbox => (
<Checkbox
label={checkbox}
isSelected={checkboxObject[checkbox]}
onCheckboxChange={this.props.onCheckboxTick}
key={checkbox}
/>
))}
</div>
);
}
}
export default CheckboxList;
2 ответа
Вы должны создать функцию для вызова checkboxObject, например:
const createCheckboxes = checkboxArray => checkboxArray.reduce(
(name, boolean) => ({
...name,
[boolean]: false
}),
{}
);
и назовите эту функцию для вашего компонента класса: createCheckboxes(this.props.checkboxArray)
Кстати, это не лучшая практика. Ваш флажок должен быть отредактирован на его родительском компоненте с помощью Selector
Вам не нужно создавать внешний компонент checkboxObject, вместо этого вы можете просто уменьшить checkboxArray непосредственно в конструкторе, инициализируя состояние флажка, как я делал в обновленном коде ниже. Затем получите к нему доступ, используя this.state.checkbox[checkbox] для isSelected prop
Таким образом, вы устанавливаете флажок только один раз. Вот обновленный код
class CheckboxList extends Component {
constructor(props) {
super(props);
this.state = {
checkbox: this.props.checkboxArray.reduce(
(name, boolean) => ({
...name,
[boolean]: false
}),
{}
); //here you can directly initialize the state
};
this.checkboxArray = this.checkboxArray.bind(this);
}
handleCheckboxChange = name => {
let checkbox = this.state.checkbox;
for (var key in checkbox) {
if (key === name) {
checkbox[key] = !checkbox[key];
}
}
this.setState({ checkbox });
};
render() {
return (
<div className="row" id="CheckboxList">
{this.props.checkBoxArray.map(checkbox => (
<Checkbox
label={checkbox}
isSelected={this.state.checkbox[checkbox]}
onCheckboxChange={this.props.onCheckboxTick}
key={checkbox}
/>
))}
</div>
);
}
}
export default CheckboxList;