React.js建议直接为状态分配`props'

时间:2020-01-23 11:54:21

标签: reactjs warnings react-props react-component react-state

引发了React.js警告:

IndexPage:不建议将道具直接分配给状态,因为对道具的更新不会反映在状态中。在大多数情况下,最好直接使用道具。

我有以下代码:

    class IndexPage extends React.Component<IProps, IState> {
       constructor(props) {
          super(props)
          this.state = props
       }
    }

但是,当我将代码更改为:

    class IndexPage extends React.Component<IProps, IState> {
       constructor(props) {
          super(props)
          this.state = {...props}
       }
    }

警告消失了。

你能解释为什么吗?

1 个答案:

答案 0 :(得分:3)

由于JS分配对象值的工作方式,将一个对象分配给另一个对象意味着第二个变量将“指向”相同的实例,或持有对该实例的引用:

let x = { v: 1 };
let y = x;
x.v = 2;
console.log(y.v) // prints "2"

警告是为了防止意外假设道具自动“传播”到状态。 IOW,它不仅仅像您通常期望的那样工作:

// assume props = { v: 1 };
this.state = props;
// now props changes to { v: 2 };
console.log(this.state.v) // still prints 1, and that's why you get the warning

警告消失了,因为通过破坏,您很明显正在创建一个新对象,并且您不希望状态在更改时与prop具有相同的值。