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