我正在使用React和socket构建实时聊天应用程序,以掌握基础知识。每当用户发送一条消息时,所有其他用户都会收到相同的消息两次。
我使用react-router来提供加入“页面”和聊天“页面”。
在聊天页面中,消息是在用户之间呈现的。我正在使用
每次发送消息时,接收方会运行两次控制台日志。
据我所知,这个钩子允许我们定义一些代码,每当DOM发生变化时都会运行,因此我不确定这个变化为什么会发生两次?
我也不确定为什么
我使用react-router来提供加入“页面”和聊天“页面”。
function App() {
return (
<div className="App">
<Router>
<Routes>
<Route path="/" element={<Join />} />
<Route path="/chat/:name" element={<Chat />} />
</Routes>
</Router>
</div>
);
}
在聊天页面中,消息是在用户之间呈现的。我正在使用
useEffect
hook,但我仍然难以完全理解它。function Chat () {
const [messages, addMessage] = useState([{
username: "chatbot",
time: new Date(),
message: "Welcome to the chatroom "
}]);
const location = useLocation();
const [currentUser, updateUser] = useState(() => {
const user = location.pathname.split('/chat/')[1];
socket.emit("join_chat", {
username: user
})
return user;
});
useEffect(() => {
socket.on("receive_message", (data) => {
console.log('received message');
addMessage(prevMessages => {
return [...prevMessages, {
username: data.username,
time: new Date(),
message: data.message
}]
})
})
}, [socket])
const sendMessage = (e) => {
e.preventDefault();
socket.emit("send_message", {
message: currentMessage,
username: currentUser,
});
每次发送消息时,接收方会运行两次控制台日志。
据我所知,这个钩子允许我们定义一些代码,每当DOM发生变化时都会运行,因此我不确定这个变化为什么会发生两次?
我也不确定为什么
socket.on
应该首先位于useEffect
中。如果useEffect
仅在重新渲染后立即调用,那么它如何通过套接字仍然接收到每条消息?