React 钩子不会在状态更新时重新渲染



>我第一次尝试实现websocket,我尝试创建一个流式传输CPU使用率的图表。很简单。Websocket 工作,dataArray 看起来像它想要它...但不知何故,setData(( 钩子不会触发我的组件的重新渲染。

我有一个控制台.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);
};

预期输出(也是控制台.log(dataArray(似乎是正确的(:

0: (2) ["x", "x"]
1: (2) [6.23, 35]
2: (2) [14.57, 36]
3: (2) [15.42, 37]
4: (2) [8.15, 38]

感谢所有的帮助!

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

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中添加数据,即

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

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

相关内容

  • 没有找到相关文章