资讯专栏INFORMATION COLUMN

React组内开发规范

Paul_King / 3306人阅读

摘要:部门组件开发规范适用范围部门所有基于开发的包含组件,欢迎提意见。必须书写,规定每个可接受属性的类型,并对加以说明。更多的通用组件规范基本的书写规范基础上,更多的通用的组件开发规范。可以提供与组件内部数据结构紧密相关的操作方法。

下面是我们部门总结的内部开发规范(试行版本),欢迎提意见。

部门FE React 组件开发规范 适用范围

部门FE 所有基于React开发的(包含fcui2)组件,欢迎提意见。

要求

必须:表示绝对要求这样做。

必须不:表示绝对不要求这样做。

应该/建议:表示一般情况下应该这样做,但是在某些特定情况下可以忽视这个要求。

应该不/不建议:表示一般情况下不应该这样做,但是在某些特定情况下可以忽视这个要求。

可以:表示这个要求完全是可选的,你可以这样做,也可以不这样做。

基本概念 [basic-concepts]

实例化生命周期

getDefaultProps

getInitialState

componentWillMount

render

componentDidMount

更新期生命周期

getInitialState

componentWillMount

render

componentDidMount

运行期生命周期

componentWillReceiveProps

shouldComponentUpdate

componentWillUpdate

render

componentDidUpdate

销毁期生命周期

componentWillUnmount

核心依赖 [deps](针对内部UI库)

必须在UI内只依赖React,underscore。

必须不在UI内部任何地方使用jQuery等直接操作DOM的库

JSX书写 [jsx]

参考:Airbnb的style guide。

必须命名JSX文件为.jsx.js。

必须使用PascalCase作为文件名。

必须只包含一个React Component在一个JSX文件中。

必须令文件名与所包含的React Component名字相同。

必须只能使用React.createClass()来创建一个React Component。

> 虽然ES6 Class和pure function都可以创建React Component,
> 但ES6 Class不能使用mixin做扩展,与目前的扩展方法冲突;
> Pure function较难掌握和管理。

必须使用JSX语法来生成组件的DOM片段。

必须不能在JSX中出现React.createElement()

必须遵守下面示例中的DOM片段对齐方式。

    // bad
    

    // good
    

    // if props fit in one line then keep it on the same line
    

    // children get indented normally
    
      
    

必须在DOM片段中使用双引号"

