「跟着月影学 JavaScript| 青训营笔记」

47 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

今日学习:JS编码原则:

  • 各司其职
  • 组件封装
  • 过程抽象

各司其职

例:写一段JS,控制一个页面,让它支持浅色和深色两种浏览模式。

方法一:

注册一个点击的事件,改变当前页面的文字颜色和背景颜色样式。

const btn = document.getElementById('modeBtn');
btn.addEventListener('click', (e) => {
  const body = document.body;
  if(e.target.innerHTML === '🌞') {
    body.style.backgroundColor = 'black';
    body.style.color = 'white';
    e.target.innerHTML = '🌜';
  } else {
    body.style.backgroundColor = 'white';
    body.style.color = 'black';
    e.target.innerHTML = '🌞';
  }
});

对于这种方法,在JS中改变了样式,如果以后要对页面深色模式和浅色模式的样式更改,仍需要在JS中更改,我们知道,关于页面样式的设置是在CSS中设置的,而JS是负责页面的行为,这种写法使JS和CSS的职能的混淆,不利于他人理解和后续的更改。

方法二:

注册一个点击的事件,改变当前页面的类。

const btn = document.getElementById('modeBtn');
btn.addEventListener('click', (e) => {
  const body = document.body;
  if(body.className !== 'night') {
    body.className = 'night';
  } else {
    body.className = '';
  }
});

方法二在方法一的基础上进行了改良,后续如果要更改深色模式或浅色模式的样式,只需在CSS中进行设置,但是还有没有更好的方法呢?

方法三:

由于更改浏览模式是在改变页面显示样式,并没有进行一些高级行为的操作,我们可以直接在html中加入一个id为modeCheckBox的复选框,在CSS中,在复选框被选中时,设置浏览模式的样式。

<input id="modeCheckBox" type="checkbox">
#modeCheckBox:checked + .content {
  background-color: black;
  color: white;
  transition: all 1s;
}

到此,我们已经可以通过点击复选框来更改浏览模式,但仍需进行一些美化。

我们在html中添加一个按钮modeBtn,通过label标签,将按钮与复选框划为一组,然后在CSS中对modeBtn设置样式。

<label id="modeBtn" for="modeCheckBox"></label>

然后在CSS中将复选框隐藏,便可以实现在页面中通过点击按钮modeBtn更改浏览模式。

#modeCheckBox {
  display: none;
}

结论:

  • HTML/CSS/JS各司其责
  • 应当避免不必要的由JS直接操作样式
  • 可以用class来表示状态
  • 纯展示类交互寻求零JS方案

组件封装

组件是指Web页面上抽出来一个个包含模板(HTML)、功能(JS)和样式(CSS)的单元。好的组件具备封装性、正确性、扩展性、复用性。

比如做一个电商网站的轮播图:

  • 在html中使用无序列表实现
  • 使用CSS绝对定位将图片重叠在同一个位置,轮播图的切换状态使用修饰符(modifier),轮播图的切换动画使用CSS transition
  • 在JS中使用API实现页面的滑动,使用自定义事件设置控制按钮和切换上下图片的行为

总结:

基本方法:

  • 结构设计

  • 展现效果

  • 行为设计

    • API(功能)
    • Event(控制流)

解耦:

  • 将控制元素抽取成插件
  • 插件与组件之间通过依赖注入方式建立连接。

过程抽象

过程抽象

  • 用来处理局部细节控制的一些方法
  • 函数式编程思想的基础应用

操作次数限制

  • 一些异步交互
  • 一次性的HTTP请求

Once

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

高阶函数

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

常用高阶函数

  • Once
  • Throttle(节流函数)
  • Debounce(防抖函数)
  • Consumer/2
  • Iterative(批量操作元素)

编程范式

  • 命令式
  • 声明式
  • 三态