usestate似乎没有与插座io一起使用
我正在使用 socket.io 制作消息功能。 当我发送/接收消息时,我想更改 newMsgNO
的状态,但它似乎不起作用。 在下面的第二个 useEffect
中,第一个 console.log
始终显示 newMsgNO: 0
的初始状态,而第二个 console.log< /code> 每当它们进来时都会很好地显示
newMessages.current
的值。
这是我尝试的内容之一。在下面的 testMessage 中,我尝试更改状态,并使用新消息再次呈现组件。但newMsgNO
的状态也是0
。我不应该这样做,因为这只在我发送消息时才有效。我应该在 socket.on("new message", ...)
的代码中工作。
如何更改 socket.on("new message", ...)
中 newMsgNO
的状态?
...
const newMessages = useRef([
{
userImg: "",
userName: "",
talkContent: "",
talkTime: "",
isContinuous: false,
},
]);
const [newMsgNO, countNewMsg] = useState(0);
const testReceiveM = {
userImg: "",
userName: "ab",
talkContent: "hello my name is...",
talkTime: "22.03.04.12:22",
isContinuous: false,
};
const testMessage = () => {
socket.emit("send message", { roomId, msg: testReceiveM });
};
useEffect(() => {
socket.emit("join room", roomId);
}, []);
useEffect(() => {
socket.on("new message", (currentMsg: NewMessage) => {
if (newMessages.current.length === 1 && !newMessages.current[0].userName) {
newMessages.current = [currentMsg];
countNewMsg(newMsgNO + 1);
} else {
newMessages.current.push(currentMsg);
countNewMsg(newMsgNO + 1);
}
countNewMsg(newMsgNO + 1);
console.log("newMsgNO: ", newMsgNO);
console.log("newMessages.current: ", newMessages.current);
});
}, []);
return (
...
{newMsgNO > 0 &&
newMessages.current.map((_, idx) => (
<MessageRecord key={_.userName + idx.toString} message={_} />
))}
<button onClick={testMessage}>testMessage</button>
...
);
I'm making a message feature with socket.io.
When I send/receive a message, I want to change the state of newMsgNO
, but it doesn't seem to work.
In the second useEffect
below, first console.log
always show the initial state that newMsgNO: 0
, while second console.log
shows the value of newMessages.current
well whenever they come in.
This is one of what I tried to. In the testMessage
below I tried to change the state, and component was rendered again with new message. But the state of newMsgNO
was the 0
too. and I should not do like that because that works only when I sending the message. I should do work in the code of socket.on("new message", ...)
.
How can I change the state of newMsgNO
in socket.on("new message", ...)
?
...
const newMessages = useRef([
{
userImg: "",
userName: "",
talkContent: "",
talkTime: "",
isContinuous: false,
},
]);
const [newMsgNO, countNewMsg] = useState(0);
const testReceiveM = {
userImg: "",
userName: "ab",
talkContent: "hello my name is...",
talkTime: "22.03.04.12:22",
isContinuous: false,
};
const testMessage = () => {
socket.emit("send message", { roomId, msg: testReceiveM });
};
useEffect(() => {
socket.emit("join room", roomId);
}, []);
useEffect(() => {
socket.on("new message", (currentMsg: NewMessage) => {
if (newMessages.current.length === 1 && !newMessages.current[0].userName) {
newMessages.current = [currentMsg];
countNewMsg(newMsgNO + 1);
} else {
newMessages.current.push(currentMsg);
countNewMsg(newMsgNO + 1);
}
countNewMsg(newMsgNO + 1);
console.log("newMsgNO: ", newMsgNO);
console.log("newMessages.current: ", newMessages.current);
});
}, []);
return (
...
{newMsgNO > 0 &&
newMessages.current.map((_, idx) => (
<MessageRecord key={_.userName + idx.toString} message={_} />
))}
<button onClick={testMessage}>testMessage</button>
...
);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我明白了!多亏了前端开发的开放聊天室的“뚜아아아”。
countnewmsg(((prev)=&gt; prev + 1);
这就是与此有关的。由于异步逻辑,我以前的尝试无效。
因此,我像同步设计一样使其正常工作。
(prev)=&gt; prev + 1
和当
SetState
设置了多次,只有最后一个设置。因此,我在条件下删除了它们。因为它们是进行测试的,现在没有必要,因此不需要对此进行额外的工作。
我很高兴能解决这个问题。
晚安大家!
I got this! Thanks to "뚜아아아" from open chat room in frontend development.
countNewMsg((prev) => prev + 1);
this is all about this.Because of asynchronous logic, my previous try didn't work.
So I made it work like synchronous design.
(prev) => prev + 1
And when
setState
is set many times, only the last one works.So I deleted them on if condition. Because they were for test and now they are not necessary, it is not required to do additional work about it.
I'm so glad to solve this.
Goodnight everyone!