从父下拉菜单反应设置子状态

时间:2020-02-11 21:48:55

标签: javascript reactjs

我有2个js文件。我想从Component1更改Component2的状态。

class Component1 extends React.Component {
    constructor(props) {
        super(props);          
        this.state = {
            enable: false
        };
        this.enable = React.createRef();
        this.selector = this.selector.bind(this);

    selector() {
        this.setState({
            enable: true,
        })
    }

    render() {
        return ( 
            <div>
                <select><option>ENABLE</option></select>
                <OtherComponent>
                    <Component2 enable={this.state.enable} />  
                </OtherComponent>
            </div>
        )
    }

我想通过enable: true在Component2中设置<option>

class Component2 extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            enable: false
        }
    }

    componentWillReceiverProps(nextProps) {
        this.setState({ enable: nextProps.enable, })
    }

    render()
        return <div>{this.state.enable}</div>

我以前没有在render()中使用嵌套的Component结构尝试过此操作。

1 个答案:

答案 0 :(得分:1)

我们使用道具将数据从父母的州传递给孩子(不需要绑定父母和孩子的州,也不需要使用引用,也不需要尝试使用生命周期方法):

const { render } = ReactDOM

class Component2 extends React.Component {
    render(){
        return (
          <div>
            Enabled: {this.props.isEnabled ? 'true' : 'false'}
          </div>
        )
    }
}

class OtherComponent extends React.Component {
  render(){
    return <div style={{backgroundColor:'black', color:'white', width:100}}>{this.props.children}</div>
  }
}

class Component1 extends React.Component {
    constructor(props) {
        super(props)
        this.selector = this.selector.bind(this)
        this.state = {
            enable: false
        }
    }
        

    selector() {
        this.setState({
            enable: true
        })
    }

    render() {
        return ( 
            <div>
                <select onChange={this.selector}><option /><option>ENABLE</option></select>
                <OtherComponent>
                  <Component2 isEnabled={this.state.enable} />  
                </OtherComponent>
            </div>
        )
    }
}
    
render (
  <Component1 />,
  document.getElementById('root')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"></script><div id="root"></div>