反应状态挂钩设置回调触发两次的任何原因?
Any reason for a react state hook set callback to fire twice?
我有这个简单的代码:
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
回调是调用两次(它打印 TWO
两次)。这是为什么?
这是 React 的一个特性 strict mode(不,这不是一个错误)。
setState()
更新程序函数 among other methods 在开发模式期间在严格的上下文中被调用两次,只是为了快速揭示常见的反模式,包括状态突变和外部管理的状态。
这些努力是为即将到来的 concurrent mode 做准备,随着 React 渲染阶段的内部实现变得越来越复杂,预计每次渲染都会多次调用这些方法。
简而言之,没有什么需要修复的。 React 只是让您更容易发现开发中的逻辑错误,同时在生产中保持高性能。
我有这个简单的代码:
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
回调是调用两次(它打印 TWO
两次)。这是为什么?
这是 React 的一个特性 strict mode(不,这不是一个错误)。
setState()
更新程序函数 among other methods 在开发模式期间在严格的上下文中被调用两次,只是为了快速揭示常见的反模式,包括状态突变和外部管理的状态。
这些努力是为即将到来的 concurrent mode 做准备,随着 React 渲染阶段的内部实现变得越来越复杂,预计每次渲染都会多次调用这些方法。
简而言之,没有什么需要修复的。 React 只是让您更容易发现开发中的逻辑错误,同时在生产中保持高性能。