Try*_*ace 7 tabs class backbone.js reactjs twitter-bootstrap-3
所以我有一个tab-component有3个项目:
React.DOM.ul( className: 'nav navbar-nav',
MenuItem( uid: 'home')
MenuItem( uid: 'about')
MenuItem( uid: 'contact)
)
Run Code Online (Sandbox Code Playgroud)
而在.render中MenuItem:
React.DOM.li( id : @props.uid, className: @activeClass, onClick: @handleClick,
React.DOM.a( href: "#"+@props.uid, @props.uid)
)
Run Code Online (Sandbox Code Playgroud)
每次我点击一个项目,都会调用一个骨干路由器,然后调用tab-component它,然后调用一个page-component.
我仍然试图绕过一个基本上是单向数据流的事实.我已经习惯了直接操作DOM.
我想要做的是将.active类添加到单击的选项卡中,并确保将其从不活动的选项卡中删除.
我知道CSS技巧,您可以使用data-属性并将不同的样式应用于true或的属性false.
骨干路由器已经获得了变量uid并调用了正确的页面.我只是不确定如何最好地切换选项卡之间的类,因为只有一个可以同时处于活动状态.
现在我可以记录选择哪个选项卡,并切换它们等等.但是React.js已经具有这种记录保存功能.
在@handleClick你看,我甚至不希望使用的,因为路由器应该告诉tab-component这些人给的className: '.active',我想避免的jQuery,因为React.js并不需要直接的DOM操作.
我已经尝试了@state的一些东西,但我知道确实有一种非常优雅的方式来实现这个相当简单,我想我看过一些人的演示或视频.
我真的必须习惯并改变我的思维方式来思考React-ively.
只是寻找一种最佳实践方式,我可以用一种非常丑陋和笨重的方式来解决它,但我喜欢React.js,因为它非常简单.
Ros*_*len 23
将状态推到尽可能高的组件层次结构中,并props在下面的所有级别上处理不可变的状态.似乎有意义的是将活动选项卡存储在您的数据中tab-component并生成关闭数据的菜单项(this.props在本例中)以减少代码重复:
以下示例的工作JSFiddle +一个Backbone路由器: http ://jsfiddle.net/ssorallen/4G46g/
var TabComponent = React.createClass({
getDefaultProps: function() {
return {
menuItems: [
{uid: 'home'},
{uid: 'about'},
{uid: 'contact'}
]
};
},
getInitialState: function() {
return {
activeMenuItemUid: 'home'
};
},
setActiveMenuItem: function(uid) {
this.setState({activeMenuItemUid: uid});
},
render: function() {
var menuItems = this.props.menuItems.map(function(menuItem) {
return (
MenuItem({
active: (this.state.activeMenuItemUid === menuItem.uid),
key: menuItem.uid,
onSelect: this.setActiveMenuItem,
uid: menuItem.uid
})
);
}.bind(this));
return (
React.DOM.ul({className: 'nav navbar-nav'}, menuItems)
);
}
});
Run Code Online (Sandbox Code Playgroud)
除了附加类名并公开click事件之外,MenuItem可以做的很少:
var MenuItem = React.createClass({
handleClick: function(event) {
event.preventDefault();
this.props.onSelect(this.props.uid);
},
render: function() {
var className = this.props.active ? 'active' : null;
return (
React.DOM.li({className: className},
React.DOM.a({href: "#" + this.props.uid, onClick: this.handleClick})
)
);
}
});
Run Code Online (Sandbox Code Playgroud)