当前位置: 首页 > 知识库问答 >
问题:

显示/隐藏ReactJS组件而不丢失其内部状态?

公西苗宣
2023-03-14

我一直通过不渲染来隐藏/显示反应组件,例如:

render: function() {
  var partial;
  if (this.state.currentPage === 'home') {
    partial = <Home />;
  } else if (this.state.currentPage === 'bio') {
    partial = <Bio />;
  } else {
    partial = <h1>Not found</h1>
  }
  return (
    <div>
      <div>I am a menu that stays here</div>
      <a href="#/home">Home</a> <a href="#/bio">Bio</a>
      {partial}
    </div>
  );
}

但是只要说

我当然知道我可以将数据存储在某个地方,然后通过道具将其传递进来,或者只是全局访问它,但这些数据实际上不需要存在于组件之外。我还可以使用CSS隐藏/显示组件(display:none),但我更喜欢如上所述隐藏/显示组件。

这里最好的做法是什么?

编辑:说明问题的更好方法可能是使用以下示例:

忽略React,并假设您正在使用一个桌面应用程序,该应用程序具有一个名为a的选项卡组件的配置对话框,该组件有两个选项卡,分别命名为1和2。

假设选项卡A.1有一个电子邮件文本字段,您填写您的电子邮件地址。然后单击选项卡A.2一秒钟,然后单击返回到选项卡A.1。发生了什么事?你的电子邮件地址将不再存在,它将被重置为零,因为内部状态没有存储在任何地方。

内化状态的工作原理如下面的一个答案所示,但仅适用于组件及其直接子级。如果组件任意嵌套在其他组件中,例如选项卡中的选项卡中的选项卡,则它们保持内部状态的唯一方法是将其外部化到某个位置,或者使用display:none方法,该方法实际上始终保持所有子组件。

在我看来,这类数据并不是你想要弄脏你的应用程序状态的数据。。。或者甚至想去想一想。似乎您应该能够在父组件级别控制数据,并选择保留或放弃,而无需使用display:none方法,也无需关心其存储方式的细节。


共有3个答案

羊舌昆杰
2023-03-14

看起来官方文档建议使用style={{{display:'none'}}

法景明
2023-03-14

不幸的是,style={{show:'no'}}技巧只适用于普通的DOM元素,而不是React组件。我必须在div中包装组件。所以我不必将状态级联到子组件。

<div className="content">
  <div className={this.state.curTab == 'securities' ? 'active' : ''}>
    <Securities />
  </div>
  <div className={this.state.curTab == 'plugins' ? 'active' : ''}>
    <Plugins />
  </div>
</div>
杜河
2023-03-14

一种选择是在组件内部移动条件:

Bio = React.createClass({
    render: function() {
        if(this.props.show) {
            return <p>bio comp</p>
        } else {
            return null;
        }
    }
});

<Bio show={isBioPage} />

这是否是“最佳实践”可能取决于具体情况。

 类似资料:
  • 问题内容: 我们现在在使用React时遇到了一些问题,但这 有点 归结于我们如何使用React的一部分。 我们应该如何显示/隐藏子组件? 这就是我们的编码方式(这只是组件的片段)… 最近,我一直在阅读一些示例,例如应该沿着以下方向进行: 我应该一直在使用那个React.render()吗?似乎停止了各种各样的事情,如级联到孩子和诸如… 问题答案: 我提供了一个工作示例,它遵循您的第二种方法。更新组

  • 问题内容: 您如何在Tkinter中显示和隐藏小部件?我想有一个输入框,但不要一直显示它。有人可以向我展示在tkinter中显示和隐藏条目小部件和其他小部件的功能吗?我希望能够在没有多个帧的情况下执行此操作。 问题答案: 这已经在stackoverflow上得到了回答。简短的答案是,您可以使用grid_remove,如果先前是通过网格添加的,则将导致该小部件被删除。记住小部件的位置,因此只需简单地

  • 我对React Native非常陌生,我想知道如何隐藏/显示组件 这是我的测试用例: 我有一个组件,我想要的是当输入获得焦点时显示,然后当用户按下取消按钮时隐藏。 我不知道如何“访问”TouchableHighlight组件,以便在我的函数中隐藏/显示它 另外,如何从一开始就隐藏按钮?

  • 在设置页面中,我有一个复选框被选中作为默认值。如果用户不选中它,那么应用程序中的所有图像都将被隐藏,用户将无法看到整个应用程序中的任何图像。我想我需要控制复选框的状态(选中或没有选中),在单击/按下复选框时更改该值,将该新值传递给所有应用程序(如何传递?),然后根据该值我可以决定是否显示图像。 所以基本上,我的问题是访问状态值,然后决定显示什么。下面是我在设置页面中使用的代码: 设置页: PS:我

  • 问题内容: 如何使用JSF显示/隐藏组件?我目前正尝试在javascript的帮助下做同样的事情,但没有成功。我不能使用任何第三方库。 谢谢| 阿比 问题答案: 通常,您需要通过其clientId获得该控件的句柄。本示例使用带有请求范围绑定的JSF2 Facelets视图来获取另一个控件的句柄: 确切的操作方式取决于您正在使用的JSF版本。有关较早的JSF版本,请参见此博客文章:JSF:使用组件标

  • 有没有办法在另一个程序中隐藏窗口或框架?例如,如果你打开了一个Firefox窗口,并且运行了你的程序,那么它会和firefoxFrame一样。setVisible(false),但很明显,我没有对另一个程序框架的引用。然后也许以后,firefoxFrame。setVisible(真)