响应useState挂钩,使用函数调用setState

在Reaction(使用挂钩时)中有一个概念让我困惑。

我做了一个组件进行解释(增加了一个计数器):

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()挂钩的状态更新不支持第二个回调参数。若要在呈现后执行副作用,请使用useEffect()在组件主体中声明它。

所以我认为在这两种情况下,使用useEffect()作为setState()的回调是正确的方式。

我的问题是:这两种方法有什么不同,设置状态最好的方法是什么。我读过有关状态不变性的内容,但不能立即看出它在本例中会有什么不同。


解决方案

在您的情况下是相同的。

基本上,当使用以前的状态计算您的状态时,您可以使用第二种方法来获取以前的值。

查看Reaction文档中有关此问题的信息:

Functional updates

相关文章