react/vue 组件设计方法/原则

  网上看到了好多篇 react/vue 组件设计方法/原则 ,内容都是雷同(指不该相同而相同)。
  我深恶痛绝,并深刻检讨自己,意识到普及互联网知识已经迫在眉睫,绝不容许有人浑水摸鱼。在短暂的失落和悲怆过后,这肩负振兴祖国互联网知识的重任,舍我其谁?
  我集百家之长于一身,取其精华去其糟粕,将最精辟的原理和最完善的案例总结在了这里,供大家免费参阅。如有疑问请在下方留言或私信本人,我将第一时间为你解答。

正文:

  作为数据驱动的领导者react/vue等MVVM框架的出现,帮我们减少了工作中大量的冗余代码, 一切皆组件的思想深得人心. 为了让工程师们有更多的时间去考虑业务和产品迭代,我们不得不掌握高质量组件设计的思路和方法.所以笔者将花时间去总结各种业务场景下的组件的设计思路和方法,并用原生框架的语法去实现各种常用组件的开发,希望能让前端新手或者有一定工作经验的朋友能有所收获.

组件库的价值
1) 就个人而言,拥有一套自己的组件库,可以让你的开发变得更高效,让你在行业里更有价值。
2) 就团队而言,拥有一套团队的组件库,可以让协同开发变得更高效规范,让你的团队在公司更具有影响力。
3) 就公司而言,拥有一套公司维护的开源组件库,可以让你的公司在行业里更具有影响力。

哪些情况需要整合一套组件库
1)从业务上看,当业务达到一定规模后,很多地方需要复用
2)从设计上看,产品要遵循一定的设计规范来保持统一性
3)从开发上看,对开发效率要求高,需要快速迭代和响应开发需求
4)从维护上看,需要统一代码管理,需要达到更改一处全局响应的高可维护性

组件设计应遵循什么原则
1) 就近管理
① 单文件开发
② 依赖的静态资源放在同级目录
③ 相关联组件也放在同级目录
2)高复用性
① 页面级别的复用(基础组件)
② 项目级别的复用- 私有组件库(业务组件)
③ 公司级别的复用- 开源组件库(element-ui、iview)

组件设计思路
按照之前笔者总结的组件设计原则,我们第一步是要确认需求. 一个抽屉(Drawer)组件会有如下需求点:
1>  能控制抽屉是否可见
2>  能手动配置抽屉的关闭按钮
3>  能控制抽屉的打开方向
4>  关闭抽屉时是否销毁里面的子元素(这个问题是5>  工作中频繁遇到的问题)
6>  指定 Drawer 挂载的 HTML 节点, 可以将抽屉挂载在任何元素上
7>  点击蒙层可以控制是否允许关闭抽屉
8>  能控制遮罩层的展示
9>  能自定义抽屉弹出层样式
10> 可以设置抽屉弹出层宽度
11> 能控制弹出层层级
12> 能控制抽屉弹出方向(上下左右)
13> 点击关闭按钮时能提供回调供开发者进行相关操作

需求收集好之后,作为一个有追求的程序员, 会得出如下线框图:

在这里插入图片描述
  对于react选手来说,如果没用typescript,建议大家都用PropTypes, 它是react内置的类型检测工具,我们可以直接在项目中导入. vue有自带的属性检测方式,这里就不一一介绍了.

  通过以上需求分析, 是不是觉得一个抽屉组件要实现这么多功能很复杂呢? 确实有点复杂,但是不要怕,有了上面精确的需求分析,我们只需要一步步按照功能点实现就好了.对于我们常用的table组件, modal组件等其实也需要考虑到很多使用场景和功能点, 比如antd的table组件暴露了几十个属性,如果不好好理清具体的需求, 实现这样的组件是非常麻烦的.接下来我们就来看看具体实现.

react设计原理
单功能原则
  使用React的时候,组件或容器的代码在根本上必须只负责一块UI的功能。
我们不要定义一个具有许多功能的组件,这会导致组件的复杂性和难以维护,难以复用。
  一个比较合格的组件尽量保证在200行代码内完成。

单一数据源原则
  在分析一个组件内部数据的流动时,我们必须明确数据的来源和去向,以及相应的状态
我们不允许一个数据的存在多个来源。就如上面反模式中使用 prop 初始化组件状态一样,我们不允许组件内部的状态来源于props然后又受组件内部setState的控制。
尽量保持:
1)组件单方面接收props的变量,但不改变它;
2)组件内部维护state变量,外部组件不改变它。

展示组件 容器组件
关注事物的展示 关注事物如何工作
可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有DOM标签和css样式
常常允许通过this.props.children传递 提供数据和行为给容器组件或者展示组件
对第三方没有任何依赖,比如store 或者 flux action 调用flux action 并且提供他们的回调给展示组件
不要指定数据如何加载和变化 作为数据源,通常采用较高阶的组件,而不是自己写,比如React Redux的connect(), Relay的createContainer(), Flux Utils的Container.create()
仅通过属性获取数据和回调 null
很少有自己的状态,即使有,也是自己的UI状态 null
除非他们需要的自己的状态,生命周期,或性能优化才会被写为功能组件 null

猜你喜欢

转载自blog.csdn.net/weixin_45820444/article/details/108877959