#reactjs #axios
#reactjs #axios
Вопрос:
Я пытаюсь создать панель мониторинга данных covid-19 в реальном времени с помощью React. Данные поступают из desease.sh api и глобальные показатели регулярно меняются, поэтому я отправляю новый запрос в конечную точку api, чтобы получить новые данные с помощью setInterval через минуту. Но когда происходит этот новый запрос, данные в моем приложении не меняются.
Ниже приведен мой код для api disease. Который работает не так, как ожидалось
function CoolTest() {
const [data, setData] = useState([]);
const getData = async () => {
try {
const data = await axios.get("https://disease.sh/v3/covid-19/all");
setData(data.data);
} catch (e) {
console.log(e)
}
};
useEffect(() => {
getData();
setInterval(()=>{
getData();
setData(data => data)
}, 120000)
}, []);
console.log(data.todayCases)
return (
<Container style={{marginTop:'15px'}}>
<h3>New Cases</h3>
<p className="text-muted"> {data.todayCases}</p>
<hr />
</Container>
)
}
Затем, используя тот же код, я попытался сделать запрос к api шуток Чака Норриса, который работает. Шутка меняется после каждого нового запроса.
function CoolTest() {
const [jokes, setJokes] = useState([]);
const getJokesData = async () => {
try {
const data = await axios.get("https://api.chucknorris.io/jokes/random");
setJokes(data.data);
} catch (e) {
console.log(e)
}
};
useEffect(() => {
getJokesData();
setInterval(()=>{
getJokesData();
setJokes(jokes => jokes)
}, 120000)
}, []);
console.log(jokes.value)
return (
<Container style={{marginTop:'15px'}}>
<h3>Chuck Norris Jokes</h3>
<p className="text-muted"> {jokes.value}</p>
<hr />
</Container>
)
}
Чего мне не хватает?
Скриншот Concole. введите описание изображения здесь
Комментарии:
1. Есть ли какие-либо ошибки в консоли? Возможно, вы получаете ограниченную скорость
2. Смотрите консоль, есть ошибка, если она опубликована
3. Я прикрепил скриншот консоли выше. там же, где я регистрирую вывод из API, не определено.
4. почему вы делаете
setJokes(jokes => jokes)
? вы устанавливаете функцию вместо значений данных5. @dev-cc Я предположил, потому что я уже установил значения для шуток в функции getJokesData(); setJokes(шутки => шутки) просто заменяет старые значения шуток новыми значениями, полученными после setInterval . По крайней мере, это то, что сказал учебник, который я просмотрел.
Ответ №1:
Данные не меняются, потому что новые данные совпадают с предыдущими.
вы можете изменить:
const data = await axios.get("https://disease.sh/v3/covid-19/all");
setData(data.data);
Для
const data = await axios.get("https://disease.sh/v3/covid-19/all");
setData({ todayCases: Math.random() });
чтобы увидеть, что представление меняется.
в вашем втором коде имя api api.chucknorris.io/jokes/random
и каждый раз выдает вам случайное число, которое не равно предыдущему.
вы можете увидеть результаты этой песочницы
а также изменить:
setInterval(()=>{
getJokesData();
}, 120000)
Для:
setInterval(()=>{
getJokesData();
setJokes(jokes => jokes)
}, 120000)```
Комментарии:
1. Для первого, когда я изменил setData({ todayCases: Math.random() }); Я успешно получаю случайное число. После интервала
2. второе работало, потому что вы получаете случайные данные. если вы проверите devtool / network, вы увидите, что в data.todayCases изменений нет (в первом коде)
3. это проблема, которую я пытаюсь решить. Потому что данные меняются в api. Я могу это сделать, когда вручную проверяю конечную точку API болезни. Я наблюдал это в течение 30 минут при слишком открытых вкладках. Один из них с запущенным моим приложением и консольной регистрацией значения todayCase, которое остается неизменным, и все же, когда я случайным образом обновил вкладку с конечной точкой open api, значение для todayCase изменилось. Что может быть причиной того, что мое приложение не получает новые значения даже при изменении данных в api