Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript react状态钩子设置回调触发两次有什么原因吗?_Javascript_Reactjs_Socket.io_Callback_React Hooks - Fatal编程技术网

Javascript react状态钩子设置回调触发两次有什么原因吗?

Javascript react状态钩子设置回调触发两次有什么原因吗?,javascript,reactjs,socket.io,callback,react-hooks,Javascript,Reactjs,Socket.io,Callback,React Hooks,我有一个简单的代码: const [state, setState] = useState([]); useEffect(() => { socket.on('something', data => { console.log('ONE'); setState(old => { console.log('TWO'); const newArr = [...old]; // do something to newAr

我有一个简单的代码:

const [state, setState] = useState([]);

useEffect(() => {
  socket.on('something', data => {
    console.log('ONE');

    setState(old => {
      console.log('TWO');

      const newArr = [...old];

      // do something to newArr
      return newArr;
    });
  });

  return () => {
    socket.off('something');
  };
}, []);
一切正常,但由于某种原因,
something
回调会触发一次(一次打印
ONE
),但在内部,当我设置状态时,
setState
回调会被调用两次(它会打印两次)。这是为什么?

这是React的一个功能(不,它不是bug)。
setState()
updater函数在开发模式期间在严格的上下文中被调用两次,只是为了快速显示常见的反模式,包括状态突变和外部管理的状态

这些工作是为即将到来的渲染准备的,随着react渲染阶段的内部实现变得更加复杂,预计每个渲染都会定期多次调用这些方法


简言之,没有什么需要修复的。React只是让您更容易发现开发中的逻辑错误,同时保持生产性能。

这是在开发模式下完成的。@PatrickRoberts,哦,我明白了,所以。。。我该怎么避免呢?你不会的。在生产模式下,它不会这样做,而在开发模式下,如果您在外部执行突变或存储状态以作出反应,它会快速揭示问题。简而言之,没有什么问题,也没有什么需要修复的。