React Props不更新状态

时间:2019-02-19 22:41:20

标签: javascript reactjs

我正在尝试从其父级的props设置嵌套组件的状态,如果我直接使用父级checked={Boolean(this.props.contData.statesValue.active)}的传入prop设置了Switch的选中属性,则switch ui成功从开启到关闭,

import React, { Component } from "react"
import Switch from '@material-ui/core/Switch';

class Test extends Component {
            
    render() {
      return (
        <div>
          <Switch checked={Boolean(this.props.contData.statesValue.active)} />
        </div>
      );
    }
}
 
export default (Test);

但是,如果我尝试设置通过状态检查,则ui不会更新,并且记录this.state.checked的值不会更改,

我冒昧猜测我将在生命周期的错误部分中更新代码,但是任何帮助将不胜感激

import React, { Component } from "react"
import Switch from '@material-ui/core/Switch';

class Test extends Component {
        
    state = {
      checked:this.props.contData.statesValue.active
    }
    render() {
        return (
            <div>
              <Switch checked={Boolean(this.state.checked)} />
            </div>
        );
     }
}
 
export default (Test);

2 个答案:

答案 0 :(得分:1)

状态最初设置为prop值,并且在收到新的prop值时不会更新。

这是getDerivedStateFromProps生命周期方法的用途:

state = {};

static getDerivedStateFromProps(props, state) {
  return {
   checked: !!props.contData.statesValue.active
  };
}

render() {
    return (
        <div>
          <Switch checked={this.state.checked} />
        </div>
    );
 }

如果状态与道具没有区别,则不需要该状态;组件可以是无状态的,可以直接使用props。

答案 1 :(得分:1)

{Boolean(this.state.checked)}将变量转换为不再是变量的布尔值。它获取this.state.checked的值,将其转换为布尔值,并且不再更新,因为它不是变量。因此,您需要将其修改为<Switch checked={this.state.checked} />