#reactjs
#reactjs
Вопрос:
Мне действительно нужна помощь в этом вопросе. Я пытался исследовать это в течение целого дня, но, похоже, у меня ничего не получается.
Итак, в основном у меня есть компонент, который должен отображать данные на основе заданных секунд в функции setInterval. Таким образом, секунды задержки будут динамическими в зависимости от того, что устанавливает пользователь (я называю это частотой обновления). Используя useEffect, я извлекаю указанную частоту обновления с помощью api, визуализирую api с помощью useEffect hook и сохраняю res.data в состояние
const [refreshRate, getRefreshRate] = useState(0);
useEffect(_ => {
axios
.get("/api/.../refreshRate")
.then(res => {
getRefreshRate(res.data)
})
.catch((err) => console.log(err));
},[])
Затем мне нужно установить, что частота обновления равна секундам задержки для функции setInterval, которая будет использоваться для продолжения рендеринга данных на основе частоты обновления, установленной пользователем.
const [refreshRate, getRefreshRate] = useState(0); // the refresh rate
const [data, getData] = useState([]); // The data that needs to re-render depending in the refreshRate State
useEffect(_ => {
axios
.get("/api/.../refreshRate")
.then(res => {
getRefreshRate(res.data)
})
.catch((err) => console.log(err));
},[])
useEffect(_ => {
const interval = setInterval(_ => {
axios
.get("/api/.../getData")
.then(res => {
getData(res.data)
})
.catch((err) => console.log(err));
},refreshRate)
return _ => {
clearInterval(interval)
}
},[])
Но в результате это приводит к бесконечному циклу в приложении. Я также пытался использовать Redux, с той же логикой я сохраняю частоту обновления в глобальном состоянии, пытался установить ее в секундах задержки функции setInterval, но все равно вызывает бесконечный цикл. Есть ли какой-нибудь способ исправить или улучшить это?
Комментарии:
1. Может быть, попробовать
setTimeout
вместоsetInterval
?2. Я не уверен, что это ваша проблема, но, похоже, вы инициализируете частоту обновления с 0, что означает, что каждые 0 секунд он будет отправлять запрос. попробуйте изменить его на 5 секунд и посмотрите, сохраняется ли проблема.
const [refreshRate, getRefreshRate] = useState(5000);
3. @ThomazCapra Будь ты проклят, твое право. Похоже, причина, по которой это выглядит как бесконечный цикл, заключается в том, что секунды задержки в setInterval установлены только на МИЛЛИСЕКУНДЫ. Пример: пользователь установил частоту обновления на 8 секунд. Когда я пытаюсь получить api для частоты обновления. Он устанавливает задержку на 8 МИЛЛИСЕКУНД, а не на 8000 МИЛЛИСЕКУНД. Спасибо, чувак. Это должно это исправить. Вы можете опубликовать свой ответ, чтобы другие могли его просмотреть, если они столкнутся с этой небольшой ошибкой..
4. @ThomazCapra Это не решит проблему, потому что, если OP установит начальное значение
refreshRate
to5000
,setInterval
оно будет выполняться каждые 5 секунд, но обновленное значениеrefreshRate
, которое извлекается в результате HTTP-запроса, не будет иметь никакого эффекта. Проблема здесь заключается в отсутствующей зависимостиuseEffect
hook, а не в начальном значенииrefreshRate
.