JavaScript 编码原则之各司其责 | 青训营笔记

74 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天 本节课是由月影(十年踪迹)大佬讲授的js的一些编码规范,主要是从一个深夜食堂的例子出发,带我们体验如何做到js、css、html各司其职,给我的启发很大,值得学习。

如何写 JavaScript

  1. 推荐了两本书,一本是JavaScript权威指南(犀牛书),另一本是JavaScript Good parts
  2. 原则:
    • 各司其职
    • 组件封装
    • 过程抽象

各司其职

JavaScript、CSS、HTML职能分离

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

实现一:btn切换

存在问题,只能局限于单个页面,如果多个页面需要修改,代码很重用,且js和css混合

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>黑暗模式</title>
  <style>
    #btn {
      border: 0;
      border-radius: 1px;
      font-size: 30px;
    }
  </style>
</head>
<body>
  <div id="app">
    <button id="btn">☀️</button>
  </div>

  <script>
    const btn = document.getElementById('btn')
    btn.addEventListener('click', e => {
      const body = document.body
      if (e.target.innerHTML === '🌙') {
        body.style.backgroundColor = 'white'
        body.style.color = 'white'
        e.target.innerHTML = '☀️'
      } else {
        body.style.backgroundColor = 'black'
        body.style.color = 'black'
        e.target.innerHTML = '🌙'
      }
    })
  </script>
</body>
</html>

实现二:

通过className来切换,也就是做两套样式,切换方便且代码不会重复,js和css分离开

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

实现三:

通过html和css实现

<body>
  <input id="modeCheckBox" type="checkbox">
  <div class="content">
    <header>
    	<label id="modeBtn" for="modeCheckBox"></label>
      <h1>
        深夜食堂
      </h1>
    </header>
  </div>
</body>
#modeCheckBox:checked + .content {
  background-color: black;
  color: white;
  transition: all 1s;
}

通过这个例子,我们可以总结如下:

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

组件封装

好的UI具备正确性、扩展性、复用性

过程抽象

应用函数编程式思想