Я новичок в React, и я очень озадачен жизненным циклом функционального компонента. Допустим, у меня есть много входов типа: флажок, а, б, c и д. Их значения a, b, c и d.
const OnBoarding = () => {
const [isChecked, setIsChecked] = useState({
a: false,
b: false,
c: false,
d: false
});
const [allCheckedItems, setAllCheckedItems] = useState([]);
//Write function that pushes checked value to state array when clicked
const onChecked = e => {
setIsChecked({
...isChecked,
[e.target.value]: e.target.checked
});
const all = Object.keys(isChecked).filter(function(key){
return isChecked[key] === true;
});
console.log("all items that are TRUE : " + all);
setAllCheckedItems([all]);
console.log("allCheckedItems : " + allCheckedItems);
};
useEffect(() => {
console.log(isChecked);
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
У меня есть функциональный компонент с состоянием, типом которого является объект со многими свойствами, все логические, например:
const [isChecked, setIsChecked] = useState({
a: false,
b: false,
c: false,
d: false
})
У меня есть другое состояние, которое является массивом , назовем его allCheckedItems , который должен быть массивом всех ключей isChecked установлен в значение true.
const [allCheckedItems, setAllCheckedItems] = useState([]);
Если функция включена, при установленном флажке ее значение в объекте isChecked устанавливается равным true .
Я вызываю useEffect (), в котором я написал функцию фильтра для фильтрации всех свойств, которые являются истинными. Все свойства со значением true хранятся в массиве с именем "all" .
Моя проблема возникает, когда мне нужно обновить состояние массива allCheckedItems . Если я напишу в хуке useEffect:
setAllCheckedItems([all]);
, я получу бесконечное число l oop. Если я запишу его в своей функции onChecked , всякий раз, когда я нажимаю на флажок, состояние всех элементов CheckCheckedItems, которые я регистрирую в консоли, является ПОЗЖЕ на один щелчок. Например, я нажимаю, чтобы проверить «а», и он записывает:
[]
Затем я нажимаю «б», и он записывает:
[a]
Затем я нажимаю «c "и он регистрирует:
[a, b]
Мне бы хотелось, чтобы при установке флажка обновлялись оба состояния и чтобы allItemsChecked регистрировал все элементы, проверенные немедленно ... Может кто-нибудь объяснить мне такое поведение? Уже несколько дней у меня болит голова.