#reactjs #react-hooks
#reactjs #реагирующие крючки
Вопрос:
Я использую useEffect
hook для выполнения некоторых побочных эффектов после обновления состояния. И это отлично работает, всякий раз, когда вызывается дочерний компонент setOptions
, useEffect
также срабатывает.
Я пытаюсь выяснить, есть ли способ различать, кто обновил параметры, и на основе этого выполнять дополнительную работу? Точнее, я хотел бы вызвать другую функцию useEffect
только в том случае, если зависимость была обновлена конкретным компонентом. Вот упрощенный пример того, что я пытаюсь сделать:
function App() {
const [value, setValue] = useState({});
const [options, setOptions] = useState([]);
useEffect(() => {
const newValues = await getNewValues();
setValue(newValues);
// If options have been changed from ChildComponentA
// Then doSomething() else nothing
}, [options]);
function doSomething() {}
return(
<>
<ChildComponentA handleChange={setOptions} />
<ChildComponentB handleChange={setOptions} />
</>
)
}
Пример может показаться странным, это всего лишь пример проблемы, с которой я столкнулся. Основная проблема заключается в том, что состояние может быть изменено несколькими событиями, и я не могу сказать, какое событие вызвало изменение состояния.
Ответ №1:
Может быть, вы могли бы попробовать добавить дополнительный параметр к вашей options
переменной, который сообщал бы вам, откуда было вызвано изменение, т.Е. options.child = 'A'
сообщал бы вам, что оно пришло из A, и вы могли бы проверить это в useEffect с условием as if (options.child == 'A')
, это, конечно, потребовало options
бы быть объектом, а не массивом и что в рамках handleChange
обратного вызова вы делаете что-то вроде.
<ChildComponentA handleChange={(value) => {value.child ='A'; setOptions(value);}} />
Углубляясь и в качестве личной рекомендации, ваше приложение не должно стремиться работать по-разному с одним и тем же состоянием, если оно изменяется в том или ином месте, поскольку одна из основных целей состояния — быть универсальным источником истины в вашем компоненте, и что каждый использующий его подкомпонент рассматривает его как такой.