我在 React/NEXTjs 中的 useState 没有附加来自服务器的 socket.io 事件的结果,只是覆盖它
My useState in React/NEXTjs is not appending the result from a socket.io event from the server, just overwriting it
使用的框架:Next.js、Socket.io、React
我正在制作一个简单的消息传递应用程序。我基本上只是发出某人键入的消息,将该消息发送到服务器,然后通过名为“接收聊天消息”的事件“广播”回来。我遇到的问题是,当在前端使用“receive-chat-message”处理响应时,[messages] 状态没有附加要显示的新消息,它只是覆盖状态。
我的目标是向服务器发送消息;服务器然后将消息发送回客户端。然后,我将从服务器发送的客户端上的新消息附加到客户端上的 [messages] 状态,然后呈现 [messages] 的状态。问题是它只是覆盖 [messages] 状态,而不是向其附加新消息。
向服务器发送消息的代码
const [message, setMessage] = useState("");
const handleChange = (e) => {
setMessage(e.target.value);
};
const submitMessage = async () => {
// socket.io
const socket = io();
socket.emit("send-chat-message", message, user);
setMessage("");
};
前端代码
const [messages, setMessages] = useState([]);
useEffect(() => {
const socket = io();
socket.on("receive-chat-message", handleSetMessage);
return () => socket.disconnect();
}, []);
const handleSetMessage = (data) => {
/* data prop is the new message - it has a {message: "message", user: "name"}
sent from server.
THIS IS THE PROBLEM IN THE CODE WHERE IT DOESN'T APPEND
NEW MESSAGES TO THE [messages] STATE, IT JUST OVERWRITES
THE CURRENT STATE WITH THE NEW MESSAGE. */
setMessages([...messages, data]);
};
后端代码
export default async function handler(req, res) {
if (!res.socket.server.io) {
const io = new Server(res.socket.server);
res.socket.server.io = io;
io.on("connection", async (socket) => {
socket.on("send-chat-message", async (message, user) => {
socket.broadcast.emit("recieve-chat-message",
{
message,
name: user && user.name,
});
});
});
}
}
我通过以下功能方法设置消息解决了这个问题:
setMessages((messages) => [...messages, data]);
而不是:
setMessages([...messages, data])
我认为我们需要这个,因为我正在从 socket.io 侦听器中调用的函数更新状态,并且从未真正获取以前的状态;所以我不得不将它定向到以前的状态,然后合并这些值。
使用的框架:Next.js、Socket.io、React
我正在制作一个简单的消息传递应用程序。我基本上只是发出某人键入的消息,将该消息发送到服务器,然后通过名为“接收聊天消息”的事件“广播”回来。我遇到的问题是,当在前端使用“receive-chat-message”处理响应时,[messages] 状态没有附加要显示的新消息,它只是覆盖状态。
我的目标是向服务器发送消息;服务器然后将消息发送回客户端。然后,我将从服务器发送的客户端上的新消息附加到客户端上的 [messages] 状态,然后呈现 [messages] 的状态。问题是它只是覆盖 [messages] 状态,而不是向其附加新消息。
向服务器发送消息的代码
const [message, setMessage] = useState("");
const handleChange = (e) => {
setMessage(e.target.value);
};
const submitMessage = async () => {
// socket.io
const socket = io();
socket.emit("send-chat-message", message, user);
setMessage("");
};
前端代码
const [messages, setMessages] = useState([]);
useEffect(() => {
const socket = io();
socket.on("receive-chat-message", handleSetMessage);
return () => socket.disconnect();
}, []);
const handleSetMessage = (data) => {
/* data prop is the new message - it has a {message: "message", user: "name"}
sent from server.
THIS IS THE PROBLEM IN THE CODE WHERE IT DOESN'T APPEND
NEW MESSAGES TO THE [messages] STATE, IT JUST OVERWRITES
THE CURRENT STATE WITH THE NEW MESSAGE. */
setMessages([...messages, data]);
};
后端代码
export default async function handler(req, res) {
if (!res.socket.server.io) {
const io = new Server(res.socket.server);
res.socket.server.io = io;
io.on("connection", async (socket) => {
socket.on("send-chat-message", async (message, user) => {
socket.broadcast.emit("recieve-chat-message",
{
message,
name: user && user.name,
});
});
});
}
}
我通过以下功能方法设置消息解决了这个问题:
setMessages((messages) => [...messages, data]);
而不是:
setMessages([...messages, data])
我认为我们需要这个,因为我正在从 socket.io 侦听器中调用的函数更新状态,并且从未真正获取以前的状态;所以我不得不将它定向到以前的状态,然后合并这些值。