Итак, у меня следующая ситуация при использовании useEffect
, который вызывает функции, зависящие от состояния.
Пример:
// INSIDE APP COMPONENT
const [someState, setSomeState] = React.useState(0);
const [someTrigger, setSomeTrigger] = React.useState(false);
function someFunction() {
return someState + 1;
}
React.useEffect(() => {
const newState = someFunction(); // 'someFunction' IS BEING CALLED HERE
setSomeState(newState);
},[someTrigger])
Вопросы:
В этом случае я должен объявить someFunction
внутри useEffect()
или безопасно хранить его снаружи (но внутри тела компонента)?
Я мог бы добавить его в массив dependency
, но это повредит возможности восстановления моего кода, поскольку я хочу сосредоточиться на trigger
.
Поскольку useEffect()
будет запускаться после нового рендеринга, безопасно ли предполагать, что в нем будут свежие копии функций, которые я вызываю?
Существует ли основное правило, когда вы должны объявлять функции внутри хука useEffect
или когда обязательно добавлять его в массив зависимостей?
РЕДАКТИРОВАТЬ: Обратите внимание, что необходимо, чтобы useEffect
имел свежие копии этих функций, так как эти функции должны получить доступ к некоторой свежей современной переменной state
.
ПРИМЕЧАНИЕ:
Этот код вызывает следующее предупреждение об ошибке на CodeSandbox. Хотя работает просто отлично.
React Hook React.useEffect отсутствует зависимость: 'someFunction'. Либо включите его, либо удалите массив зависимостей. (Реагирующие крючки / исчерпывающий-Deps) eslint
Сценарий реального случая:
Это упрощенный пример. В моем случае это страница поиска товара с фильтрами компонентов. Поэтому, когда я нажимаю на фильтр, чтобы активировать его (скажем, price <= 50
), я запускаю useEffect()
, который «слушает» переменную состояния activePriceFilters
. Затем этот эффект вызывает функцию (someFunction
в примере), которая вычислит filteredList
и установит новое состояние productList
с новым filteredList
.
SNIPPET