Как избежать бесконечного цикла с помощью useEffect

Когда я пытаюсь использовать useEffect для получения обновленных данных только при обновлении данных, я получаю бесконечный цикл, потому что после каждой выборки массив данных в массиве зависимостей теряет ссылку. Есть ли способ заставить useEffect вызывать метод выборки только при изменении данных?

useEffect(() => { fetchFunc(); }, [data]);

Когда меняют data? А точнее: fetchFunc() ставит data?

hellogoodnight 30.03.2021 10:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изменение данных => огонь useEffect -> fetchData () -> изменяет данные -> изменение данных -> огонь useEffect -> fetchData () -> бесконечный цикл

не уверен, чего вы пытаетесь достичь, но предполагаю, что вы хотите получить данные с сервера для изменения данных. Данные в любом случае не связаны с вашим сервером, поэтому, когда на сервере происходит обновление, данные не изменяются. вам необходимо получить с сервера, чтобы обновить данные.

у вас есть два варианта

Опрос

Самый простой в реализации. Создайте функцию, которая будет опрашивать сервер с заданным интервалом на предмет любых изменений, которые затем изменят ваши данные клиента с результатами.

const fetchTimeoutRef = useRef(); //fetchTimeoutRef.current will hold a value you can use to cancel the polling if required.
const pollInterval = 5000; //5000ms poll interval, 5 seconds

useEffect() => {
 fetchTimeoutRef.current = setTimeout(() => {
   fetchData(); //this will modify data with the results from the API
 },5000);
 return (() => {
     clearTimeout(fetchTimeoutRef.current); //ensure you clean up
 });
},[])

Веб-сокеты

веб-сокеты может использоваться для обновления клиента данными в «реальном времени» или на основе событий. реализация будет зависеть от вашего технического стека.

Другие вопросы по теме

Похожие вопросы