Интересно, лучше ли использовать useEffect? Особенно, когда вызов setTimeout внутри useEffect будет вызывать бесконечное l oop, так как каждый раз, когда мы вызываем setOpenDoor, приложение рендерится, а затем useEffect вызывается снова, вызывая setTimeOut, которая будет вызывать функцию setOpenDoor ... Графически:
setTimeout -> setOpenDoor -> useEffect -> setTimeout -> ... hell
Конечно, вы можете использовать оператор if, который используетEeffect так же, как предложил @ksav, но это не выполняет sh одно требование @Kayote:
Я не знаю текущий значение состояния (может быть истинным / ложным)
Вот решение, которое работает без useEffect и выполняет sh указанное выше требование:
Код работает в codesandbox
Здесь вы увидите важность этого фрагмента кода:
const toggleOpenDoor = () => {
setOpenDoor(!openDoor);
setTimeout(() => setOpenDoor(openDoor => !openDoor), 500);
};
Поскольку мы используем setTimeout, нам нужно передать обратный вызов в setOpenDoor вместо обновленного состояния. Это потому, что мы хотим отправить «текущее» состояние. Если вместо этого мы отправили новое состояние, то к тому времени, когда setTimeOut обработает это состояние, оно изменится (потому что мы сделали это до того, как setTimeOut выполнит свой обратный вызов с setOpenDoor (! OpenDoor);), и никаких изменений не будет.