React .setState() 中的扩展运算符

Bio*_*ika 6 javascript jsx reactjs

鉴于以下从 React 类组件中提取的片段:

constructor(props) {
    super(props)
    this.state = { active: true }
  }

  deactivate = () => {
    this.setState({ ...this.state, active: false })
  }
Run Code Online (Sandbox Code Playgroud)

扩展运算符进入 stopCounter() 方法的目的是什么?该应用程序也可以删除它:

  deactivate = () => {
    this.setState({ active: false })
  }
Run Code Online (Sandbox Code Playgroud)

Bho*_*yar 16

在这种情况下两者都有效,但您不需要使用它。只需设置状态就可以了:

this.setState({active: false})
Run Code Online (Sandbox Code Playgroud)

但是让我解释一下,如果您有嵌套的状态级别,例如:

state = {
  foo: {
   a: 1,
   b: 2,
   c: 3
  }
}
Run Code Online (Sandbox Code Playgroud)

当您只需要更新 foo 的 c 状态时,您需要合并状态,如:

this.setState({ foo: {
  ...this.state.foo,
  c: 'updated value'
}})
Run Code Online (Sandbox Code Playgroud)

因此,扩展语法将对象与后面的对象合并。它类似于Object.assign

  • [文档](https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous) 表示不要在“setState”调用中从状态读取值。使用 setState(prevState => ({...prevState.foo, c: "updated value"}))` 代替。 (4认同)