如果您直接通过道具启动状态,它将在React 16.5(2018年9月5日)中显示警告
如果要将所有道具添加到状态并保留相同的名称,可以使用如下所示的简短形式。
constructor(props) { super(props); this.state = { ...props } //... }
你可以用 key 在需要时重置状态的值,传递道具以表明它不是一个好习惯,因为你在一个地方有不受控制和控制的组件。数据应该在一个地方处理 读这个 https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key
key
的 更新React 16.3 强> alpha介绍 static getDerivedStateFromProps(nextProps, prevState) ( 文档 )作为替代品 componentWillReceiveProps 。
static getDerivedStateFromProps(nextProps, prevState)
componentWillReceiveProps
在实例化组件之后以及在接收新的props时调用getDerivedStateFromProps。它应该返回一个更新状态的对象,或者返回null以指示新的props不需要任何状态更新。 请注意,如果父组件导致组件重新渲染,即使props没有更改,也会调用此方法。如果您只想处理更改,则可能需要比较新值和以前的值。
在实例化组件之后以及在接收新的props时调用getDerivedStateFromProps。它应该返回一个更新状态的对象,或者返回null以指示新的props不需要任何状态更新。
请注意,如果父组件导致组件重新渲染,即使props没有更改,也会调用此方法。如果您只想处理更改,则可能需要比较新值和以前的值。
https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops
它是静态的,因此它没有直接访问权限 this (但它确实可以访问 prevState ,可以存储通常所附的东西 this 例如 refs )
this
prevState
refs
编辑以反映@ nerfologist在评论中的更正
你不需要打电话 setState 在一个组件中 constructor - 这是设置的惯用语 this.state 直:
setState
constructor
this.state
class FirstComponent extends React.Component { constructor(props) { super(props); this.state = { x: props.initialX }; } // ... }
看到 反应文档 - 向类添加本地状态 。
您描述的第一种方法没有任何优势。在第一次安装组件之前,它将立即进行第二次更新。