【转】Airbnb React编码规范

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

原文:https://zhuanlan.zhihu.com/p/20616464

用更合理的方式书写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

扩展

时间: 2024-10-24 08:03:49

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

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

Eslint规范 for 循环禁止使用无限循环(这个非默认推荐) // bad for (var i = 0; i < 10; i--) { } for (var i = 10; i >= 0; i++) { } // good for (var i = 0; i < 10; i++) { } 不允许和负0比较 // bad if (x === -0) { // doSomething()... } // good if (x === 0) { // doSomething()... }

react编码规范

1.每个文件只写一个组件,但是多个无状态组件可以放在单个文件中 2.有内部状态,方法或要对外暴露ref的组件,用类式组件 3.无内部状态,方法或无需对外暴露ref的组件,用函数式组件 4.有内部状态,方法或要对外暴露ref的组件,使用es7类静态属性 class Button extends Component { static propTypes = { size: React.PropTypes.oneOf(['large','normal','small']), shape: React.

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

原文转自:http://blog.jobbole.com/79484/ Airbnb 是一家位于美国旧金山的公司,本文是其内部的 JavaScript 风格指南/编码规范,在 Github 上有 11,000+ Star,2100+ fork,前端开发者可参考. 基本类型:当你访问基本类型时,你是直接对它的值进行操作. string number boolean null undefined 1 2 3 4 5 6 var foo = 1, bar = foo; bar = 9; console

HTML/CSS/JS编码规范

最近整理了一份HTML/CSS/JS编码规范,供大家参考.目录:一.HTML编码规范二.CSS编码规范三.JS编码规范 一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签要写alt属性,如果没有就写一个空的.但是一般要写一个有内容的,根据图片想要表达的意思,因为alt是在图片无法加载时显示的文字.如下不太好的写法: <img src="company-logo.svg" alt="ABC Company Logo"> 更好的

java编码规范

右括号") "与其后面的关键字之间,关键字与其后面的左括号"("或"{"之间,以及"}"与"{"之间,要以一个空格隔开:除". "外,所有二元操作符的前.后要加空格:在逗号后边加一个空格. 说明: 一个紧跟着括号的关键词应该被空格分开: 空白应该位于参数列表中逗号的后面: 所有的二元运算符,除了".",应该使用空格将之与操作数分开.一元操作符和操作数之间不应该加空格,

我也学php:编码规范/翻译自PSR

PHP社区百花齐放,拥有大量的函数库.框架和组件.PHP开发者通常会在自己的项目中使用若干个外部库,因而PHP代码遵循或尽量接近同一个代码风格就非常重要,可以让开发者方便地把多个代码库集成在自己的项目中. 框架互操作组(即PHP标准组)发布了一系列代码风格推荐标准,即PSR-0,PSR-1,PSR-2和PSR-3. 不要让这些名称所混淆,这些推荐仅是一些被其它项目所遵循的规则,如Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Li

阿里Java编码规范

详细,全面 很不错 阿里 Java编码规范

html编码规范

不久前接到老大下达的任务,要拟定一份公司前端编码规范的草稿,参考了各大公司的编码规范,结合现在公司的特点,整理出以下编码规范: html规范 1 文件相关 (1) 文件名以英文为主,可以使用下划线(如active.html),压缩包以项目名+日期的形式. (2) 统一使用utf-8编码. (3) css.js发布到线上都需要压缩. (4) 在追求高度优化的站点,需要对图片也进行无损压缩. 2 代码风格 2.1 命名 (1) 元素 id 必须保证页面唯一.(解释:同一个页面中,不同的元素包含相同的

Bootstrap编码规范

黄金定律 永远遵循同一套编码规范 -- 可以是这里列出的,也可以是你自己总结的.如果你发现本规范中有任何错误,敬请指正.通过 open an issue on GitHub为本规范添加或贡献内容. 不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的. HTML 语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 嵌套元素应当缩进一次(即两个空格). 对于属性的定义,确保全部使用双引号,绝不要使用单引号. 不要在自闭合(self-clo