谈谈前端组件化

一、什么是组件化

什么是组件化?不同的人对组件化有着不同理解,我理解的组件化是一种编程思想,是一种拆分代码的方式。对前端开发来说,大到一个页面,小到一个html标签都可以说是一个组件。组件化的概念并不难理解,难的是理解组件化的思想。

二、如何理解组件化

在理解组件化之前,我们得先说说我们为什么要有组件化的思想以及组件化解决了什么问题。通俗的说前端组件化就是为了代码复用,提高研发效率。那么我们在设计组件的时候难免要思考两个问题:

  1. 组件该如何拆?(拆分)
  2. 组件该怎么用?(组合)

因此,我把‘什么是组件化?’分成了拆分组合两个问题。

三、组件如何拆分

大家对组件化的理解不同,组件拆分的方式也不同,因此组件拆分最重要的是有统一的拆分方式和拆分原则。我结合蚂蚁金服前端资产市场划分和Vue组件化应用概念总结出了四种组件:基础组件业务组件区块组件页面组件

蚂蚁金服前端资产市场划分图

Vue组件化应用

  • 基础组件:指inputbutton这种基础标签,以及antd封装过的通用UI组件
  • 业务组件:由基础组件组合成的业务抽象化UI,后端封装了相应的class
  • 区块组件:由基础组件组件和业务组件组合成的UI块
  • 页面组件:展示给用户的最终页面

四种组件的关系就像数学中的点、线、面和体,体由面组成,面由线组成,面由点组成。
举个分为消息列表和功能栏两部分的聊天页面的例子来学习下,可以参照微信聊天页想象下UI。

  • 业务组件:
// MessageItem 
<li>
    // 用户头像
    <img />
   // 用户名
    <h3>user name</h3>
    // 消息内容
    <p>说点啥</p>
</li>
  • 区块组件:
// MessageList
<ul>
    {messages.map(message => <MessageItem message={message})}
</ul>
// FunctionBar
<div>
    // 消息输入框
    <input />
    // 发送消息
    <button>发送</button>
</div>
  • 页面组件
// Chat 
<main>
    <MessageList messages={messages} />|
    <FunctionBar />
</main>
组件划分表

这样一个聊天页的UI就拆分完了,大家可能会有个疑问,因为我说的这些都只是UI,没有涉及JS业务逻辑部分。没错,组件的拆分并不会有这么简单,但是在拆分组件上,我们可以先从UI上拆分出四种维度的组件,然后再根据组合的方式填充js的逻辑。

四、组件怎么组合

组件的结合方式我根据组件的数据传递方式合组件的逻辑处理方式也总结出了两种:渐进式离散式

  • 渐进式:数据逐层传递,组件各自负责自己的业务逻辑
  • 离散式:数据统一处理,集中处理业务逻辑

渐进式和离散式两种组合方式其实也分别对应了Vue和React两种js框架的语言特点。Vue提供了v-model数据双向绑定机制,容易处理组件上下级间的数据,比较适合渐进式,而且它本来就声明自己是渐进式JavaScript框架。而React提倡函数式编程,是不完全双向数据绑定的JavaScript框架,通常需要onChange事件来更新父级的state来更新View,因此React更适合离散式组合方式。当然,两种方式都可以用两种框架来实现。

Vue

4.1 渐进式组合方式

我们在拆分组件中的例子的组合方式就属于渐进式组合的方式,渐进式组合方式的优点就是组件的职责划分清晰。缺点就是不相邻组件之间的通信缺少灵活性。

4.2 离散式组合方式

用离散式重写下聊天页面:

// MessageList
<ul>
    {this.props.children}
</ul>
// Chat 
<main>
    <MessageList>
          messages.map(message => <MessageItem message={message} />
    </MessageList>
    <FunctionBar />
</main>

我改变了下MessageList和Chat的写法,把message的传递路径从Chat -> MessageList -> MessageItem改成了Chat -> MessageItem,这样就可以缩减数据传递和callBack传递的路径了。

4.3 渐进式&&离散式

渐进式和离散式的组合方式都有各自的优点合缺点,数据单向传递可以采用渐进式,但是callBack最好是可以一步到位,在保证callBack路径的基础上尽量实现渐进式才是最好的组合方式。

最后说点什么

文章并没有具体的说什么是组件化什么是组件化思想,其实不管是组件化思想还是面向对象,只要是编程思想就离不开软件设计的核心原则:高内聚低耦合。组件化并不是就是适合所有的团队或者项目,因为在实际开发工作中会有许多不理想的情况,比如一个小项目没有那么多重复的代码,比如设计团队才华横溢根本不认可组件化等等。但是在前端工程化中,组件化才是重要的环节,在提高团队效率方面,还有什么能比组件化优秀呢?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容