Реагирующий запрос с перехватами выдает ошибку «Неперехваченная ошибка: слишком много повторных рендерингов. React ограничивает количество рендеров, чтобы предотвратить бесконечный цикл «.

#javascript #reactjs #react-hooks #react-query

#javascript #reactjs #реагирующие перехваты #react-запрос

Вопрос:

Я работаю над проектом React JS, который использует React query, https://react-query.tanstack.com /, Реагирующие крючки и функциональные компоненты. Но он выдает ошибку, когда я использую запрос react для вызова API.

Это мой компонент и то, как я использую запрос в нем.

 const App = () => {
   const [ list, updateList ] = useState([])
   const info = useQuery(["item-list"], getList, {
    retry: false,
    refetchOnWindowFocus: false,
  })

  if (info.status == "success") {
     updateList(info.data)
  }
    return (
       //view components here
    )
}
  

Это моя логика вызова API getList

 export const getList= async () => {
  const { data } = await api.get("8143487a-3f2a-43ba-b9d4-63004c4e43ea");
  return data;
}
  

Когда я запускаю свой код, я получаю следующую ошибку:

react-dom.development.js:14815 Неперехваченная ошибка: слишком много повторных рендеров. React ограничивает количество рендеров, чтобы предотвратить бесконечный цикл.

Что не так с моим кодом?

Ответ №1:

Основная причина этой ошибки здесь в том, что вы запускаете этот блок кода в if инструкции в бесконечном цикле, как только у вас есть info.status === 'success' as true . Затем при каждом рендеринге updateList вызывается, который запускает другой рендеринг.

Вероятно, я бы использовал useEffect hook здесь, чтобы прослушивать изменения в info as:

 useEffect(() => {
  if (info.status == "success") {
     updateList(info.data)
  }
}, [info])
  

Вы должны удалить это if утверждение из тела <App /> компонента и использовать useEffect вместо него перехват, как было предложено выше. Делая это, это if утверждение будет проверяться один раз info при изменении, а не при каждом рендеринге.

Предлагаемое чтение использует перехват эффекта.

Комментарии:

1. Это идеальное решение. Спасибо