Airbnb的编码规范是在业界非常流行的一套规范,而且它一直都在进化,推出最新技术的规范

用更合理的方式书写React和JSX

基本规则

  • 每个文件只包含一个React组件;

  • 始终使用 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的顺序:

  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()
  13. 可选的 render 方法 比如 renderNavigation() 或者 renderProfilePicture()
  14. 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

  1. displayName
  2. propTypes
  3. contextTypes
  4. childContextTypes
  5. mixins
  6. statics
  7. defaultProps
  8. getDefaultProps
  9. getInitialState
  10. getChildContext
  11. componentWillMount
  12. componentDidMount
  13. componentWillReceiveProps
  14. shouldComponentUpdate
  15. componentWillUpdate
  16. componentDidUpdate
  17. componentWillUnmount
  18. 点击回调或者事件回调 比如 onClickSubmit() 或者 onChangeDescription()
  19. render函数中的 getter 方法 比如 getSelectReason() 或者 getFooterContent()
  20. 可选的 render 方法 比如 renderNavigation() 或者 renderProfilePicture()
  21. render

isMounted

扩展

【转】Airbnb React编码规范的更多相关文章

  1. eslint推荐编码规范和airbnb推荐编码规范

    Eslint规范 for 循环禁止使用无限循环(这个非默认推荐) // bad for (var i = 0; i < 10; i--) { } for (var i = 10; i >= ...

  2. react编码规范

    1.每个文件只写一个组件,但是多个无状态组件可以放在单个文件中: 2.有内部状态,方法或要对外暴露ref的组件,用类式组件: 3.无内部状态,方法或无需对外暴露ref的组件,用函数式组件: 4.有内部 ...

  3. Airbnb React/JSX 编码规范

    Airbnb React/JSX 编码规范 算是最合理的React/JSX编码规范之一了 内容目录 基本规范 Class vs React.createClass vs stateless 命名 声明 ...

  4. 【转】JavaScript 风格指南/编码规范(Airbnb公司版)

    原文转自:http://blog.jobbole.com/79484/ Airbnb 是一家位于美国旧金山的公司,本文是其内部的 JavaScript 风格指南/编码规范,在 Github 上有 11 ...

  5. JavaScript 编码规范(中文/Airbnb公司版)

    Airbnb 是一家位于美国旧金山的公司,本文是其内部的 JavaScript编码规范,写得比较全面,在 Github 上有 16,686 + Star,3,080 + fork,前端开发人员可参考. ...

  6. HTML/CSS/JS编码规范

    最近整理了一份HTML/CSS/JS编码规范,供大家参考.目录:一.HTML编码规范二.CSS编码规范三.JS编码规范 一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签 ...

  7. python编码规范、js编码规范及IDE的检查插件pylint/eslint等

    一.python规范 参考:https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/的风格规范和语 ...

  8. 4.1 react 代码规范

    关于 基础规范 组件结构 命名规范 jsx 书写规范 eslint-plugin-react 关于 在代码的设计上,每个团队可能都有一定的代码规范和模式,好的代码规范能够提高代码的可读性便于协作沟通, ...

  9. Android的编码规范

    一.Android编码规范 1.学会使用string.xml文件 在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml 比如一个保存按钮 , 不规范写法: <Butt ...

随机推荐

  1. 转一篇Unity的相机动画控制

    最近真是忙,连研究细看的时间都没有了,原帖地址:https://alastaira.wordpress.com/2013/11/08/smooth-unity-camera-transitions-w ...

  2. 东大OJ-1544: GG的战争法则

    题目描述 你在桥上看风景 看风景的人在楼上看你 明月装饰了你的窗子 你装饰了我的梦 这是GG在长坂坡发出的感叹. 三年前GG莫名的穿越到了三国时期,在这三年里他看尽了各种杀戮,心里早已麻木.GG他渴望 ...

  3. 《Javascript DOM编程艺术》 读书笔记 —— 好书,通俗易懂!!!!! 相当的严谨!!!!

    1.javascript弱类型语言,解释性语言. 2.javascript数据类型:字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空( ...

  4. springMvc发布restFull风格的URL

    package zpark.controller; import org.springframework.stereotype.Controller; import org.springframewo ...

  5. Ubuntu14.04安装JDK与配置环境变量

    工具/原料 Ubuntu14.04系统 方法/步骤   先从Oracle官网下载JDK.先选择同意按钮,然后根据自己的系统下载相应版本.我的系统是Ubuntu14.04 64位的,所以我下载 2 创建 ...

  6. 【POJ 1556】The Doors 判断线段相交+SPFA

    黑书上的一道例题:如果走最短路则会碰到点,除非中间没有障碍. 这样把能一步走到的点两两连边,然后跑SPFA即可. #include<cmath> #include<cstdio> ...

  7. 树分治 点分治poj 2114

    存在2点间距离==k 输出AYE 否则输出NAY #include<stdio.h> #include<string.h> #include<algorithm> ...

  8. 浏览器XMLHttpRequest案例

    /* Cross-Browser XMLHttpRequest v1.2 ================================= Emulate Gecko 'XMLHttpRequest ...

  9. Spring注解@PostConstruct与@PreDestroy

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...

  10. Servlet、Filter和Listener

    Java Servlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端 ...