Reactjs 反应钩不';t在状态更新时重新加载

Reactjs 反应钩不';t在状态更新时重新加载,reactjs,websocket,socket.io,react-hooks,Reactjs,Websocket,Socket.io,React Hooks,我第一次尝试实现一个websocket,我尝试创建一个图表来流化我的CPU使用率。很简单。 Websocket工作正常,dataArray看起来像是它想要的。。。 但不知何故,setData()钩子不会触发我的组件的重新加载 在我的组件的返回方法中有一个console.log,它只会被触发一次。有人能解释一下为什么吗 const [data, setData] = useState([['x', 'x']); useEffect(() => { const socket = so

我第一次尝试实现一个websocket,我尝试创建一个图表来流化我的CPU使用率。很简单。 Websocket工作正常,dataArray看起来像是它想要的。。。 但不知何故,setData()钩子不会触发我的组件的重新加载

在我的组件的返回方法中有一个console.log,它只会被触发一次。有人能解释一下为什么吗

const [data, setData] = useState([['x', 'x']);

useEffect(() => {
    const socket = socketIOClient(endpoint);
    var counter = 1;
    socket.on("AnswerFromApi", result => {
        setNewState(result, counter);
        counter++;
    });
}, []);

const setNewState = (arr, counter) => {
    var dataArray = data;
    dataArray.push([arr, counter]);
    if(dataArray.length > 5) {
        dataArray.splice(1, 1);
    }
    console.log(dataArray);
    setData(dataArray);
};
预期输出(也是console.log(dataArray)似乎是正确的):

谢谢你的帮助

编辑: 找到了答案。正确代码:

useEffect(() => {
        const socket = socketIOClient(endpoint);
        var counter = 1;
        socket.on("AnswerFromApi", result => {
            setData(prevState => {
                if(prevState.length > 10) {
                    prevState.splice(1, 1);
                }
                return ([...prevState, [counter, result]])
            });
            counter++;
        });
    }, []);

您必须添加有效的数据,即

useEffect(() => {
    const socket = socketIOClient(endpoint);
    var counter = 1;
    socket.on("AnswerFromApi", result => {
        setNewState(result, counter);
        counter++;
    });
}, [data]);

如果我们传递空数组,它将作为componentDidMount工作;如果我们传递值,它将作为componentDidUpdate工作,只要该值发生更改。

您必须添加有效的数据,即

useEffect(() => {
    const socket = socketIOClient(endpoint);
    var counter = 1;
    socket.on("AnswerFromApi", result => {
        setNewState(result, counter);
        counter++;
    });
}, [data]);

如果我们传递空数组,它将作为componentDidMount工作;如果我们传递值,它将作为componentDidUpdate工作,只要该值发生更改。

您传递的是什么数组?语法错误顺便说一句,在useState中,x前面有两个方括号,x后面只有一个方括号。您要传递什么数组?语法错误顺便说一句,在useState中,x之前有两个方括号,x之后只有一个方括号。很遗憾,这不可能发生任何事情。但我自己已经找到了解决方案,我会更新我的问题。还是谢谢你的帮助!不幸的是,这不可能发生任何事情。但我自己已经找到了解决方案,我会更新我的问题。还是谢谢你的帮助!