前言

一般在团队开发中每个人的代码习惯都不太一样,这样就会导致代码风格不一致,以致于维护和修改bug的时候看别人的代码成为一种痛苦...
这种情况尤其在前端开发中尤为明显。因为关于前端的开发规范貌似也没有行业权威标准。这几天在网上看了下,基本上在开发中通过eslint进行约束,airbnb的标准貌似颇为推崇,今天稍微整理下,准备在日后开发中形成习惯。

基本规则

  1. 每个文件只包含一个React组件。eslint: react/no-multi-comp;(官方表示在无状态,或者Pure组件允许一个文件包含多个组件,但是我个人觉得一个文件只包含一个组件比较浅显易懂)
  2. 始终使用JSX语法;
  3. 不要始终React.createElement方法,除非初始化app的文件不是JSX格式;

Class vs React.createClass vs stateless

  1. 如果组件拥有内部的state或者refs时,更推荐使用class extends 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>;
}

命名

  1. 拓展名:React组件使用.jsx扩展名;
  2. 文件名:文件名使用帕斯卡命名:HomePage.jsx
  3. 引用命名:React组件使用帕斯卡命名,引用实例采用驼峰式命名:eslint: react/jsx-pascal-case)(个人不喜欢这样,引用命名还是按照帕斯卡命名)

// bad
import reservationCard from './ReservationCard'; // good
import ReservationCard from './ReservationCard'; // bad
const ReservationItem = <ReservationCard />; // good
const reservationItem = <ReservationCard />;

声明

不要使用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都使用单引号:jsx-quotes
为什么这样做?JSX 属性 不能包含转义的引号, 所以当输入"don't"这类的缩写的时候用双引号会更方便。


// 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 />

属性

  1. 属性名称始终使用驼峰命名法。

// bad
<Foo
UserName="hello"
phone_number={12345678}
/> // good
<Foo
userName="hello"
phoneNumber={12345678}
/>
  1. 当属性值等于true的时候,省略该属性的赋值。eslint:react/jsx-boolean-value

// bad
<Foo
hidden={true}
/> // good
<Foo
hidden
/>

括号

使用括号包裹多行JSX标签,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>;
}

标签

  1. 当标签没有子元素的时候,始终使用自闭合的标签:eslint: react/self-closing-comp

// bad
<Foo className="stuff"></Foo> // good
<Foo className="stuff" />
  1. 如果控件有多行属性,关闭标签要另起一行。 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} />
}
}
  1. React 组件的内部方法命名不要使用下划线前缀。

// bad
React.createClass({
_onClickSubmit() {
// do stuff
}, // other stuff
}); // good
class extends React.Component {
onClickSubmit() {
// do stuff
} // other stuff
}

排序

class extends React.Component的顺序:

  1. static静态方法
  2. constructor
  3. getChildContext
  4. componentWillMount
  5. componentDidMount
  6. componentWillReceiveProps
  7. shouldComponentUpdate
  8. componentWillUpdate
  9. componentDidUpdate
  10. componentWillUnmount
  11. 点击回调或者事件回调 比如 onClickSubmit() 或者 onChangeDescription()
  12. render函数中的 getter 方法 比如 getSelectReason() 或者 getFooterContent()

可选的 render 方法 比如 renderNavigation() 或者 renderProfilePicture()

  1. 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 &lt;a href={this.props.url} 关于这个开发规范差不多就这样吧,eslint的配置个人在研究下,下次再放出来</p> 来源:https://segmentfault.com/a/1190000017263310

