Reactjs useState未使用socket.io正确更新

Reactjs useState未使用socket.io正确更新,reactjs,websocket,socket.io,react-hooks,state,Reactjs,Websocket,Socket.io,React Hooks,State,我正在通过socket.io提取数据,但在侦听来自服务器的传入消息时,我的状态没有正确更新 我可以看到数据正确地从套接字中提取(50 reqs对等秒),但是setQuotes只是用从服务器返回的新项替换现有项(因此我的状态的长度始终为1) 订阅//打开web套接字流您可以在这里使用concat函数 setQuotes(prevState=>prevState.concat(msg))您可以在这里使用concat函数 setQuotes(prevState=>prevState.concat(ms

我正在通过socket.io提取数据,但在侦听来自服务器的传入消息时,我的状态没有正确更新

我可以看到数据正确地从套接字中提取(50 reqs对等秒),但是
setQuotes
只是用从服务器返回的新项替换现有项(因此我的状态的长度始终为1)


订阅//打开web套接字流

您可以在这里使用concat函数

setQuotes(prevState=>prevState.concat(msg))
您可以在这里使用concat函数

setQuotes(prevState=>prevState.concat(msg))
在您的示例中,您使用的setState如下所示

setQuotes([...quotes, msg])
每次您收到消息时,javascript引擎都会尝试在该函数的作用域中查找“quotes”变量

function (msg) {
它无法在此处找到它,并移动到定义此函数的范围(组件函数的范围)

对于每个函数调用,都有新的作用域。和react为每个渲染调用组件函数。所以,在参数中使用“msg”的函数,在参数中使用setQuotes,每次从第一次渲染开始使用“quotes”状态

在第一次渲染中,有一个空数组

然后就有了
[…firstEmptyArray,firstMessage]

然后您就有了
[…第一个空数组,第二个消息]

然后您就有了
[…第一个空数组,第三个消息]。

如果使用setQuotes,您可能会修复它,如

setQuotes(oldQuotes => [...oldQuotes, msg]);
通过这种方式,它将使用previousValue计算新值


请注意,不要在每次渲染中直接调用subscribe函数,并使用正确的依赖项数组作为第二个参数使其生效。

在您的示例中,您使用的setState如下所示

setQuotes([...quotes, msg])
每次您收到消息时,javascript引擎都会尝试在该函数的作用域中查找“quotes”变量

function (msg) {
它无法在此处找到它,并移动到定义此函数的范围(组件函数的范围)

对于每个函数调用,都有新的作用域。和react为每个渲染调用组件函数。所以,在参数中使用“msg”的函数,在参数中使用setQuotes,每次从第一次渲染开始使用“quotes”状态

在第一次渲染中,有一个空数组

然后就有了
[…firstEmptyArray,firstMessage]

然后您就有了
[…第一个空数组,第二个消息]

然后您就有了
[…第一个空数组,第三个消息]。

如果使用setQuotes,您可能会修复它,如

setQuotes(oldQuotes => [...oldQuotes, msg]);
通过这种方式,它将使用previousValue计算新值


请注意,不要在每次渲染中直接调用subscribe函数,并使用正确的依赖项数组作为第二个参数使其生效。

您需要将侦听器移到subscribe函数之外。 由于它是一种副作用,您应该将其包装在
React.useffect
使用函数setstate读取以前的值也是一个好主意

React.useEffect(() => {
    socket.on('listenAction', function (msg) {
        setQuotes((quotes) => [...quotes, msg])
    }); 
}, []);


您需要将侦听器移到subscribe函数之外。 由于它是一种副作用,您应该将其包装在
React.useffect
使用函数setstate读取以前的值也是一个好主意

React.useEffect(() => {
    socket.on('listenAction', function (msg) {
        setQuotes((quotes) => [...quotes, msg])
    }); 
}, []);


你能试试setQuotes(oldQuotes=>[…oldQuotes,msg])吗?你找到解决这个问题的办法了吗,我面临着同样的问题?你能试试setQuotes(oldQuotes=>[…oldQuotes,msg])吗?你找到解决这个问题的办法了吗,我面临着同样的问题?