首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用非结构化状态计算新状态是否安全?

使用非结构化状态计算新状态是否安全?
EN

Stack Overflow用户
提问于 2019-06-04 20:36:58
回答 1查看 57关注 0票数 0

使用非结构化状态计算新状态是否安全?

例如:

代码语言:javascript
复制
const [clickCount, setClickCount] = useState(0);
//then later
setClickCount(clickCount + 1)

我知道对于使用this.state +1的类是不行的,最好是使用提供以前状态的setState过载。考虑到docs使用了一个类似于上面的例子,而且没有提到这一点,我假设它是安全的。直到我发现setState动作签名是:

代码语言:javascript
复制
type SetStateAction<S> = S | ((prevState: S) => S);

如果安全的话,我现在很好奇为什么这个选项可以为函数提供以前的状态。否则,如果您已经解除了当前状态的结构,那么您什么时候会需要它呢?

编辑:

作为参考,这是文档中关于setState和this.state的说明:

setState()不会立即改变this.state,而是创建一个挂起的状态转换。调用此方法后访问this.state可能会返回现有值。 对setState的调用不能保证同步操作,为了提高性能,调用可以批处理。

EN

回答 1

Stack Overflow用户

发布于 2019-06-04 20:51:12

类似于类组件中的setState API如何接受一个函数作为参数表,钩子也接受相同的函数。

官方文件:您可以始终传递一个函数,以防您想要使用以前重载的新状态。

这是否意味着,与this.state一样,使用钩子也无法保证在非结构化状态下发生突变?

尽管在类中获得状态的方式和钩子是不同的,但是setState API本身在这两个方面都有类似的实现。它仍然是异步的。因此,无论您如何访问状态(类中的this.state或钩子中的state ),都有可能基于代码使用陈旧的状态。例子:

代码语言:javascript
复制
function Counter({initialCount}) {
  const [count, setCount] = useState(initialCount);
  return (
    <>
      Count: {count}
      <button onClick={() => setCount(count + 1)}>Reset</button>
      <button onClick={() => setCount(count + 2)}>+</button>
    </>
  );
}


class Counter extends React.Component {
  constructor() {
    super();
    this.state = initialCount;
  }

  render() {
    <>
      Count: {count}
      <button onClick={() => this.setState(count + 1)}>Reset</button>
      <button onClick={() => this.setState(count + 2)}>+</button>
    </>
  }
}

以两种方式实现了相同的组件。但这两种方法都不能保证在后续的setState语句中使用以前的状态值。因此,在这些情况下,最好在钩子和类中传递函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56451011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档