【问题标题】:how to remove / unmount nested react components如何删除/卸载嵌套的反应组件
【发布时间】:2015-08-07 11:47:00
【问题描述】:

我想卸载一个反应组件,它属于一个包含三个组件的父组件。父组件有这个渲染功能:

render: function () {
  return (
    <div className={classes}>
      <Navbar ref="navbar"/>
      <Home ref="home"/>
      <Footer ref="footer"/>
    </div>
),

handleNavbarClick: function () {
  // remove Home
}

如果用户随后单击导航栏中的链接并且我想卸载 Home 组件,我该怎么做?似乎我唯一的选择是做这样的事情(取自react.js: removing a component),但这看起来很恶心:

render: function () {
  var home = this.state.remove_home ? null : <Home ref="home />
  return (
    <div className={classes}>
      <Navbar ref="navbar"/>
      {home}
      <Footer ref="footer"/>
    </div>
),

handleNavbarClick: function () {
  this.setState({remove_home: true});
}

这是做事的适当反应方式吗?

【问题讨论】:

    标签: reactjs reactjs-flux react-jsx


    【解决方案1】:

    是的,您提出的解决方案

    render: function () {
      var home = this.state.remove_home ? null : <Home ref="home" />
      return (
        <div className={classes}>
          <Navbar ref="navbar"/>
          {home}
          <Footer ref="footer"/>
        </div>
    ),
    
    handleNavbarClick: function () {
      this.setState({remove_home: true});
    }
    

    或多或少是使用 React 处理此问题的“正确”方式。请记住,render 的目的是描述您的组件在任何给定点的外观。接触 DOM 并执行手动操作,或执行其他类型的命令式工作,例如“删除”元素,几乎总是错误的做法。

    如果担心语法,可以考虑内联或提取逻辑:

    render: function () {
      return (
        <div className={classes}>
          <Navbar ref="navbar"/>
          {this.state.remove_home ? null : <Home ref="home" />}
          <Footer ref="footer"/>
        </div>
    ),
    

    render: function () {
      return (
        <div className={classes}>
          <Navbar ref="navbar"/>
          {!this.state.remove_home && <Home ref="home" />}
          <Footer ref="footer"/>
        </div>
    ),
    

    render: function () {
      return (
        <div className={classes}>
          <Navbar ref="navbar"/>
          {this.renderHome()}
          <Footer ref="footer"/>
        </div>
    ),
    
    renderHome: function() {
      if (!this.state.remove_home) {
        <Home ref="home" />
      }
    }
    

    【讨论】:

    • 谢谢。我喜欢将 renderHome 分解为自己的功能的想法
    【解决方案2】:

    试试这个

    handleNavBarClick: function(){
        React.findDOMNode(this.refs.home).style.display = 'none';
    }
    

    【讨论】:

    • 嗯,是的,除了组件的侦听器保持原样之外,它会起作用。
    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 2019-11-06
    • 2022-01-22
    • 2015-10-10
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多