React代码开发规范的更多相关文章

  1. php与数据库代码开发规范

    php与数据库代码开发规范 1/25/2016 6:00:31 PM php对各类变量命名规范 目录名 文件命名 局部变量命名 使用英文动词名词,用下划线作为单词的分割,所有字母均使用小写 目录 up ...

  2. C#代码开发规范

    Wrod下载           C#代码开发规范     文件状态: [√] 草稿 [  ] 正式 [  ] 修改 文件标识: 当前版本: 1.1 作    者: Empty 联系电话: 最后更新: ...

  3. JAVA 代码开发规范

    一.开发工具规范: 1. 开发工具经项目负责人调试后统一确定. 2. 开发工具一经确定不允许集成任何非统一插件,若有需要,经项目负责人同意后统一为 项目组成员添加. 3. 开发工具的编码格式不允许修改 ...

  4. iOS 代码开发规范

    最近公司因为业务增多,又招了一个iOS小伙伴,内心无比开心呀.但是多了一个人,日常代码开发就要统一规范起来,方便日后维护和查找.下边列一下我日常用到一些代码规范. (一).SVN规范 1.代码一定要先 ...

  5. react组件开发规范(一)

    这是通过修改项目运行在Google上时的警告,总结的的部分react组件开发规范: (1)编写组件时,一定要写PropTypes,切莫为了省事儿而不写! 如果一个Props不是required,一定在 ...

  6. IDEAL葵花宝典:java代码开发规范插件 p3c

    前言: P3C插件 是阿里巴巴p3c项目组进行研发.这个项目组是阿里巴巴开发爱好者自发组织形成的虚拟项目组,根据<阿里巴巴Java开发规范>转化而成的自动化插件,并且实现了部分自动编程. ...

  7. python代码开发规范

    https://github.com/libo-sober/LearnPython/tree/master/day18 为什么要有模块? 拿来主义,提高开发效率. 便于管理维护. 什么是脚本呢? 脚本 ...

  8. Eclipse的tab键为4个空格完整方法 附:阿里代码开发规范书

    开发规范书:http://pan.baidu.com/s/1dESdyox 1.点击 window->preference-,依次选择 General->Editors->Text ...

  9. react组件开发规范总结

    开发react也有一段时间了,一开始的随手写,生命周期乱用,无状态组件的不熟悉.现在逐渐规范一下,从网上各个地方copy过来,整理出一份文档.可能不全,后续还得多提炼总结和完善. 一.组件内方法书写, ...

随机推荐

  1. 如何快速系统学会使用SPSS?

    SPSS是一款数据统计与数据分析工具,操作简单属于数据分析的入门工具. 想要灵活使用SPSS,需要掌握两个方面内容:数据分析相关知识.SPSS操作 1 数据分析 在使用数据分析工具之前,首先要了解数据 ...

  2. 开源搜索引擎排名第一,Elasticsearch是如何做到的?

    一.引言 随着移动互联网.物联网.云计算等信息技术蓬勃发展,数据量呈爆炸式增长.如今我们可以轻易得从海量数据里找到想要的信息,离不开搜索引擎技术的帮助. ​ 作为开源搜索引擎领域排名第一的 Elast ...

  3. centos6.8上安装部署 jhipster-registry

    必备环境:jdk8,git,maven 1.安装nodejs #由于采用编译的方式很容易出现一些意外的惊喜,所以我们这儿直接用yum命令安装 #1.查看nodejs版本(命令中不要加 -y 如果版本不 ...

  4. 使用tensorflow2识别4位验证码及思考总结

    在学习了CNN之后,自己想去做一个验证码识别,网上找了很多资料,杂七杂八的一大堆,但是好多是tf1写的,对tf1不太熟悉,有点看不懂,于是自己去摸索吧. 摸索的过程是异常艰难呀,一开始我直接用capt ...

  5. 用python导入20个G的json数据到Mysql数据库

    整体思路参考资料:https://blog.csdn.net/layman2016/article/details/79252499 作业:有一个16个G的跟疫情相关的json新闻大数据(articl ...

  6. 服务发现Eureka、zookeeper、consul

    Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态). ...

  7. 记得设置docker日志文件大小!!!!!

    # vim /etc/docker/daemon.json { "log-driver":"json-file", "log-opts": ...

  8. 【Android】Listview返回顶部,快速返回顶部的功能实现,详解代码。

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...

  9. MaterialPropertyBlock

    在unity中,有这样一种情形,有许多的物体,都使用了相同的材质球,但是呢,具体的细节又有些微的不同,如果想要些微的改变每一个 网格的颜色,改变 渲染状态是不行的. 这时,就可以使用MaterialP ...

  10. Postman发送POST请求到Spring Boot的正确姿势

    最近用Spring Boot搭建了一些restful api,写起来真的很爽.但是当用Postman测试一些POST请求的接口的时候却遇到一些问题,上网冲浪查了一堆博客资料,发现都讲得不清不楚,于是记 ...