Javascript编码三大原则(1) | 青训营笔记

64 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第7天. 今天学习Javascript编码的三大原则中的各司其责.

Javascript编码三大原则

写好JS有三个原则

  • 各司其责
  • 组件封装 : 和UI打交道, 需要封装UI组件来使用
  • 过程抽象 : 可以让代码有更好的拓展性.

各司其责

也就是让HTML(结构), CSS(表现), JavaScript(行为)职能分离, 下面通过几个例子来说明什么是各司其责.

这个例子是通过点击按钮, 改变页面的白天/夜晚的样式. 白天样式为白色背景颜色和太阳图标, 夜晚样式为黑色背景颜色和月亮图标.

版本一

直接使用 JS代码对CSS样式进行修改. 虽然这段代码可以直接看出对网页渲染做了什么样的修改, 但是不利于团队合作, 也不利于进一步拓展.

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 = '🌞';
  }
});

版本二

(更符合各司其责的原则)

与版本一最大的区别是, 在CSS中引入了class="night", JS中仅对className进行操作, 代码变简洁了. 此时也分离了表现和行为. 并且版本二可以更直观的体现需求, 即夜间模式和白天模式切换的问题.

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

版本三

一般控制样式的代码可以直接通过CSS实现(伪类选择器以匹配元素状态)

增加了一个checkbox来控制, 可以在html给label设置一个for元素, 使得label和checkbox链接起来, 这时点击label和点击checkbox的效果是一样的. 并且将checkbox设置为不展示, 则可以在网页上实现点击按钮, 切换日/夜间模型的效果.

<input id="modeCheckBox" type="checkbox">
  <div class="content">
    <header>
      <label id="modeBtn" for="modeCheckBox"></label>
      ......
#modeCheckBox {
  display: none;
}
/* 选中checkbox就对content内容进行修改 */
#modeCheckBox:checked + .content {
  background-color: black;
  color: white;
  transition: all 1s;
}
/* 对按钮进行修改 */
#modeBtn::after {
  content: '🌞';
}
#modeCheckBox:checked + .content #modeBtn::after {
  content: '🌜';
}

::after是伪类元素, 给标签之后增加新内容.

小结

在编写JavaScript时

  • 避免使用JS直接操作样式.
  • 可以用class来表示状态, 能够更好的满足各司其责的原则, 使代码更简洁.
  • 纯展示类交互需求, 如页面文字样式变换等, 可以使用零JS方案解决.