谈谈React那些小事
前言
说起React,那也是近一年多时间火起来的前端框架,其在Facebook的影响力和大力推广下,已然成为目前前端界的中流砥柱。在如今的前端框架界,React、Vue、Angular三分天下的时代已经到来,而曾经jQuery一统天下的局面已一去不复返。
三分天下,前端虽乱,但美其名曰“繁荣”。每一次突破性的革命必定会迎来成千上万的追随者,我们可以看一下一份来自NPM的统计数据:
上图统计的是全球范围内React、Vue、Angular在npm中的月下载次数,统计地址可以访问:npm-stat。从图中我们不难发现React虽初出茅庐,但其影响力已经奠定了在前端框架中的霸主地位。
而对于React的开发者来说,如何利用React构建现代化的前端项目,产出高质量的前端代码才是学习React的重点。所以本文就我自己平时利用React开发项目的经验和个人见解,来谈谈在React项目中需要了解和容易忽略的“小事”。
那些小事
俗话说“千里之堤毁于蚁穴”,在React开发中我们不能忙于进度而忽视了细节。
1.使用容器组件与展示组件
容器组件和展示组件名词来自于redux文档。如果你想让自己的React项目变得清晰可维护,那么你需要了解并使用它们。
这里我们将组件分成两类,一类叫“容器组件”,我一般将它们放在containers文件夹下。这一类组件可以理解为最顶层的组件,其功能仅仅做数据提取,然后渲染对应的子组件。
另一类叫“展示组件”,我一般将它们放在components文件夹下。这一类组件可以理解为只具有展示性的子组件,其功能仅仅是展示性的,所有数据都通过 props 传入。
这样分类的好处在于:关注分离,更易复用及维护,数据集中处理等。具体可以参见:译文《容器组件和展示组件》
2.组件划分不宜过细,层次不宜过深
曾经有人问我React组件的划分应不应该太细,比如是不是可以把一个输入框划分为一个组件?
我个人认为组件不应该按照DOM元素来划分,而是应该按照功能来划分。如果你的一个页面中包含了两个功能,比如表格搜索、弹框查看,就可以将其划分为两个子组件。
同样的组件层次也不宜过深。很多时候会存在组件中包含组件的情况,这样就出现了组件之间的嵌套层次。我个人认为组件间的嵌套层次不宜超过3层,如果嵌套层次太深会直接导致功能及状态的难以维护,就像if else语句嵌套太深一样。
3.Redux和state并不冲突
很多开发者可能会认为用了Redux来管理数据状态后,我们的组件中就不需要state了。其实我个人认为Redux和state并不冲突。
Redux主要用于管理那些公用及异步的状态,而state一般用于管理组件独有的状态。如果你的组件中存在其不必和其他组件公用及非异步的单一数据,那么你直接可以写在state中,比如一些loading的状态和显示隐藏的状态等。
巧妙的使用Redux和state可以帮助我们更好的管理数据流。
4.不要渲染当前用不到的组件
在用户操作中,有些组件可能不是一开始展示页面的时候就需要用到的,比如某些弹框等。这样的组件除了将其隐藏外,我们最好不要让它渲染在页面上,当用户点击触发的时候再进行渲染,这样一来便起到了优化加载的作用。
5.除了划分组件还应划分reducer
相比组件的划分,reducer的划分也同样重要。随着应用的膨胀,我们可以将拆分后的 reducer 放到不同的文件中, 以保持其独立性并用于专门处理不同的数据域。
如果一个中大型的项目不划分reducer,会导致单一的reducer文件代码过于冗长而难以维护。我们可以使用Redux提供的 combineReducers()来将拆分的reducer进行合并。详见:Redux中文文档。
结语
事无巨细,人无完人。一个优秀的React项目并不代表其没有缺点,代码优化是一个长期的过程,唯有发现问题总结问题才能给我们带来新的突破口。