ОБНОВЛЕНИЕ: Да для варианта использования 1, если я извлекаю search.value вне useEffect и использую его как зависимость, он работает.
Но у меня есть обновленный вариант использования ниже
Вариант использования 2: я хочу передать объект searchHits серверу. Сервер, в свою очередь, возвращает его мне с обновленным значением в ответ. Если я попытаюсь использовать объект searchHits, я все равно получу бесконечный цикл
state: {
visible: true,
loading: false,
search: {
value: “”,
searchHits: {....},
highlight: false,
}
}
let val = search.value
let hits = search.searchHits
useEffect( () => {
axios.post(`/search=${state.search.value}`, {hits: hits}).then( resp => {
…do something or ..do nothing
state.setState( prevState => {
return {
…prevState,
search: {... prevState.search, hits: resp.hit}
}
})
})
}, [val, hits])
Вариант использования 1: я хочу найти строку, а затем выделить ее, когда получу результаты.
e.g.
state: {
visible: true,
loading: false,
search: {
value: “”,
highlight: false,
}
}
useEffect( () => {
axios.get(`/search=${state.search.value}`).then( resp => {
…do something or ..do nothing
state.setState( prevState => {
return {
…prevState,
search: {... prevState.search, highlight: true}
}
})
})
}, [state.search])
В useEffect я вызываю API с помощью search.value
. eslint жалуется, что есть зависимость от state.search
, он не распознает state.search.value
. Даже если вы сдадите state.search.value
, он жалуется на state.search
Теперь, если вы передадите state.search
в качестве зависимости, он перейдет в бесконечный цикл, потому что после вызова api мы обновляем флаг highlights
внутри поиска.
Это вызовет еще одно обновление состояния и рекурсивный цикл.
Один из способов избежать этого - не иметь вложенных объектов в состоянии или переместить флаг выделения за пределы поиска, но я пытаюсь не идти по этому маршруту, давая явные зависимости, которые у меня есть. Я бы предпочел, чтобы объект находился в состоянии, называемом поиском, каким он есть. Есть ли способ лучше подойти к этому. Если я хочу сохранить свой объект состояния, как указано выше, как мне справиться с бесконечным циклом