javascript - React 中setState 的这两种updater 函数是否相等?

标签 javascript reactjs typescript setstate

我最近了解到 updater functions用于 React 中的 setState

现在我已经看到这个概念以两种不同的方式使用。假设我们有一个这样的状态对象:

interface State {
  readonly expanded: boolean;
  readonly slugs: string[];
}

state: State = { expanded: false, slugs: [] }

我见过像这样使用的更新程序函数:

this.setState(prevState => ({ ...prevState, expanded: !prevState.expanded }));

像这样:

this.setState(({ expanded }) => ({ expanded: !expanded }));

我已经自己尝试过,看看使用两者之间是否有区别,但我找不到(除了字符数 😄)。我的直觉告诉我,第一种方式可能更安全,因为第二种方式 state(在本例中为 slugs)可能会被覆盖?

编辑:此问题已被标记为与 this question 重复的问题,但它本质上是不同的,因为我想知道 setState 的功能,而不是 TypeScript 的类型注释是如何工作的。为了清楚起见,我只是提供了 TypeScript 类型。很抱歉这个问题造成了困惑。英语不是我的主要语言,我不知道如何更清楚地表达这一点。幸运的是有人理解并完美地回答了这个问题。

最佳答案

如果您查看源代码,尤其是 setStateenqueueSetState ,你可以看到下面这段代码:

if (typeof partialState === 'function') {
  partialState = partialState.call(
    pu blicInstance,
    currentState,
    publicInstance.props,
  );
}

// Null and undefined are treated as no-ops.
if (partialState === null || partialState === undefined) {
  return;
}

this._renderer._newState = {
  ...currentState,
  ...partialState,
};

那是什么意思

this.setState(({ expanded }) => ({ expanded: !expanded }));

最终会是:

state = {...prevState, {expanded: !expanded}}

this.setState(prevState => ({ ...prevState, expanded: !prevState.expanded }));

将结束为:

 state = {...prevState, ...{...prevState, expanded: !prevState.expanded}}

我认为第二个基本上是对更新程序功能如何工作的理解不足。

关于javascript - React 中setState 的这两种updater 函数是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53578857/

相关文章:

javascript - MongoDB 中两个集合之间的 Diff()

javascript - 防止 this.state 与 setState 一起使用

typescript - Three.js ShaderMaterial 仅适用于某些 GPU

php - JavaScript 突然停止工作

javascript - 无法让 Datatables 与 Bootstrap 3 集成

javascript - Node.js 示例无法在 Windows 10 上运行

javascript - ReactJS:我可以创建自己的 SyntheticEvent 吗?

reactjs - 如何将 Material UI 文本字段聚焦在按钮单击上?

reactjs - 使用 Jest 和 enzyme 测试 React Typescript 组件的副作用

javascript - typescript :嵌套对象的深度键,具有相关类型