Добавление массива в массив зависимостей useEffect вызывает бесконечный цикл

Простое приложение, в котором перечислены мои задачи и которое позволяет мне отправлять новые. Подключен к REST API, который я создал, поэтому задачи извлекаются с помощью вызова этого API. Я использую useEffect, чтобы получить все задачи и сохранить их в массиве задач. Это должно выполняться каждый раз при изменении массива (когда я добавляю новую задачу, удаляю задачу и т. д.), поэтому мне не нужно обновляться, чтобы увидеть изменения.

код использования эффекта:

   const [tasks, setTasks] = useState([])
   useEffect(() => { 
        axios.get("http://localhost:8000/api/task-list")
        .then(response => {
            setTasks(response.data)
        })
        .catch(error => {
            console.info(error)
        })
        
    }, [tasks])

Проблема сейчас в том, что почти бесконечные вызовы к моему API. Работает бесконечно и не только при изменении массива задач. Я думаю, это как-то связано с проверкой tasks === tasks и тем, что они не такие, какими кажутся. Но я не уверен.

Я был бы очень признателен за любую помощь, потому что я не могу просто продолжать в том же духе, делая бесконечные вызовы API. Это работает только сейчас, потому что API принадлежит мне.

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

Ответы 2

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

если у вас есть tasks в массиве зависимостей, то эффект вызывается при каждом изменении tasks.

Поскольку вы обновляете задачи внутри эффекта, он снова вызывает тот же эффект. и так далее.

Вам нужно иметь пустой массив в качестве зависимостей, если вы хотите запустить его только один раз, и если он зависит от какого-либо состояния, добавьте это.

какова цель наличия [tasks] в качестве зависимости?

Поскольку вы можете изменять tasks только с помощью setTasks, нет смысла использовать его как зависимость. обычно у вас будет какое-то другое изменение состояния (например, нажатие кнопки), которое должно обновить задачи.

загляните в документы для поведения useEffect

мой Бог. Да, я знал об этом поведении, но я не мог оставить массив зависимостей пустым, потому что думал, что это единственный способ вернуть свои задачи. Но черт возьми, я тупой, как ты сказал, я могу запускать setTasks после нажатия кнопки, а не только внутри useEffect. Мои извинения

Saif eldeen Adel 26.12.2020 09:20

Это цикл: ваш эффект запускается каждый раз при изменении tasks. Сам эффект изменяет массив tasks, поэтому он запускается снова и т. д.

Вы должны запустить его только один раз, когда компонент монтируется, и вы можете добиться этого с помощью пустого массива зависимостей:

useEffect(() => { 
        axios.get("http://localhost:8000/api/task-list")
        .then(response => {
            setTasks(response.data)
        })
        ...
        
    }, [])

Затем вам нужно создать обратные вызовы функций для событий, которые удаляют/добавляют элементы в ваш список. Например:

const addTask = () => {
  const newTask = ... // the value of your new task, eg. got from an input, ...
  setTasks(prevTasks => prevTasks.push(newTask));
};
...
<Button onClick = {addTask}> Add it! </Button>

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