reactjs - 每当我从 Socket.io 接收数据并将其添加到我的反应状态时,状态就会被清除
问题描述
const CONNECTION_PORT = "http://localhost:3001/";
const [msg,setmsg] = useState([])
useEffect(() => {
// make new room
// Socket connection
socket = io(CONNECTION_PORT);
console.log("running");
if (isAuthenticated) {
console.log("now actually running");
let { name, sub } = user
roomid = uuid()
console.log("here" + roomid);
console.log("making room");
socket.emit('join-room', {
roomid,
name,
sub
});
}
// Notify when person creates new room and add it to state called rooms
socket.on('newroomadded', (data) => {
setrooms(rooms.concat(data));
console.log(rooms);
})
socket.on('room-created', (data) => {
console.log(data);
if (!rooms.includes(data)) {
console.log(data);
console.log("does not exist");
setrooms(rooms.concat(data))
}
else {
console.log("exists");
}
})
socket.on('message', (data) => {
console.log(data);
console.log(msg);
setmsg(msg.concat(data))
})
return () => {
socket.off('message')
socket.off('room-created')
socket.off('newroomadded')
}
}, [])
useEffect(() => {
console.log(messages);
}, [messages])
所以每当我调用setmsg(msg.concat(data))
新数据作为数组的第一个元素添加并且前一个元素消失并且消息的 useEffect 钩子在每次渲染后也显示空数组
我也应该得到以前的数组元素,然后将它与新数据连接起来,但是每当我收到新消息时 msg 变量就是空的
解决方案
推荐阅读
- c# - 无法识别的配置部分 userSettings 但调试工作正常
- r - 具有逐项更改的数据形状
- javascript - 在 forEach 循环中被覆盖的对象值
- html - 在 Android 和 iOS 上自动播放背景视频
- angular - 什么是 Angular 中的编译上下文?
- python - 当我尝试导入包时使用 pip 安装包它显示一些错误 ImportError no module names "package name"
- sql - SQL:如何在单个 isnull 场景的列中创建 2 个单独的值?
- winforms - 如何在没有自定义控件或单独字段的情况下获取 TrackBar 的旧值?
- apache-flink - Apache Flink:如何使用 Table API 对每 n 行进行分组?
- android - 如何在嵌套的 android 片段上应用 MVP?