【发布时间】:2015-02-27 16:01:00
【问题描述】:
我一直通过不渲染来隐藏/显示反应组件,例如:
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>
);
}
但只是说<Bio/> 组件有很多内部状态。每次我重新创建组件时,它都会丢失其内部状态,并重置为原始状态。
我当然知道我可以将数据存储在某个地方,并通过 props 传入或只是全局访问它,但是这些数据并不需要存在于组件之外。我也可以使用 CSS (display:none) 隐藏/显示组件,但我更喜欢像上面那样隐藏/显示它们。
这里的最佳做法是什么?
编辑:也许更好的说明问题的方法是使用示例:
忽略 React,并假设您只是使用一个桌面应用程序,该应用程序具有一个配置对话框,其中包含一个名为 A 的选项卡组件,该组件有 2 个选项卡,分别命名为 1 和 2。
假设选项卡 A.1 有一个电子邮件文本字段,然后您填写您的电子邮件地址。然后单击选项卡 A.2 片刻,然后单击返回选项卡 A.1。发生了什么?您的电子邮件地址将不再存在,它会被重置为空,因为内部状态没有存储在任何地方。
按照以下答案之一的建议内部化状态,但仅适用于组件及其直接子级。如果您将组件任意嵌套在其他组件中,例如 Tabs in Tabs in Tabs,那么它们保持内部状态的唯一方法是将其外部化,或者使用 display:none 方法,该方法实际上将所有子组件保留在周围在任何时候。
在我看来,这种类型的数据并不是你想要弄脏你的应用程序状态的数据......或者甚至不想考虑。看起来您应该能够在父组件级别控制数据,并选择保留或丢弃,而无需使用 display:none 方法,也无需担心有关其存储方式的详细信息。
【问题讨论】:
-
我明白这个问题已回答。但是您所做的不是路由问题。我们是否需要通过隐藏和显示来处理。作为最佳实践,可以将状态移动到不同的对象吗?
-
抱歉,我之前没有看到这个 - 在这个例子中它可能看起来像一个路由问题,但这可能发生在层次结构中的任何级别......在页面深处,然后届时也会出现同样的担忧。
-
请注意,从 DOM 中删除元素通常会导致状态丢失(例如 jQuery 数据、
标签: javascript facebook reactjs