最近在学习使用React作为前端的框架,《React使用笔记》系列用于记录过程中的一些使用和解决方法。
本文记录创建头部组件的过程。
react-bootstrap
想要在react中使用bootstrap吗?
如果只是需要使用样式相关的,可以在tempaltes的index.ejs中引用css文件就可以。
1
| <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css">
|
如果你还想要使用bootstrap的组件,那么就可以使用react-bootstrap库啦。
安装react-bootstrap
1
| $ npm install react-bootstrap --save
|
1
| <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css">
|
导入相关组件
react-bootstrap的组件都需要一一导入。
1 2 3
| import Button from 'react-bootstrap/lib/Button'; import { Button } from 'react-bootstrap';
|
使用
使用方法如下,其中组件会有大写的标签,以及一定的属性。
1 2 3
| <Button bsStyle="success" bsSize="small" onClick={someCallback}> Something </Button>
|
具体每个组件的使用方法可到组件库中查看。
创建头部菜单
该头部菜单与前一个AngularJS使用笔记中完全一致。如图:
添加头部组件
- 在components文件夹中添加header.jsx文件
- 定义并输出Header组件
1 2 3 4 5 6 7 8
| import React from 'react'; const Header = React.createClass({ render() { return <header>暂时头部</header>; } }); module.exports = Header;
|
- 在components中的index.jsx中使用该组件
1 2 3 4 5 6
| import Header from './header.jsx'; const Index = React.createClass({ render() { return <Header></Header>; } });
|
此时我们可以在/index路由页面看到头部了。
接下来会运用到react有关的Props/State和生命周期,大家如果不是很清楚可以翻上一篇《React使用笔记3–组件的State/Props与生命周期》进行预热。
添加属性Props
由于菜单的内容不变,我们可以将其写成Props属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| propTypes: { menus: React.PropTypes.array, usermenus: React.PropTypes.array, }, getDefaultProps: function() { return { menus: [{ title: 'index', href: '/index', text: '首页', }, { title: 'others', href: '/other', text: '其他', }], usermenus: [{ click: function(){}, text: '退出', }], }; },
|
添加state状态
像时间这种每500毫秒刷新一次的,我们将其放在state中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| getInitialState: function() { return {clock: ''}; }, clockRender: function(){ let numberStandard = function(num) { let _val = Number(num), _num; _num = (_val < 10) ? ('0' + _val) : ('' + _val); return _num; }, _date = new Date(), clock = _date.getFullYear() + '年' + (_date.getMonth() + 1) + '月' + _date.getDate() + '日' + ' ' + numberStandard(_date.getHours()) + ':' + numberStandard(_date.getMinutes()) + ':' + numberStandard(_date.getSeconds()); this.setState({clock: clock}); },
|
注意:state不应存储计算后的值,计算应该在render中进行,但由于比较长,本骚年也就这样将就用了。小伙伴们有更好的方法也可以提出来哦。
setInterval时钟
在componentDidMount中进行setInterval时钟。componentDidMount属于react生命周期,在初始化渲染执行之后立刻调用一次,仅客户端有效。
render就是一个模板的作用,他只处理和展示相关的逻辑,如果有业务逻辑,应放在componentWillMount和componentDidMount中执行。
1 2 3 4 5 6 7 8 9 10 11
| componentDidMount: function(){ let that = this; this.interval = setInterval(function() { that.clockRender(); }, 500); }, componentWillUnmount: function(){ clearInterval(this.interval); },
|
设置render模板
在这里大家可以看到react-bootstrap的使用方法啦。当然每个组件都是已经在该文件中引入了的。
还有jsx的遍历方法也会在这里展示。
- 在index.jsx页面引入Header时添加属性active=”index”,作为菜单选中样式的判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| render() { return ( let active = this.props.active; <Navbar className="header" fluid> <Navbar.Header className="navbar-header"> <Navbar.Brand>Godbasin</Navbar.Brand> </Navbar.Header> <Navbar.Collapse id="bs-example-navbar-collapse-1"> <Nav navbar> { //遍历头部菜单menus this.props.menus.map(function(menu, i) { //判断,若title等于active,则加载选中样式 return (<li key={i} className={ menu.title == active ? "active" : ""}><a href={menu.href}>{ menu.text }<span className="sr-only">(current)</span></a></li>); }) } </Nav> <Nav navbar pullRight> <li><a>{ this.state.clock }</a></li> <NavDropdown title="菜单" id="top-aside-menu"> { //遍历右侧下拉菜单usermenus this.props.usermenus.map(function(usermenu,i) { return (<MenuItem key={i}>{ usermenu.text }</MenuItem>); }) } </NavDropdown> </Nav> </Navbar.Collapse> </Navbar> ) }
|
结束语
不得不说框架之间的切换还是有很多问题呢,这时候需要的就是坚持不懈地学习和排除bug啦。
当然本骚年本来还想用ES6装装逼的,奈何不熟练的使用后果就是很多报错,看来也还是要加强ES6语法呀。
此处查看项目代码(仅包含app部分)
此处查看页面效果
查看Github有更多内容噢:https://github.com/godbasin
更欢迎来被删的前端游乐场边撸猫边学前端噢