【转】Airbnb React编码规范
用更合理的方式书写React和JSX
基本规则
- 每个文件只包含一个React组件;
- 但是无状态, 或者 Pure 组件 允许一个文件包含多个组件。eslint: react/no-multi-comp.
- 始终使用 JSX 语法;
- 不要使用 React.createElement方法,除非初始化 app 的文件不是 JSX 格式。
Class vs React.createClass vs stateless
如果组件拥有内部的 state 或者 refs 的时,更推荐使用 class extends React.Component,除非你有一个非常好的理由要使用 mixin。 eslint: react/prefer-es6-class
// bad
const Listing = React.createClass({
// ...
render() {
return <div>{this.state.hello}</div>;
}
}); // good
class Listing extends React.Component {
// ...
render() {
return <div>{this.state.hello}</div>;
}
}如果没有组件没有内部 state 或者 refs,那么普通函数 (不要使用箭头函数) 比类的写法更好:
// bad
class Listing extends React.Component {
render() {
return <div>{this.props.hello}</div>;
}
} // bad (因为箭头函数没有“name”属性)
const Listing = ({ hello }) => (
<div>{hello}</div>
); // good
function Listing({ hello }) {
return <div>{hello}</div>;
}
命名
- 扩展名:React 组件使用.jsx扩展名;
- 文件名:文件名使用帕斯卡命名。 例如: ReservationCard.jsx。
引用命名:React 组件使用帕斯卡命名,引用实例采用驼峰命名。 eslint: react/jsx-pascal-case
// bad
import reservationCard from './ReservationCard'; // good
import ReservationCard from './ReservationCard'; // bad
const ReservationItem = <ReservationCard />; // good
const reservationItem = <ReservationCard />;组件命名:组件名称应该和文件名一致, 例如: ReservationCard.jsx 应该有一个ReservationCard的引用名称。 但是, 如果是在目录中的组件, 应该使用 index.jsx 作为文件名 并且使用文件夹名称作为组件名:
// bad
import Footer from './Footer/Footer'; // bad
import Footer from './Footer/index'; // good
import Footer from './Footer';
声明
不要使用`displayName`属性来命名组件,应该使用类的引用名称。
// bad
export default React.createClass({
displayName: 'ReservationCard',
// stuff goes here
}); // good
export default class ReservationCard extends React.Component {
}
对齐
为 JSX 语法使用下列的对其方式。eslint: react/jsx-closing-bracket-location
// bad
<Foo superLongParam="bar"
anotherSuperLongParam="baz" /> // good
<Foo
superLongParam="bar"
anotherSuperLongParam="baz"
/>// 如果组件的属性可以放在一行就保持在当前一行中
<Foo bar="bar" /> // 多行属性采用缩进
<Foo
superLongParam="bar"
anotherSuperLongParam="baz"
>
<Quux />
</Foo>
引号
JSX 的属性都采用双引号,其他的 JS 都使用单引号。eslint: jsx-quotes
为什么这样做?JSX 属性 不能包含转义的引号, 所以当输入"don't"这类的缩写的时候用双引号会更方便。
标准的 HTML 属性通常也会使用双引号,所以 JSX 属性也会遵守这样的约定。
// bad
<Foo bar='bar' /> // good
<Foo bar="bar" /> // bad
<Foo style={{ left: "20px" }} /> // good
<Foo style={{ left: '20px' }} />
空格
终始在自闭合标签前面添加一个空格。
// bad
<Foo/> // very bad
<Foo /> // bad
<Foo
/> // good
<Foo />
属性
属性名称始终使用驼峰命名法。
// bad
<Foo
UserName="hello"
phone_number={12345678}
/> // good
<Foo
userName="hello"
phoneNumber={12345678}
/>当属性值等于true的时候,省略该属性的赋值。 eslint: react/jsx-boolean-value
// bad
<Foo
hidden={true}
/> // good
<Foo
hidden
/>
括号
用括号包裹多行 JSX 标签。 eslint: react/wrap-multilines
// bad
render() {
return <MyComponent className="long body" foo="bar">
<MyChild />
</MyComponent>;
} // good
render() {
return (
<MyComponent className="long body" foo="bar">
<MyChild />
</MyComponent>
);
} // good, when single line
render() {
const body = <div>hello</div>;
return <MyComponent>{body}</MyComponent>;
}
标签
当标签没有子元素时,始终时候自闭合标签。 eslint: react/self-closing-comp
// bad
<Foo className="stuff"></Foo> // good
<Foo className="stuff" />如果控件有多行属性,关闭标签要另起一行。 eslint: react/jsx-closing-bracket-location
// bad
<Foo
bar="bar"
baz="baz" /> // good
<Foo
bar="bar"
baz="baz"
/>
方法
在 render 方法中事件的回调函数,应该在构造函数中进行bind绑定。 eslint: react/jsx-no-bind
为什么这样做? 在 render 方法中的 bind 调用每次调用 render 的时候都会创建一个全新的函数。
// bad
class extends React.Component {
onClickDiv() {
// do stuff
} render() {
return <div onClick={this.onClickDiv.bind(this)} />
}
} // good
class extends React.Component {
constructor(props) {
super(props); this.onClickDiv = this.onClickDiv.bind(this);
} onClickDiv() {
// do stuff
} render() {
return <div onClick={this.onClickDiv} />
}
}React 组件的内部方法命名不要使用下划线前缀。
// bad
React.createClass({
_onClickSubmit() {
// do stuff
}, // other stuff
}); // good
class extends React.Component {
onClickSubmit() {
// do stuff
} // other stuff
}
排序
class extends React.Component的顺序:
- static静态方法
- constructor
- getChildContext
- componentWillMount
- componentDidMount
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- componentDidUpdate
- componentWillUnmount
- 点击回调或者事件回调 比如 onClickSubmit() 或者 onChangeDescription()
- render函数中的 getter 方法 比如 getSelectReason() 或者 getFooterContent()
- 可选的 render 方法 比如 renderNavigation() 或者 renderProfilePicture()
render
怎样定义 propTypes, defaultProps, contextTypes等
import React, { PropTypes } from 'react'; const propTypes = {
id: PropTypes.number.isRequired,
url: PropTypes.string.isRequired,
text: PropTypes.string,
}; const defaultProps = {
text: 'Hello World',
}; class Link extends React.Component {
static methodsAreOk() {
return true;
} render() {
return <a href={this.props.url} data-id={this.props.id}>{this.props.text}</a>
}
} Link.propTypes = propTypes;
Link.defaultProps = defaultProps; export default Link;React.createClass的排序:eslint: react/sort-comp
- displayName
- propTypes
- contextTypes
- childContextTypes
- mixins
- statics
- defaultProps
- getDefaultProps
- getInitialState
- getChildContext
- componentWillMount
- componentDidMount
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- componentDidUpdate
- componentWillUnmount
- 点击回调或者事件回调 比如 onClickSubmit() 或者 onChangeDescription()
- render函数中的 getter 方法 比如 getSelectReason() 或者 getFooterContent()
- 可选的 render 方法 比如 renderNavigation() 或者 renderProfilePicture()
- render
isMounted
不要使用 isMounted. eslint: react/no-is-mounted
为什么这样做? isMounted是一种反模式,当使用 ES6 类风格声明 React 组件时该属性不可用,并且即将被官方弃用。
扩展
- 上诉的规则,你可用通过eslint的react插件来完成配置:eslint-plugin-react ,javascript/packages/eslint-config-airbnb at master · airbnb/javascript · GitHub
- Fork了一个官方的repo,把规范翻译在这里,不仅有react的,还有两个很火的翻译版的ES5和ES6规则,强烈推荐没有读过的人读一下,对你了解ES6也是非常好的途径。GitHub - vikingmute/javascript: JavaScript Style Guide
【转】Airbnb React编码规范的更多相关文章
- eslint推荐编码规范和airbnb推荐编码规范
Eslint规范 for 循环禁止使用无限循环(这个非默认推荐) // bad for (var i = 0; i < 10; i--) { } for (var i = 10; i >= ...
- react编码规范
1.每个文件只写一个组件,但是多个无状态组件可以放在单个文件中: 2.有内部状态,方法或要对外暴露ref的组件,用类式组件: 3.无内部状态,方法或无需对外暴露ref的组件,用函数式组件: 4.有内部 ...
- Airbnb React/JSX 编码规范
Airbnb React/JSX 编码规范 算是最合理的React/JSX编码规范之一了 内容目录 基本规范 Class vs React.createClass vs stateless 命名 声明 ...
- 【转】JavaScript 风格指南/编码规范(Airbnb公司版)
原文转自:http://blog.jobbole.com/79484/ Airbnb 是一家位于美国旧金山的公司,本文是其内部的 JavaScript 风格指南/编码规范,在 Github 上有 11 ...
- JavaScript 编码规范(中文/Airbnb公司版)
Airbnb 是一家位于美国旧金山的公司,本文是其内部的 JavaScript编码规范,写得比较全面,在 Github 上有 16,686 + Star,3,080 + fork,前端开发人员可参考. ...
- HTML/CSS/JS编码规范
最近整理了一份HTML/CSS/JS编码规范,供大家参考.目录:一.HTML编码规范二.CSS编码规范三.JS编码规范 一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签 ...
- python编码规范、js编码规范及IDE的检查插件pylint/eslint等
一.python规范 参考:https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/的风格规范和语 ...
- 4.1 react 代码规范
关于 基础规范 组件结构 命名规范 jsx 书写规范 eslint-plugin-react 关于 在代码的设计上,每个团队可能都有一定的代码规范和模式,好的代码规范能够提高代码的可读性便于协作沟通, ...
- Android的编码规范
一.Android编码规范 1.学会使用string.xml文件 在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml 比如一个保存按钮 , 不规范写法: <Butt ...
随机推荐
- [poj 3537]Crosses and Crosses(博弈论)
题目:http://poj.org/problem?id=3537 题意:给你n个格子,两个人依次在n个格子的任意空位置画"X",谁如果画了一个后,3个X连在了一起,那么那个人就获 ...
- JavaScript学习笔记- 省市级联效果
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- spring MVC学习笔记
为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平.你的一个决定会影响团队未来的几年.要考虑方面太多: 1.简单易用,以提高开发效率.使小部分的精力在框架上,大部 ...
- ThreadLocal类学习笔记
这个类在java1.2中就出现了,线程独有的变量(每个线程都有一份变量),使用它的好处之一就是可以少传许多参数. 在哪里用到它呢?有连接池的地方就有它的身影,连接池包括数据库连接池,网络连接池等. i ...
- 【Zeyphr】分页查询与修改
分页查询: return this.GetDynamicListWithPaging(ParamQuery.Instance() .From("P_Resume") .AndWhe ...
- 【原创·总结】影响sql查询性能的因素
1.表定义 (1)如果字符串字段是经常需要用到的,可以冗余,否则不要冗余 (2)经常需要作为where的查询条件的字段,可以建索引:但是过多的索引会影响写入时的性能 (3)合理定义字段的数据类型 ( ...
- .NET中的GDI+
GDI:Graphics Device Interface. System. Windows. Shapes 命名空间: 类 Ellipse 绘制一个椭圆. Line 在两个点之间绘制一条直线. Pa ...
- 评价指标ROC,PR
之前实习的时候一直见公司里面的人说什么AUC, 实际AUC就是ROC曲线的面积 PR是precise和recall曲线,和ROC的区别是,当测试集中的正负样本分布变化的时候,ROC曲线能够保持不变,而 ...
- java.io.FileNotFoundException: D:\xxx\yyy (拒绝访问。)问题
File file=new File(fileAllName); FileWriter fw=new FileWriter(file); 在Java的 FileWriter 方法时 系统抛出了异常 j ...
- lucene-查询query->WildcardQuery使用通配符搜索
Lucene也提供了通配符的查询,这就是WildcardQuery. package ch11; import org.apache.lucene.analysis.standard.Standard ...