单击另一个组件中的按钮时,如何显示/隐藏React组件?

时间:2020-08-18 19:14:57

标签: reactjs

我有以下React组件:

export default class AdminHomePage extends Component {

  render() {
    return (
      <div>
        <NavBar />
        <OptionsMenu />
        <Form /> // needs to be inittially hidden 
        <ImportFile /> // needs to be inittially hidden 
        <Footer />
      </div>
    );
  }

}

在我的 OptionsMenu 组件中,我有两个按钮:

export default class OptionsMenu extends Component {

  render() {
    return (
      <div className="admin-menu">
        <div className="admin-menu-header">Select an option</div>
        <div className="buttons-admin-menu">

          <button className="button-admin">
            Register
          </button>

          <button className="button-admin" onClick={getFileModel}>
            Import CSV file
          </button>

        </div>
      </div>
    );
  }

}

首先,我需要同时隐藏 Form ImportFile 组件,因此,当我单击内的“ Import CSV”按钮时OptionsMenu 文件,显示 ImportFile 组件,单击“注册”按钮时,显示 Form 组件。

我只发现了一些主题,这些主题显示了如何隐藏/显示在同一文件/类中具有各自按钮的组件,因此我不知道如何处理不同类上的按钮和组件。

谢谢。

2 个答案:

答案 0 :(得分:2)

您需要在父组件中创建一个记录状态(确定可见性的状态)的方法,并将该方法作为道具传递:

export default class AdminHomePage extends Component {

constructor(props) {
   super(props);

   this.state = {
      isVisible: false
   }
   this.isElVisible = this.isElVisible.bind(this);
}

isElVisible() {
   this.setState({isVisible: !isVisible});
}

render() {
 return (
  <div>
    <NavBar />
    <OptionsMenu isViz={this.isElVisible} />
    <Form /> // needs to be inittially hidden 
    { this.state.isVisible? <ImportFile /> : '' } // needs to be inittially hidden 
    <Footer />
  </div>
  );
  }

}

然后,在props.isViz组件,onClick或任何希望其可见的地方调用OptionsMenu

答案 1 :(得分:0)

我能够解决创建函数的问题,然后将该函数作为道具发送给OptionsMenu组件(类似于@silencedogood所说的,但他的回答有一些问题)。

组件 AdminHomePage

export default class AdminHomePage extends Component {
  constructor(props) {
    super(props);
    this.handleFormClick = this.handleFormClick.bind(this);
    this.handleImportClick = this.handleImportClick.bind(this);
    this.state = {
      formVisible: false,
      importVisible: false,
    };
  }

  handleFormClick() {
    this.setState({
      formVisible: true,
      importVisible: false,
    });
  }

  handleImportClick() {
    this.setState({
      formVisible: false,
      importVisible: true,
    });
  }

  render() {
    return (
      <div>
        <NavBar
          keycloak={this.props.keycloak}
          name={this.props.name}
          email={this.props.email}
        />
        <OptionsMenu
          showForm={this.handleFormClick}
          showImport={this.handleImportClick}
        />
        {this.state.formVisible ? <Form /> : null}
        {this.state.importVisible ? <HomePage /> : null}
        <Footer />
      </div>
    );
  }
}

调用组件 AdminHomePage 中的函数:

export default class OptionsMenu extends Component {
  render() {
    return (
      <div className="admin-menu">
        <div className="admin-menu-header">Selecione uma opção</div>
        <div className="buttons-admin-menu">
          <button
            className="button-admin"
            onClick={() => this.props.showForm()}
          >
            Register
          </button>
          <button
            className="button-admin"
            onClick={() => {
              this.props.showImport();
              getFileModelo();
            }}
          >
            Import CSV file
          </button>
        </div>
      </div>
    );
  }
}