#reactjs #axios #react-hooks #infinite-loop #use-effect
#reactjs #axios #реагирует на крючки #бесконечный цикл #использование-эффект
Вопрос:
Привет, у меня проблема с бесконечными циклами. Все примеры, на которые я смотрю, заставляют цикл исчезнуть. Но тогда это не обновит мое представление, если я не обновлю. Я хочу, чтобы элементы появлялись при добавлении чего-либо. я думал, что мой пример сработает, но это не так. Я не знаю, как это исправить
const [ReadBookingTimes, SetBookingTimes] = useState([]);
const [readStatus, setStatus] = useState("");
const getBookingTimes = async () => {
try {
const response = await Axios.get(`${API_ENDPOINT}`);
console.log(response);
// debugger;
SetBookingTimes(response.data);
// setStatus("Connection sucsessfull");
} catch (err) {
setStatus("Error getting BookingTimes");
}
};
//reupdate State and prevent infinite loop
useEffect(() => {
getBookingTimes(ReadBookingTimes);
}, [ReadBookingTimes]); //);
Ответ №1:
У вас useEffect
есть зависимость ReadBookingTimes
, которая обновляется каждый раз. По сути, вы обновляете ReadBookingTimes
каждый раз снова и снова.
Что вам нужно сделать, так это добавить условие, чтобы проверить, загружены ли ваши данные, и если да, не вызывайте функцию:
const [ReadBookingTimes, SetBookingTimes] = useState([]);
const [readStatus, setStatus] = useState("");
const [dataLoaded, setDataLoaded] = useState(false);
const getBookingTimes = async () => {
// Your fetch code
setDataLoaded(true)
}
useEffect(() => {
// don't go any further of data is already loaded.
if (dataLoaded) return;
getBookingTimes(ReadBookingTimes);
}, [ReadBookingTimes, dataLoaded]);
Теперь вы не будете застревать в цикле. И в любое время, когда вы захотите перезагрузить данные, вы можете изменить значение dataLoaded
to false
и useEffect
снова вызвать getBookingTimes
функцию.
Например, если вы хотите получать данные каждые 2 минуты, вы можете добавить тайм-аут для изменения dataLoaded
состояния каждый раз, вызывая очередную перезагрузку данных.
Комментарии:
1. должны ли мои данные загружаться после данных ответа?
2. Я попробовал это, и это не обновляет мое представление при добавлении элементов. но он больше не зацикливается или, может быть, он не запускается сейчас, потому что я загружаю данные с помощью Postman? или это должно быть повторным?
3. Да, после загрузки вашего ответа. Что вы подразумеваете под добавлением элементов? Вы не добавляете никакого нового элемента.
4. Прямо сейчас я использую postman для добавления данных в список. но я создам функцию для добавления содержимого в список. я хочу, чтобы он автоматически отображался, чтобы я мог видеть элементы без обновления страницы.
5. Вы можете установить
dataLoaded
значение «назадfalse
» при добавлении нового элемента, и тогда вашаusEffect
функция будет запущена, а затем она снова загрузит данные, вызывая повторный рендеринг.