#javascript #reactjs
#javascript #reactjs
Вопрос:
Я делаю запрос GET к своей базе данных, и данные поступают и отображаются, но в тот момент, когда данные обновляются в моей базе данных, они не обновляются в компоненте, который использует эти данные.
Редактировать на основе комментариев, которые мне нужны для непрерывного запроса GET, поэтому я обновил вопрос.
Используйте эффект () для установки данных в состояние
// Data for each of the tags
const [tag1, setTag1] = useState();
const [tag2, setTag2] = useState();
const [tag3, setTag3] = useState();
useEffect(() => {
axios
.get(URL)
.then(res => {
const data = res.data;
// Passing in the setter method
setTagDetails(data, setTag1, setTag2, setTag3);
})
.catch(error => {
console.log(error);
});
}, []);
setTagDetails(), где поступающие данные разделяются на разные состояния, которые будут использоваться в компоненте:
// Splitting the data by each corresponding tag and adding them to their respective state
export const setTagDetails = (data, setTag1, setTag2, setTag3) => {
const arr1 = [];
const arr2 = [];
const arr3 = [];
try {
data amp;amp;
data.forEach(d => {
// Entries into the database which do not have any tag information
// have a size of 5 and those with all the details have a size of 6
const sizeOfObject = Object.keys(d).length;
// Only need database items with all the details
if (sizeOfObject > 5) {
// Split the data for the tags into their respective name
const name = d["tags"]["L"][0]["M"]["name"]["S"];
// Will be used to set individual datasets for each tag
if (name === "Tag1") {
cleanTag(d, arr1);
}
if (name === "Tag2") {
cleanTag(d, arr2);
}
if (name === "Tag3") {
cleanTag(d, arr3);
}
}
});
setTag1(arr1);
setTag2(arr2);
setTag3(arr3);
} catch (err) {
console.log(err);
}
};
Комментарии:
1. это поведение restful services, для захвата последних транзакций в серверной части необходимо отправлять http-запрос по запросу, чтобы получить обновленный ответ.
2. Я вижу, поэтому мне пришлось бы отправлять запрос GET, скажем, каждые 1-2 секунды, чтобы обновлять данные?
3. Вы можете рассмотреть возможность работы с SSE (события, отправленные сервером), чтобы уведомлять клиента об обновлениях сервера developer.mozilla.org/en-US/docs/Web/API/Server-sent_events /…
4. Я посмотрю на это. Мои данные поступают от датчиков, поэтому мне нужно, чтобы данные обновлялись всякий раз, когда новые данные отправляются в базу данных.
5. да, есть много опций, события, отправляемые сервером, длинный опрос websockets для загрузки нового контента в режиме реального времени
Ответ №1:
Когда вы хотите выполнять функцию каждые x промежутков времени, мы используем метод setInterval . Он будет вызывать переданную функцию (в качестве первого аргумента) каждые x миллисекунд (где x — второй аргумент, в приведенном ниже случае, 1000 мс или 1 секунда).
useEffect(() => {
const interval = setInterval(() => {
axios
.get(URL)
.then(res => {
const data = res.data;
// Passing in the setter method
setTagDetails(data, setTag1, setTag2, setTag3);
})
.catch(error => {
console.log(error);
});
}, 1000);
return () => clearInterval(interval);
}, []);
Пожалуйста, обратите внимание, что лучше всего помнить о подключениях пользователя к Интернету в случае медленной мобильной сети или политики провайдера с ограниченной пропускной способностью. Существует также опасность выполнения запросов так близко друг к другу, что мы вводим условие гонки. Наконец, вы ДОЛЖНЫ очистить интервал, иначе вы значительно снизите производительность вашего приложения.
Комментарии:
1. Если я передаю элементы из
setTag
дочерних компонентов, должен ли я также очищать их там или просто в useEffect()?2. Не уверен, что понимаю ваш вопрос… очистить интервал?
3. Извините, да, я имел в виду очистить интервал. Должен ли я делать это только в useEffect()?
4. Да, поскольку интервал ограничен хуком useEffect.
5. я не буду рекомендовать этот подход, это перегружает ваш сервер api, вы заметите это, когда будете масштабировать количество пользователей в своем приложении.