博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Airbnb React编码规范
阅读量:5876 次
发布时间:2019-06-19

本文共 5030 字,大约阅读时间需要 16 分钟。

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

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

基本规则

  • 每个文件只包含一个React组件;
    • 但是 允许一个文件包含多个组件。eslint: .
  • 始终使用 JSX 语法;
  • 不要使用 React.createElement方法,除非初始化 app 的文件不是 JSX 格式。

Class vs React.createClass vs stateless

  • 如果组件拥有内部的 state 或者 refs 的时,更推荐使用 class extends React.Component,除非你有一个非常好的理由要使用 mixin。 eslint:

    // badconst Listing = React.createClass({  // ...  render() {    return 
    {this.state.hello}
    ; }});// goodclass Listing extends React.Component { // ... render() { return
    {this.state.hello}
    ; }}

      

    如果没有组件没有内部 state 或者 refs,那么普通函数 (不要使用箭头函数) 比类的写法更好:

    // badclass Listing extends React.Component {  render() {    return 
    {
    this.props.hello}
    ; }}// bad (因为箭头函数没有“name”属性)const Listing = ({ hello }) => (
    {hello}
    );// goodfunction Listing({ hello }) { return
    {hello}
    ;}

     

命名

  • 扩展名:React 组件使用.jsx扩展名;
  • 文件名:文件名使用帕斯卡命名。 例如: ReservationCard.jsx。
  • 引用命名:React 组件使用帕斯卡命名,引用实例采用驼峰命名。 eslint:

    // badimport reservationCard from './ReservationCard';// goodimport ReservationCard from './ReservationCard';// badconst ReservationItem = 
    ;// goodconst reservationItem =
    ;

      

  • 组件命名:组件名称应该和文件名一致, 例如: ReservationCard.jsx 应该有一个ReservationCard的引用名称。 但是, 如果是在目录中的组件, 应该使用 index.jsx 作为文件名 并且使用文件夹名称作为组件名:

    // badimport Footer from './Footer/Footer';// badimport Footer from './Footer/index';// goodimport Footer from './Footer';

     

声明

  • 不要使用`displayName`属性来命名组件,应该使用类的引用名称。

    // badexport default React.createClass({  displayName: 'ReservationCard',  // stuff goes here});// goodexport default class ReservationCard extends React.Component {}

     

对齐

  • 为 JSX 语法使用下列的对其方式。eslint:

    // bad
    // good

     

    // 如果组件的属性可以放在一行就保持在当前一行中
    // 多行属性采用缩进

     

引号

  • JSX 的属性都采用双引号,其他的 JS 都使用单引号。eslint:

    为什么这样做?JSX 属性 , 所以当输入"don't"这类的缩写的时候用双引号会更方便。

    标准的 HTML 属性通常也会使用双引号,所以 JSX 属性也会遵守这样的约定。

    // bad  
    // good
    // bad
    // good

      

空格

  • 终始在自闭合标签前面添加一个空格。

    // bad
    // very bad
    // bad
    // good

     

属性

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

    // bad
    // good

     

  • 当属性值等于true的时候,省略该属性的赋值。 eslint:

    // bad

     

括号

  • 用括号包裹多行 JSX 标签。 eslint:

    // badrender() {  return 
    ;}// goodrender() { return (
    );}// good, when single linerender() { const body =
    hello
    ; return
    {body}
    ;}

     

标签

  • 当标签没有子元素时,始终时候自闭合标签。 eslint:

    // bad
    // good

     

  • 如果控件有多行属性,关闭标签要另起一行。 eslint:

    // bad
    // good

     

方法

  • 在 render 方法中事件的回调函数,应该在构造函数中进行bind绑定。 eslint:

    为什么这样做? 在 render 方法中的 bind 调用每次调用 render 的时候都会创建一个全新的函数。

    // bad  class extends React.Component {    onClickDiv() {      // do stuff    }    render() {      return 
    } } // good class extends React.Component { constructor(props) { super(props); this.onClickDiv = this.onClickDiv.bind(this); } onClickDiv() { // do stuff } render() { return
    } }

     

  • React 组件的内部方法命名不要使用下划线前缀。

    // badReact.createClass({  _onClickSubmit() {    // do stuff  },  // other stuff});// goodclass 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 {
    this.props.text}
    }}Link.propTypes = propTypes;Link.defaultProps = defaultProps;export default Link;

     

  • React.createClass的排序:eslint:

  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

  • 不要使用 isMounted. eslint:

    为什么这样做? ,当使用 ES6 类风格声明 React 组件时该属性不可用,并且即将被官方弃用。

扩展

  • 上诉的规则,你可用通过eslint的react插件来完成配置: ,
  • Fork了一个官方的repo,把规范翻译在这里,不仅有react的,还有两个很火的翻译版的ES5和ES6规则,强烈推荐没有读过的人读一下,对你了解ES6也是非常好的途径。

转载于:https://www.cnblogs.com/xianyulaodi/p/5456805.html

你可能感兴趣的文章
看雪CTF第十四题
查看>>
模拟生命_吸烟致癌?
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Maven 传递依赖冲突解决(了解)
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
查看>>
[Spark][Python]Spark Join 小例子
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
大战设计模式【11】—— 模板方法模式
查看>>
springBoot介绍
查看>>
Intellij IDEA 快捷键整理
查看>>
Redis 通用操作2
查看>>
性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项
查看>>
11. Spring Boot JPA 连接数据库
查看>>
洛谷P2925 [USACO08DEC]干草出售Hay For Sale
查看>>
MapReduce工作原理流程简介
查看>>
那些年追过的......写过的技术博客
查看>>
小米手机解锁bootload教程及常见问题
查看>>