【发布时间】:2021-05-26 02:03:33
【问题描述】:
React 中有一个概念(使用钩子时)让我感到困惑。
我做了一个组件来解释(增加一个计数器):
const [counter, setCounter] = useState(0); // counter hook
// code will follow
// render
return (
<div>
<button onClick={handleClick}>+</button>
<h3>{counter}</h3>
</div>
);
对于处理函数,我看到了设置状态的不同选项。
第一种方法(正常使用setState()):
const handleClick = () => {
setCounter(counter + 1);
};
第二种方法(在setState()内部创建一个函数并返回新值):
const handleClick = () => {
setCounter((counter) => {
return counter + 1;
});
};
我认为不同的是,使用第二种方法,您可以在设置状态后立即进行回调,如下所示:
const handleClick = () => {
setCounter((counter) => {
return counter + 1;
}, () => {
console.log(counter); // trying callback after state is set
});
};
但是在尝试这个(使用两种方法)时,控制台会显示以下错误消息:
警告:来自 useState() 和 useReducer() Hooks 的状态更新不支持第二个回调参数。要在渲染后执行副作用,请在组件主体中使用 useEffect() 声明它。
所以我认为在这两种情况下,使用useEffect() 作为setState() 的回调是正确的方法。
我的问题是:这两种方法有什么区别,什么方法最好设置状态。我已经阅读了关于状态不变性的信息,但无法立即看到它在这个示例中会产生怎样的影响。
【问题讨论】:
标签: javascript reactjs callback react-hooks state