JavaScript编码原则 | 青训营笔记

60 阅读3分钟

这是我参与[第五届青训营]笔记创作活动的第3天

课堂笔记

本堂课重点内容

  • 如何写好JavaScript
  • 写代码需要关注的要点

具体内容

写好JavaScript的一些原则
  • 各司其职:HTML、CSS、JavaScript智能分离。
  • 组件封装:其实我们做前端更多的是和UI打交道,所以需要把一些UI的组件给封装起来使用。好的UI组件具备正确性、扩展性、复用性。
  • 过程抽象:用来处理局部细节控制的一些方法,应用函数式编程方式。

各司其职 | 页面日间/夜间模式的切换:

版本一: image.png 版本二: image.png 相互对比之下,可以发现版本二更加的简洁。版本一是直接对body的style进行操作,版本二是对className进行操作。我们一般用class来定义html元素的状态。
为什么版本二比版本一更好:
html是负责结构的,css是负责表现的,JavaScript是负责行为的。结构、表现、行为分离是我们需要掌握的一个基本原则。
版本二就很好的实现了各司其职的原则。
版本一用JavaScript去控制css其实就是让JavaScript做了css该做的事情。(这样容易让其他程序员阅读代码后无法直观的了解到原始需求)

组件封装 | JS实现轮播图

[结构]:
轮播图是一个典型的列表结构,可以用无序列表ul元素来实现:

image.png

[表现]:

  • 使用CSS绝对定位将图片重叠在同一个位置
  • 轮播图切换的状态使用修饰符 (modifier)
  • 轮播图的切换动画使用CSS transition

image.png

[行为]: 拥有了html、css之后需要用js来确定切换的行为,此时需要设计一些API:

  • getSelectedItem():得到当前选中的图片元素;
  • getSelectedItemIndex():得到当前选中的图片元素在此列表中的下标;
  • slideTo():滑动到某个特定下标(index)的元素上;
  • slideNext():轮播下一张图片;
  • slidePrevious():轮播上一张图片;

image.png

一系列操作下来,功能没有问题,但是并不灵活,eg:去掉某一部分或修改某一部分,可能需要在html、css文件上都做改动。所以还具有很大的改进空间:
[重构]:
解耦:
将控制元素抽取成插件,插件与组件之间通过依赖注入方式建立联系
将HTML模板化,更利于扩展。
将组件通用模型抽象出来。

过程抽象 | 操作次数限制

为了能够让"只执行一次"的需求覆盖不同的事件处理,我们可以将这个需求剥离出来。这个过程称为过程抽象。

高阶函数:

  • 以函数作为参数
  • 以函数作为返回值
  • 常用于作为函数装饰器

高阶函数 once:

image.png

总结

html/css/js应该各司其职,避免不必要的由js直接操作样式,可以用css表示状态。
实现组件的步骤:结构设计、展现效果、行为设计。