> Why?JSX attributes [can"t contain escaped quotes](http://eslint.org/docs/rules/jsx-quotes), so double quotes make conjunctions like `"don"t"` easier to type.

> Regular HTML attributes also typically use double quotes instead of single, so JSX attributes mirror this convention.

    // bad
    

    // good
    

    // bad
    

    // good
    

必须在自关闭标签前加一个空格。

    // bad
    

    // very bad
    

    // bad
    

    // good
    

必须书写propTypes,规定每个可接受属性的类型,并对propTypes加以jsdoc说明。

必须使用camalCase来命名props。

    // bad
    

    // good
    

必须当props的值为字面值true时,省略={true}

    // bad
    

必须在DOM片段前后加一对括号(),当DOM片段在一行以上时。

    // bad
    render() {
      return 
               
             ;
    }

    // good
    render() {
      return (
        
          
        
      );
    }

    // good, when single line
    render() {
      const body = 
hello
; return {body}; }

必须将组件写成自关闭标签,当组件没有children时。

    // bad
    

    // good
    

必须将关闭标签另起一行,当组件有多个props时。

    // bad
    

    // good
    

必须将bind handler到this的动作放到构造函数中。

> Why? A bind call in the render path creates a brand new function on every single 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
} }

必须以如下的顺序排列JSX文件中的方法。

displayName

propTypes

contextTypes

childContextTypes

mixins

statics

defaultProps

getDefaultProps

getInitialState

getChildContext

componentWillMount

componentDidMount

componentWillReceiveProps

shouldComponentUpdate

componentWillUpdate

componentDidUpdate

componentWillUnmount

clickHandlers or eventHandlers like onClickSubmit() or onChangeDescription()

getter methods for render like getSelectReason() or getFooterContent()

Optional render methods like renderNavigation() or renderProfilePicture()

render

更多的通用组件规范 [general-guide]

[基本的JSX书写规范] (#jsx-jsx)基础上,更多的通用的React组件开发规范。

必须将所有UI组件实现为[Pure Renderer] (https://facebook.github.io/react/docs/pure-render-mixin.html)。

必须在props中存放所有外部导入的配置,包括显示控制参数、显示数据源、当前值(如果是input类型组件)、回调方法等。state相同时,对于一个特定的props,对应的组件展现结果唯一。

必须在state中存放组件运行期的状态,如输入框是否通过了校验、鼠标是否悬浮在按钮上等。props相同时,对于一组特定的state,对应的组件展现效果唯一。

不应该在state中存在[通过props运算来的属性] (https://facebook.github.io/react/tips/props-in-getInitialState-as-anti-pattern.html)。

建议父子关系的组件间传递props时,使用[rest-spread语法] (https://facebook.github.io/react/docs/transferring-props.html)。

必须仅在实例化生命周期中绑定window或body事件。

必须在销毁期生命周期中解绑window或body事件。

必须不允许在运行期生命周期中声明表达式函数。bind函数也不允许。

    // bad
    render() {
        var cleverFunction = function () {};
        // ...
    }

    // good
    {
        cleverFunction() {},
        render() {
            // just use this.cleverFunction
        }
    }

不建议在运行期生命周期中使用时间复杂度O(n2)及以上阶的算法。

必须不允许出现观察者模式,如自定义addEventListener方法,或on, fire等。

必须只能通过以下2种方法设置组件内部状态:

通过父组件的render方法,改变子组件的props。

通过子组件的setState方法。

必须不允许为组件提供setXXX方法来改变其内部状态,除非该setXXX方法中仅包含一个setState调用,且完成了一个充分复杂的state转换。

必须为所有回调在getDefaultProps给出空函数默认值_.noop

可以提供与组件内部数据结构紧密相关的操作方法。这些方法可以实现为一个纯函数,即只依赖其所有的参数来得到其结果。这些方法可以放在组件的static域中。

博客地址

http://tangguangyao.github.io/

微信公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78934.html

相关文章

  • 干货|人人都是翻译项目的Master

    摘要:开始翻译函数式编程专有名词库在翻译的过程中,难免会遇到很多描述不太清楚的专有名词,一个办法是小组内进行讨论,最后商量出来结果,小组内统一翻译。因为本书的主题是函数式编程,所以这个名词库里大部分都是函数式编程相关的专有名词。 在平时的工作中,我们都会经常查阅一些英文文档来解决平时遇到的问题和拓宽视野。看到好的文章或者书籍有没有想要和小伙伴分享的冲动,那么我们一起来翻译吧~ 翻译主张 信 ...

    kyanag 评论0 收藏0
  • 干货|人人都是翻译项目的Master

    摘要:开始翻译函数式编程专有名词库在翻译的过程中,难免会遇到很多描述不太清楚的专有名词,一个办法是小组内进行讨论,最后商量出来结果,小组内统一翻译。因为本书的主题是函数式编程,所以这个名词库里大部分都是函数式编程相关的专有名词。 在平时的工作中,我们都会经常查阅一些英文文档来解决平时遇到的问题和拓宽视野。看到好的文章或者书籍有没有想要和小伙伴分享的冲动,那么我们一起来翻译吧~ 翻译主张 信 ...

    BicycleWarrior 评论0 收藏0
  • 干货|人人都是翻译项目的Master

    摘要:开始翻译函数式编程专有名词库在翻译的过程中,难免会遇到很多描述不太清楚的专有名词,一个办法是小组内进行讨论,最后商量出来结果,小组内统一翻译。因为本书的主题是函数式编程,所以这个名词库里大部分都是函数式编程相关的专有名词。 在平时的工作中,我们都会经常查阅一些英文文档来解决平时遇到的问题和拓宽视野。看到好的文章或者书籍有没有想要和小伙伴分享的冲动,那么我们一起来翻译吧~ 翻译主张 信 ...

    骞讳护 评论0 收藏0
  • ❤️ 前端如何与后端对接?当年差点和后端同学打起来了!

    阅读须知 本文不谈及老技术(毕竟没有经历那个年代,emmm),只谈一些个人体会,如果会有部分内容与你想法不同,以你为准。 大学期间对于前端的学习 对于我双非本科小菜鸡来说,最开始入门的语言是 C 语言,之后大二大三就以 Java 语言为主。后面了解了一下其它学校同学学习的课程,好像大部分也是以 Java 为主,不过有的学校会教学一些 Web 前端的课程,这个是挺好的。 我是仅仅大二学了一本 《We...

    Martin91 评论0 收藏0
  • 使用 Typescript 检查你的代码规范

    摘要:公司不同,规范的内容形式检查方式也不同,但最终是要验收你的规范。你的代码不合规范,提交都提交不上去,这样就能从入口上保证代码的规范性。 背景 越来越多的前端项目开始使用typescript这门静态检查语言了,它包括很多很棒的功能点,在这里就不细述,根据静态语法检查和.d.ts生成的代码提示两大特性,我们就可以来制定并且检查代码规范,现在我们来详细说一下。 代码规范 代码规范大家应该...

    Loong_T 评论0 收藏0

发表评论

0条评论

Paul_King

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<