Вы не должны хранить state.main
, чтобы определить, установлен ли каждый флажок.
Вы уже сохраняете состояние, которое определяет, установлены ли все флажки, потому что все флажки должны быть проверены, если каждый объект в state.data
имеет checked: true
.
Вы можете просто сделать основной флажок следующим образом:
<input
type="checkbox"
name="main"
checked={this.state.data.every(v => v.checked)}
onChange={this.onMainCheckBoxChange}
/>;
Строка this.state.data.every(v => v.checked)
вернет true
, если установлены все флажки.
И когда основной флажок установлен, функция может выглядеть следующим образом:
onMainCheckBoxChange = () => {
this.setState(prev => {
// If all are checked, then we want to uncheck all checkboxes
if (this.state.data.every(v => v.checked)) {
return {
data: prev.data.map(v => ({ ...v, checked: false })),
};
}
// Else some checkboxes must be unchecked, so we check them all
return {
data: prev.data.map(v => ({ ...v, checked: true })),
};
});
};
Хорошей практикой является сохранение только того состояния, которое НУЖНО сохранить. Любое состояние, которое можно вычислить из другого состояния (например, «все ли флажки отмечены?»), Должно вычисляться внутри функции render
. Смотрите здесь , где написано:
Что не должно Go в штате? ... Вычисленные данные: не беспокойтесь о предварительных вычислениях значений, основанных на состоянии - легче обеспечить согласованность вашего пользовательского интерфейса, если вы выполняете все вычисления в render (). Например, если у вас есть массив элементов списка в состоянии и вы хотите отобразить счетчик в виде строки, просто отобразите this.state.listItems.length + 'list items' в вашем методе render (), а не храните его в состоянии .