Reactjs - 将状态值从一个组件传递到另一个组件

新手上路,请多包涵

我有两个组件 SideNav 和 Dashboard(两个在不同的 js 文件中)。 SideNav 将选择框作为过滤器。我必须将一个数组从仪表板组件传递到侧边栏组件。该数组必须作为选择框的值(位于 sidenav 组件内)。

PS 如果我在两个不同的 JS 文件中定义了两个不同的组件类会怎样。例如 HomeComponent/Home.js -> 父组件 Dashboard/Dashboard.js -> 子组件 我正在对“Home.js”文件进行 API 调用并获取一些数据。我想将这些数据传递给“Dashboard.js”文件(组件) 我研究的所有示例,它们在同一个 JS 文件中显示了两个组件。

 class Dashboard extends Component {
  constructor(props) {
    super(props);
    this.state  = {viz:{},filterData:{}};
  }
  var data1= ['1','2','3'];
  this.setState({data1: data1}, function () {
     console.log(this.state.data1);
  });

 }

//Sidebar

class Sidebar extends Component {

   constructor(props) {
     super(props);
     this.state  = {
       data: ['opt1','opt2']
     };
   }

  handleClick(e) {
    e.preventDefault();
    e.target.parentElement.classList.toggle('open');
    this.setState({data: this.state.data1}, function () {
      console.log(this.state.data);
    });
  }

  render() {

    const props = this.props;
    const handleClick = this.handleClick;

    return (
      <div className="sidebar">
        <nav className="sidebar-nav">
          <Nav>
            <li className="nav-item nav-dropdown">
              <p className="nav-link nav-dropdown-toggle" onClick={handleClick.bind(this)}>Global</p>
              <ul className="nav-dropdown-items">
              <li> Organization <br/>
               <select className="form-control">
                <option value="">Select </option>
                {this.state.data.map(function (option,key) {
                   return <option key={key}>{option}</option>;
                 })}
               </select>

原文由 sudhashree 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 499
2 个回答

如果必须将状态从 Dashboard 传递到 Sidebar,则必须从 Dashboard 的渲染函数渲染 Sidebar。在这里,您可以将 Dashboard 的状态传递给 Sidebar。

代码片段

class Dashboard extends Component {
...
...
  render(){
    return(
    <Sidebar data={this.state.data1}/>
    );
  }
}

如果您希望 Dashboard 接收对传递给 Sidebar 的 props (data1) 所做的更改,则需要提升状态。即,您必须将函数引用从仪表板传递到侧边栏。在 Sidebar 中,您必须在希望将 data1 传递回 Dashboard 时调用它。代码片段。

 class Dashboard extends Component {
  constructor(props){
    ...
    //following is not required if u are using => functions in ES6.
    this.onData1Changed = this.onData1Changed.bind(this);
  }
  ...
  ...
  onData1Changed(newData1){
    this.setState({data1 : newData1}, ()=>{
      console.log('Data 1 changed by Sidebar');
    })
  }

  render(){
    return(
    <Sidebar data={this.state.data1} onData1Changed={this.onData1Changed}/>
    );
  }
}

class Sidebar extends Component {
  ...
  //whenever data1 change needs to be sent to Dashboard
  //note: data1 is a variable available with the changed data
  this.props.onData1changed(data1);
}

参考文档: https ://facebook.github.io/react/docs/lifting-state-up.html

原文由 Sri 发布,翻译遵循 CC BY-SA 3.0 许可协议

您只能将道具从父组件传递到子组件。要么重组您的组件层次结构以具有这种依赖性,要么使用像 Redux (react-redux) 这样的状态/事件管理系统。

原文由 JulienD 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进