@gyyin
2020-04-05T15:15:43.000000Z
字数 1400
阅读 420
慕课专栏
前端组件化一直是老生常谈的话题,在前面介绍 React 的时候我们已经提到过 React 的一些优势,今天则是带大家了解一下组件设计原则。
在开始讲 React 组件之前,我们还是要先来聊聊 jQuery。在我看来,jQuery 插件就已经具备了组件化的雏形。
在 jQuery 还大行其道的时代,我们在网上可以到处一些 jQuery 插件,里面有各种丰富的插件,比如轮播图、表单、选项卡等等。
组件和插件的区别是什么呢?插件是集成到某个平台上的,比如 Jenkins 插件、Chrome 插件等等,jQuery 插件也类似。平台只提供基础能力,插件则提供一些定制化的能力。
而组件则是偏向于 ui 层面的,将 ui 和业务逻辑封装起来,供其他人使用。
在一些最简单无脑的 jQuery 插件中,它们一般会将 DOM 结构直接写死到插件中,这样的插件拿来即用,但限制也比较大,我们无法修改插件的 DOM 结构。
// 轮播图插件
$("#slider").slider({
config: {
showDot: true, // 是否展示小圆点
showArrow: true // 是否展示左右小箭头
}, // 一些配置
data: [] // 数据
})
还有另一种极端的插件,它们完全不把 DOM 放到插件中,但会要求使用者按照某种固定格式的结构来组织代码。
一旦结构不准确,就可能会造成插件内部获取 DOM 出错。但这种插件的好处在于可以由使用者自定义具体的 DOM 结构和样式。
<div id="slider">
<ul class="list">
<li data-index="0"><img src="" /></li>
<li data-index="1"><img src="" /></li>
<li data-index="2"><img src="" /></li>
</ul>
<a href="javascript:;" class="left-arrow"><</a>
<a href="javascript:;" class="left-arrow">></a>
<div class="dot">
<span data-index="0"></span>
<span data-index="1"></span>
<span data-index="2"></span>
</div>
</div>
$("#slider").slider({
config: {} // 配置
})
当然,你也可以选择将 DOM 通过配置传给插件,插件内部去做这些渲染的工作,这样的插件比较灵活。
$("#slider").slider({
config: {}, // 配置
components: {
dot: (item, index) => `<span data-index=${index}></span>`,
item: (item, index) => `<li data-index=${index}><img src="" /></li>`
}
})
前面讲了几种 jQuery 插件的设计模式,其实万变不离其宗,不管是 jQuery 还是 React,组件设计思想都是一样的。
个人觉得,组件设计应该遵循以下几个原则:
1. 单一职责:一个组件尽量只做一件事。
1. 松耦合:组件不应当依赖另一个组件。
2. 数据解耦:组件不应该依赖特定结构的数据。
3. 结构自由:组件不应该封闭固定的结构。