#javascript #reactjs #react-hooks #use-effect
#javascript #reactjs #реагирующие хуки #использовать-эффект
Вопрос:
Я создаю приложение для чата в React. Я использую useEffect-hook для обновления сообщений (все, что он действительно делает, это извлекает их с JSON-сервера). Я хочу, чтобы они обновлялись каждый раз, когда кто-то в комнате отправляет новое сообщение.
Это одна из альтернатив, которые у меня есть:
useEffect(() => {
fetch('http://localhost:8000/messages/')
.then(res => {
return res.json();
})
.then(data => {
data = data.filter((msg) => msg.room === room);
setData(data);
})
.catch(err => {
console.error(`Error: ${err}`);
})
divRef.current.scrollIntoView({ behavior: 'smooth' });
}, []);
«данные» — это список сообщений. Это показывает все сообщения при входе в комнату, но не загружается при передаче нового сообщения. Предположительно из-за пустого списка в конце. Поэтому я попробовал это:
В другом компоненте у меня есть переменная «отправлено», для которой устанавливается значение true каждый раз, когда вы отправляете сообщение, например:
const onSubmit = (e) => {
e.preventDefault();
const data = {author: user, body: msg, room }
setSent(true);
fetch(`http://localhost:8000/messages/`, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
})
.then(response => {
response.json();
setSent(false);
})
.catch(err => console.error(`Error: ${err}`));
setMsg('');
}
Таким образом, каждый раз, когда вы отправляете сообщение, ему присваивается значение «true», и как только оно было успешно отправлено, ему возвращается значение «false». Затем я передал его в качестве поддержки компоненту, который я использую useEffect:
<div className='chat-main'>
<Messages user={user} room={room} sent={sent} />
</div>
Затем я помещаю «отправленную» переменную в список внизу useEffect-hook. Это обновляет сообщения для пользователя, который отправляет сообщение, но не для других (потому что, конечно, «отправлено» изменяется только при отправке сообщения)
Что я могу здесь сделать? Есть ли способ?
Комментарии:
1. вероятно, вы ищете способ для вашего сервера сообщить вашему клиенту о каком-либо действии или предоставить обновление. Для этого подходят веб- сокеты , а также веб-хуки. Внизу связанной страницы есть список опций.
2. Вы также можете изучить возможность использования AWS Amplify, чтобы довольно быстро настроить это с помощью AWS. Джентльмен по имени Надер Дабит проделывает серьезную хорошую работу над примерами вокруг этого.
3. Нет ли способа сделать это без websockets? В настоящее время я использую простой JSON-сервер для сохранения сообщений
4. Какой сервер вы используете? это ваш собственный или что-то вроде firebase?
5. «Сервер» не является надлежащим сервером. Это JSON-сервер / база данных npx, которая содержит сообщения, которые вы отправляете в каждой комнате.