Javascript ReactJS中的选项卡容器:仅渲染选定的子对象,而不是使用“显示:无”`
我在ReactJS中构建了一个简单的选项卡容器,容器组件在其状态下保持一个整数索引,表示要显示的选项卡窗格,然后仅呈现在该索引位置找到的子级(来自Javascript ReactJS中的选项卡容器:仅渲染选定的子对象,而不是使用“显示:无”`,javascript,reactjs,Javascript,Reactjs,我在ReactJS中构建了一个简单的选项卡容器,容器组件在其状态下保持一个整数索引,表示要显示的选项卡窗格,然后仅呈现在该索引位置找到的子级(来自this.props.children数组) 这种方法的要点是: const TabContainer = React.createClass({ props: { tabNames: React.PropTypes.arrayOf(React.PropTypes.string).isRequired }, ge
this.props.children
数组)
这种方法的要点是:
const TabContainer = React.createClass({
props: {
tabNames: React.PropTypes.arrayOf(React.PropTypes.string).isRequired
},
getInitialState: function() {
return {
activeIndex: 0
};
},
setTab: function(n) {
this.setState({activeIndex: n});
},
render: function render() {
const childToRender = this.props.children[this.state.activeIndex];
return (
<div className='tab-container'>
<Tabs
tabNames= {this.props.tabNames}
active = {this.state.active}
setTab = {this.setTab}
/>
<div className='tab-pane'>
{childToRender}
</div>
</div>
);
}
});
const TabContainer=React.createClass({
道具:{
选项卡名:React.PropTypes.arrayOf(React.PropTypes.string).isRequired
},
getInitialState:函数(){
返回{
活动索引:0
};
},
setTab:函数(n){
this.setState({activeIndex:n});
},
render:函数render(){
const childToRender=this.props.children[this.state.activeIndex];
返回(
{childToRender}
);
}
});
也就是说,只选择并呈现索引子级(为了简单起见,我省略了处理边缘情况的代码,其中this.props.children
不是数组
)
我发现这种方法并不令人满意,因为当用户选择不同的选项卡时,与要渲染的窗格相对应的组件被反复装载和卸载,并且窗格的任何状态都无法保留
最后,我使用了一种方法,即渲染所有子窗格,并为除所选窗格之外的所有窗格分配一个类隐藏
,然后使用该类将这些窗格设置为:显示:无
。当这个后来的解决方案被使用时,我的窗格即使在用户点击各个选项卡之后仍然保持挂载状态,并且在用户循环浏览选项卡时,它们的任何状态都没有丢失
我的问题是:
我认为最初的方法根本不是反模式。选择是否在逻辑中装载/卸载取决于您的环境。如果要保留状态,则不要卸载。如果您想要一个新的元素,需要调用
getInitialState
,那么卸载是正确的方法
作为一个简单的反例,考虑路由器的反应。路由器在路由更改时完全卸载/重新装载组件。而路径改变实际上只是一种更高阶的标签
但是考虑到你想保留国家的情况,我认为你的解决方案是正确的。您可能想看看material ui,它在选项卡中的作用非常类似:在您的问题中,您是否有兴趣使用其他库来管理应用程序状态(例如redux),或者是否希望保持纯粹的reactjs application.Nice,这可能值得注意。我想知道
height=0;溢出和隐藏
(在您提供的链接中使用)在触发(或不触发)特定的ReactJS生命周期事件方面与display:none有任何不同,或者纯粹是风格上的。@MarcusJuniusBrutus在某些浏览器中,有些情况下display none会产生一些意外的副作用,例如,在显示该容器之前,img不会加载。或者就是这个问题