代码通过 eslint(在根目录运行 npm run lint
),具体规范参见: https://github.com/airbnb/javascript
- js 模块采用 es2015 格式,主体代码放在 src 目录下,根目录 index.js 仅引用 src 下相关文件
- 若用到了 jsx 语法或 es6 特性,文件后缀名请改做 jsx,文件内请不要包含
/** @jsx React.DOM */
- src 目录模块如果返回值是个类,则文件名首字母大写
- 测试用例文件名以 .spec.js(jsx) 结尾
- 测试用例文件名推荐和 src 下源码对应,比如 src/Calendar.jsx 对应于 tests/Calendar.spec.jsx
- 测试用例入口文件名为 index.spec.js,推荐里面只应 import 其他测试用例
- 生成 React 组件类使用 React.createClass,不要使用 es6 class, es6 class 无法实现 mixin 功能, 并且不能自动绑定
var Component = React.createClass({
onClick() {
// ...
},
render() {
return <div onClick={this.onClick}/>;
}
});
- log 可以使用 https://www.npmjs.com/package/warning
- 公共包通过 npm install 后,js 中可以 import node_modules 下的公共包 js,但不可以 import css
- 使用 propType 制定 react 组件属性的类型
- 只能 import 'react' 不可以 import 'react/lib/xx'
- 禁止使用 jquery 等大而全的类库
- React 类必须用一个变量声明
Menu.js
import React from 'react';
var Menu = React.createClass({
propTypes: {
active: React.PropTypes.bool
}
});
export default Menu;
- 组件根节点样式名默认为 rc- 加上小写组件名,组件名单词间以 - 分隔,允许通过 prefixCls 定制
- 组件内部的样式名都要以 prefixCls 为前缀
- 组件允许用户通过 className 定制样式名
var Menu = React.createClass({
render: function(){
var prefixCls = this.props.prefixCls;
var className = prefixCls || "rc-menu";
if(this.props.className){
className += ' '+this.props.className;
}
return (<div className={className}> <span className={prefixCls + "-title"}></span> TODO</div>);
}
});
- 组件是 react-component 而不是 react-bootstrap,不要把一些 bootstrap 的样式生搬过来,例如
var Dialog = React.createClass({
render: function(){
return <div className='modal-dialog rc-dialog'>
<div className='rc-dialog-header modal-header'></div>
</div>
}
});
组件和 bootstrap css 绑定过紧,样式和 js 不一致,建议通过属性来解决:
var Dialog = React.createClass({
render: function(){
var prefixCls = this.props.prefixCls;
return <div className={prefixCls}>
<div className={prefixCls + "-header"}></div>
</div>
}
});
<Dialog prefixCls="modal" />