У меня есть два компонента, дочерние компоненты и родительские компоненты.
Вот формат данных, поступающий из базы данных:
{permissible_objects :["group", "topGroup"],all_permissions: ["can_view","can_create"]}
Я собираюсь передать данные из родительского компонента в дочерний компоненты . когда я передаю данные parent родительскому компоненту, я получаю сообщение об ошибке
TypeError: Cannot read property 'includes' of undefined
Однако я вижу данные в console.log (). Где проблема typeError не может быть неопределена? Если я работал со stati c data, проблем нет. Все работает отлично.
Это мои дочерние компоненты (UserPermission. js)
state = {
permission: {}
};
UNSAFE_componentWillMount() {
this.setState({
userPermissionList: this.props.userPermissionList,
groupItems:
this.props.userPermissionList &&
this.props.userPermissionList.all_permissions &&
this.props.userPermissionList.all_permissions.map(item => item.value)
});
this.setDefault(false);
}
setDefault = fill => {
const temp = {};
this.state.userPermissionList &&
this.state.userPermissionList.permissible_objects &&
this.state.userPermissionList.permissible_objects.forEach(
x => (temp[x] = fill ? this.state.groupItems : [])
);
this.setState({ permission: temp });
};
checkLength = () => {
const { permission } = this.state;
let sum = 0;
Object.keys(permission).forEach(x => (sum += permission[x].length));
return sum;
};
isTotalIndeterminate = () => {
const len = this.checkLength();
return len > 0 && len < this.state.groupItems.length * group.length;
};
onCheckTotalChange = () => e => {
this.setDefault(e.target.checked);
};
isTotalChecked = () => {
return this.checkLength() === this.state.groupItems.length * group.length;
};
этот метод работает для каждой группы, например, вот мои две роли - одна группа, а другая topGroup.
isIndeterminate = label => {
const { permission } = this.state;
// undefined !== theHref && theHref.length
return permission[label] && permission[label].length !== undefined
? permission[label].length > 0 &&
permission[label].length < this.state.groupItems.length
: null;
};
onCheckAllChange = label => e => {
const { permission } = this.state;
const list = e.target.checked ? this.state.groupItems : [];
this.setState({ permission: { ...permission, [label]: list } });
};
isAllChecked = label => {
const { permission } = this.state;
console.log(label);
return !this.state.groupItems.some(x => !permission[label].includes(x));
};
/ ** * этот метод работает для одного элемента такие как can_view, can_delete, can_update * /
isChecked = label => {
const { permission } = this.state;
return permission[label];
};
onChange = label => e => {
const { permission } = this.state;
this.setState({ permission: { ...permission, [label]: e } });
};
Вот три флажка
Интерфейс рендеринга:
это будет выбран флажок Все.
<Checkbox
indeterminate={this.isTotalIndeterminate()}
onChange={this.onCheckTotalChange()}
checked={this.isTotalChecked()}
>
All
</Checkbox>
это работает для группового флажка
{permissible_objects &&
permissible_objects.slice(0, 3).map((label, index) => (
<label>{label}</label>
<Checkbox
indeterminate={this.isIndeterminate(label)}
onChange={this.onCheckAllChange(label)}
checked={this.isAllChecked(label)}
>
{label}
</Checkbox>
это работает для отдельного флажка
<CheckboxGroup
options={this.state.groupItems}
value={this.isChecked(label)}
onChange={this.onChange(label)}
/>
))}
Как я могу решить Не удается прочитать свойство 'includes' из неопределенного?