Я хочу сделать это
useEffect(() => {
if (!datasetsState.list.length) {
dispatch({ type: DatasetsActionTypes.FETCH, payload: {} });
}
}, [datasetsState, dispatch]);
, но dispatch({ type: DatasetsActionTypes.FETCH, payload: {} });
вызывает обновление datasetsState
, что приведет к бесконечному циклу, если datasetsState.list
останется пустым после ответа
Одно из решениймоя проблема состоит в том, чтобы удалить datasetsState
из массива зависимостей, но я получу предупреждение exhaustive-deps
, которого я хочу избежать.
И следующий код также будет работать для меня и не вызывает никакихпредупреждения. Но это уродливое и сложное решение для довольно распространенной проблемы, я думаю.
const [isDoneOnce, setIsDoneOnce] = useState(false);
useEffect(() => {
if (isDoneOnce) {
return;
}
if (!datasetsState.list.length) {
dispatch({ type: DatasetsActionTypes.FETCH, payload: {} });
}
setIsDoneOnce(true);
}, [datasetsState, dispatch]);
Как я могу предотвратить обновление useEffect
без использования дополнительных переменных, таких как isDoneOnce
?