React 编程风格指南

本文讨论的是 React.js 编程中的一些编程风格,团队开发中遵循统一的风格有利于提高代码的阅读体验。
本文译自React style guide。下面将从三个方面来讲。

语法

方法顺序遵循生命周期放在前面, render() 方法放在最后

react 组件内部,方法的顺序如下:

  1. 生命周期方法(按照时间先后顺序依次为: getDefaultProps,getInitialState,componentWillMount,componentDidMount,componentWillReceiveProps,shouldComponentUpdate,componentWillUpdate,componentDidUpdate,componentWillUnmount

  2. 其他的方法

  3. render 方法

事件处理函数的命名

采用 "handle" + "EventName" 的方式来命名
Example:

<Component onClick={this.handleClick} onLaunchMissiles={this.handleLaunchMissiles} />

事件函数作为属性时的命名

为了跟 react 的事件命名保持一致: onClick,onDrag,onChange,等等,采用如下格式:

<Component onLaunchMissiles={this.handleLaunchMissiles} />

元素跟 return 放在同一行

为了节约空间,采用下面的写法:

return <div>
    ...
</div>;

而不是:

return (      // "div" 与 "return" 不在同一行
    <div>
        ...
    </div>
);

对HTML的属性进行对齐和排序

如果属性不是太多,那就放在同一行,否则就把每一个属性都单独写一行:

<div className="highlight" key="highlight-div">
<div
    className="highlight"
    key="highlight-div"
>
<Image
    className="highlight"
    key="highlight-div"
/>

而不是:

<div className="highlight"      // 属性没有在单独行
     key="highlight-div"
>
<div                            // 闭合便签不在单独的行
    className="highlight"
    key="highlight-div">
<div                            // 属性没有排序(一般重要的属性写在前面)
    key="highlight-div"
    className="highlight"
>

一个文件只导出一个 react 类

每一个 .jsx 应该只能导出单独的 react 类。这样有利于测试,因为这些测试框架要求一个文件导出的就是一个函数。
注意:你依然可以在一个文件中定义多个类,只要保证导出的只有一个即可。

语言特色

确保“呈现型”的组件功能单一

react 组件 分为“逻辑型组件”和“呈现型组件” 是很有必要的。前者包含的是业务逻辑,里面不应该包含HTML;后者一般是可复用的,可以包含HTML。前者可以拥有自己的内部的 state,而后者不应该拥有。

多用 props

如果能用 props 就不要用 state,这一定程度上可以减少应用程序的复杂度。
一般的模式是:创建一个“无状态”的组件(呈现型组件),只负责呈现数据,把包含 state 的“逻辑型组件”做为这些组件的父级组件。 然后把它内部的 state 作为 props传递给下面的呈现型组件。这些逻辑型组件包含了所有的交互逻辑。

使用 propTypes

react 组件 都应该完成 propTypes 验证。每一个 this.props 的属性都应该有一个与之对应的 propTypes
避免使用这些没有描述意义的 prop-types:

  • React.PropTypes.any

  • React.PropTypes.array

  • React.PropTypes.object

最好使用:

  • React.PropTypes.arrayOf

  • React.PropTypes.objectOf

  • React.PropTypes.instanceOf

  • React.PropTypes.shape

永远不要在DOM中保存 state

不要通过 data- 属性或class类。所有的信息应该都存储在javascript中,或者在React组件中,或者在React store 中,如果使用了类似 Redux 这样的框架的话。

React 库和组件

不要使用 backbone 模型

直接使用 flux action,或者 $.ajax 来代替。

尽量少用 jQuery 就少用

永远也不要用jquery去操作DOM。
尝试避免jquery插件的使用。有必要的话,把jquery插件包装在React组件中。
你可以使用 $.ajax(但是不要用其他方法,像 $.post) 来进行网络通信。

复用组件

你可以从https://devarchy.com/react获取第三方React组件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom