反应 useState 钩子,用函数调用 setState

时间:2021-02-23 18:46:49

标签: javascript reactjs callback react-hooks state

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

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

我的问题是:这两种方法有什么区别,什么方法最好设置状态。我已经阅读了关于状态不变性的内容,但无法立即看到它会如何在本示例中产生影响。

1 个答案:

答案 0 :(得分:0)

你的情况是一样的。

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

查看关于此的 React 文档:

Functional updates