Когда изменяются зависимости useEffect
ловушки, функция эффекта useEffect
ловушки вызывается только после цикла рендеринга ( подробнее обсуждается здесь ). Это часто создает ситуации, когда пользовательский интерфейс становится непоследовательным из-за несогласованности в компонентной модели.
Вот простой пример, где useEffect
используется для запуска вычисления resultValue
на основе значения inputValue
:
function App() {
const [inputValue, incrementInputValue] = useReducer((s, _) => s + 1, 0);
const [resultValue, setResultValue] = useState(0);
useEffect(() => {
// It could be an asynchronous call to business logic etc.
setResultValue(inputValue * 2);
}, [inputValue]);
console.log("Render: %d * 2 = %d", inputValue, resultValue);
return (
<div className="App">
<p>{inputValue} * 2 = {resultValue}</p>
<button onClick={() => { console.log('Click'); incrementInputValue(undefined); }}>
Increment
</button>
</div>
);
}
Этот код возвращает следующий журнал:
Render: 0 * 2 = 0
Click
Render: 1 * 2 = 0 // inputValue was updated, but useEffect not called yet
Render: 1 * 2 = 2
Click
Render: 2 * 2 = 2 // inputValue was updated, but useEffect not called yet
Render: 2 * 2 = 4
Код Песочница
Каков наилучший подход, чтобы избежать таких несоответствий, вызванных отложенным вызовомиспользованияEffect?