useState 钩子,setState 函数。访问先前的状态值

IT技术 javascript reactjs react-hooks
2021-04-06 19:40:50

这两个是等价的吗?如果不是,哪个最好,为什么?

const [count, setCount] = useState(initialCount);
<button onClick={() => setCount(count + 1)}>+</button>
const [count, setCount] = useState(initialCount);
<button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
2个回答

如果下一个状态值取决于前一个值,如这个增量按钮示例,最好使用setState ( setCount(prevCount => prevCount + 1))的函数版本

如果将 setter 函数传递到回调函数(如 onChange 或 HTTP 请求响应处理程序)中,则可能会遇到错误。

作为一个明确的例子,在下面的页面中,如果您单击“延迟计数器(基本)”,然后单击“立即计数器”,则计数只会增加 1。但是,如果您单击“延迟计数器(功能)”,然后通过“立即计数器”,计数最终将增加 2。

import React, { useState } from "react";
import ReactDOM from "react-dom";

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={() => setTimeout(() => setCount(count + 1), 2000)}>
        Delayed Counter (basic)
      </button>
      <button onClick={() => setTimeout(() => setCount(x => x + 1), 2000)}>
        Delayed Counter (functional)
      </button>
      <button onClick={() => setCount(count + 1)}>Immediate Counter</button>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Counter />, rootElement);
据我所知,发生这种情况的原因是“基本”计数器在被调用时将“计数”的值保存在内存中,并使用相同的值,而不管它是否在此期间发生了变化。也许这对某人有帮助;)
2021-06-14 19:40:50

这两个例子都是有效的并且工作相同。但是,我怀疑 a 的primitive操作与 a 相同,function因为JavaScript支持first-class/higher order functions. 这意味着函数与任何其他变量一样受到威胁,允许将它们作为参数传递,将它们分配给变量,并在任何其他函数中返回它们。