[关闭]
@gyyin 2020-04-05T15:15:43.000000Z 字数 1400 阅读 420

React 组件设计

慕课专栏


前言

前端组件化一直是老生常谈的话题,在前面介绍 React 的时候我们已经提到过 React 的一些优势,今天则是带大家了解一下组件设计原则。

jQuery 插件

在开始讲 React 组件之前,我们还是要先来聊聊 jQuery。在我看来,jQuery 插件就已经具备了组件化的雏形。

在 jQuery 还大行其道的时代,我们在网上可以到处一些 jQuery 插件,里面有各种丰富的插件,比如轮播图、表单、选项卡等等。

组件?插件?

组件和插件的区别是什么呢?插件是集成到某个平台上的,比如 Jenkins 插件、Chrome 插件等等,jQuery 插件也类似。平台只提供基础能力,插件则提供一些定制化的能力。
而组件则是偏向于 ui 层面的,将 ui 和业务逻辑封装起来,供其他人使用。

封装 DOM 结构

在一些最简单无脑的 jQuery 插件中,它们一般会将 DOM 结构直接写死到插件中,这样的插件拿来即用,但限制也比较大,我们无法修改插件的 DOM 结构。

  1. // 轮播图插件
  2. $("#slider").slider({
  3. config: {
  4. showDot: true, // 是否展示小圆点
  5. showArrow: true // 是否展示左右小箭头
  6. }, // 一些配置
  7. data: [] // 数据
  8. })

还有另一种极端的插件,它们完全不把 DOM 放到插件中,但会要求使用者按照某种固定格式的结构来组织代码。
一旦结构不准确,就可能会造成插件内部获取 DOM 出错。但这种插件的好处在于可以由使用者自定义具体的 DOM 结构和样式。

  1. <div id="slider">
  2. <ul class="list">
  3. <li data-index="0"><img src="" /></li>
  4. <li data-index="1"><img src="" /></li>
  5. <li data-index="2"><img src="" /></li>
  6. </ul>
  7. <a href="javascript:;" class="left-arrow"><</a>
  8. <a href="javascript:;" class="left-arrow">></a>
  9. <div class="dot">
  10. <span data-index="0"></span>
  11. <span data-index="1"></span>
  12. <span data-index="2"></span>
  13. </div>
  14. </div>
  15. $("#slider").slider({
  16. config: {} // 配置
  17. })

当然,你也可以选择将 DOM 通过配置传给插件,插件内部去做这些渲染的工作,这样的插件比较灵活。

  1. $("#slider").slider({
  2. config: {}, // 配置
  3. components: {
  4. dot: (item, index) => `<span data-index=${index}></span>`,
  5. item: (item, index) => `<li data-index=${index}><img src="" /></li>`
  6. }
  7. })

React 组件设计

前面讲了几种 jQuery 插件的设计模式,其实万变不离其宗,不管是 jQuery 还是 React,组件设计思想都是一样的。
个人觉得,组件设计应该遵循以下几个原则:
1. 单一职责:一个组件尽量只做一件事。
1. 松耦合:组件不应当依赖另一个组件。
2. 数据解耦:组件不应该依赖特定结构的数据。
3. 结构自由:组件不应该封闭固定的结构。

高阶组件结构复用

render props

通用 Hook

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注