我正在尝试使用Reach JSX做一些与 JQuery一样简单的事情,但我无法在JSX中弄明白.我尽可能简化了示例,问题归结为: 我正在渲染一些标签页,我希望第一个标签使用特定的类名进行渲染,这样
我正在渲染一些标签页,我希望第一个标签使用特定的类名进行渲染,这样我就可以将其设置为不同的样式(默认选中的标签).
我的Html看起来像:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Tabs</title> <script src="http://img.558idc.com/uploadfile/allimg/210615/1924044056-0.jpg"></script> <script src="http://img.558idc.com/uploadfile/allimg/210615/1924046412-1.jpg"></script> <script src="http://img.558idc.com/uploadfile/allimg/210615/192404IL-2.jpg"></script> </head> <body> <div id="content"></div> <script type="text/jsx" src="tabs.js"></script> <script type="text/jsx"> /** * @jsx React.DOM */ React.renderComponent(<Tabs><Tab title="Tab1"></Tab><Tab title="Tab2"></Tab></Tabs>, document.getElementById('content')); </script> </body> </html>
我的JSX看起来像:
/** * @jsx React.DOM */ var Tab = React.createClass({ render: function() { return ( <li className="tab"> {this.props.title} </li> ); } }); var Tabs = React.createClass({ render: function() { return ( <ul className="tabs"> {this.props.children} </ul> ); } });
我想在第一个表上放一个类名,如“选中”或“活动”,但我无法弄清楚如何做到这一点.
有人可以帮忙吗?
您说您要选择第一个选项卡并为其分配className.我认为它的解决方案相当简单,与此类似(我没有测试它):React.renderComponent(<Tabs><Tab isSelected = true title="Tab1"></Tab><Tab title="Tab2"></Tab></Tabs>, document.getElementById('content')); var Tab = React.createClass({ render: function() { return ( <li className={"tab " + (this.props.isSelected ? "selected" :"") }> {this.props.title} </li> ); } });
但是看看你的用例,即你正在尝试实现一个tabs元素,我认为你应该实现一个Tabs组件来管理所选标签的当前状态.这是一个你可以开始的例子:
http://jsfiddle.net/kb3gN/7180/
var TabHeader = React.createClass({ render: function() { return ( <li className={"tabHeader " + this.props.className} onClick={this.props.onClick}> {this.props.header} </li> ); } }); var TabContent = React.createClass({ render: function() { return ( <div className={"tabContent " + this.props.className}> {this.props.content} </div> ); } }); var Tabs = React.createClass({ getInitialState: function(){ return { selectedTabNo : this.props.initialSelected ? this.props.initialSelected : 0 } }, getHeaderClass : function(i){ return this.state.selectedTabNo == i ? "selected" : ""; }, getContentClass : function(i){ return this.state.selectedTabNo == i ? "selected" : "hidden"; }, handleClick: function(i,e){ this.setState({selectedTabNo:i}); e.preventDefault(); }, render: function() { var headers = []; var i = 0; this.props.tabs.forEach(function(tab){ headers.push(<TabHeader header={ tab.header } key={"tab"+i} onClick = {this.handleClick.bind(this,i)} className = {this.getHeaderClass(i)} />); i++; }.bind(this)); var contents = []; i=0; this.props.tabs.forEach(function(tab){ contents.push(<TabContent content={ tab.content } key={"content"+i} className = {this.getContentClass(i)} />); i++; }.bind(this)); return ( <div className="tabsContainer"> <ul className="tabHeadings"> {headers} </ul> {contents} </div> ); } }); var App = React.createClass({ render: function() { return( <Tabs initialSelected={2} tabs={[{header:"step1", content:<div>This is page 1</div>}, {header:"step2", content:<div>This is page 2</div>}, {header:"step3", content:<div>This is page 3</div>} ]} /> ); } }); React.render(<App />, document.body);