首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >React js从父组件更改子组件的状态

React js从父组件更改子组件的状态
EN

Stack Overflow用户
提问于 2016-08-19 22:36:02
回答 6查看 186.9K关注 0票数 126

我有两个组件:父组件,我想通过它更改子组件的状态:

代码语言:javascript
复制
class ParentComponent extends Component {
  toggleChildMenu() {
    ?????????
  }
  render() {
    return (
      <div>
        <button onClick={toggleChildMenu.bind(this)}>
          Toggle Menu from Parent
        </button>
        <ChildComponent />
      </div>
    );
  }
}

子组件

代码语言:javascript
复制
class ChildComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      open: false;
    }
  }

  toggleMenu() {
    this.setState({
      open: !this.state.open
    });
  }

  render() {
    return (
      <Drawer open={this.state.open}/>
    );
  }
}

当点击父组件中的按钮时,我需要从父组件中更改子组件的打开状态,或者从父组件调用子组件的toggleMenu()

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-08-19 22:47:33

状态应该在父组件中进行管理。您可以通过添加特性将open值传递给子组件。

代码语言:javascript
复制
class ParentComponent extends Component {
   constructor(props) {
      super(props);
      this.state = {
        open: false
      };

      this.toggleChildMenu = this.toggleChildMenu.bind(this);
   }

   toggleChildMenu() {
      this.setState(state => ({
        open: !state.open
      }));
   }

   render() {
      return (
         <div>
           <button onClick={this.toggleChildMenu}>
              Toggle Menu from Parent
           </button>
           <ChildComponent open={this.state.open} />
         </div>
       );
    }
}

class ChildComponent extends Component {
    render() {
      return (
         <Drawer open={this.props.open}/>
      );
    }
}
票数 138
EN

Stack Overflow用户

发布于 2018-07-13 05:12:47

父组件可以管理子状态,将属性传递给子组件,子组件使用componentWillReceiveProps将该属性转换为状态。

代码语言:javascript
复制
class ParentComponent extends Component {
  state = { drawerOpen: false }
  toggleChildMenu = () => {
    this.setState({ drawerOpen: !this.state.drawerOpen })
  }
  render() {
    return (
      <div>
        <button onClick={this.toggleChildMenu}>Toggle Menu from Parent</button>
        <ChildComponent drawerOpen={this.state.drawerOpen} />
      </div>
    )
  }
}

class ChildComponent extends Component {
  constructor(props) {
    super(props)
    this.state = {
      open: false
    }
  }

  componentWillReceiveProps(props) {
    this.setState({ open: props.drawerOpen })
  }

  toggleMenu() {
    this.setState({
      open: !this.state.open
    })
  }

  render() {
    return <Drawer open={this.state.open} />
  }
}
票数 30
EN

Stack Overflow用户

发布于 2018-02-12 16:29:36

上面的答案对我来说是部分正确的,但在我的场景中,我希望将值设置为一个状态,因为我已经使用该值来显示/切换模式。所以我用了下面这样的方法。希望它能帮助到一些人。

代码语言:javascript
复制
class Child extends React.Component {
  state = {
    visible:false
  };

  handleCancel = (e) => {
      e.preventDefault();
      this.setState({ visible: false });
  };

  componentDidMount() {
    this.props.onRef(this)
  }

  componentWillUnmount() {
    this.props.onRef(undefined)
  }

  method() {
    this.setState({ visible: true });
  }

  render() {
    return (<Modal title="My title?" visible={this.state.visible} onCancel={this.handleCancel}>
      {"Content"}
    </Modal>)
  }
}

class Parent extends React.Component {
  onClick = () => {
    this.child.method() // do stuff
  }
  render() {
    return (
      <div>
        <Child onRef={ref => (this.child = ref)} />
        <button onClick={this.onClick}>Child.method()</button>
      </div>
    );
  }
}

参考- https://github.com/kriasoft/react-starter-kit/issues/909#issuecomment-252969542

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39041710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档