如何写好JavaScript(上) | 青训营笔记

132 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

想聊一聊关于写好前端代码的事情,随着前端的这几年的快速发展,前端再也不像以前一样只单单用html,css,js写一些静态页面,而现在越来越注重工程化的思想,例如vue react框架的出现,让前端开发越来越规范化和模块化,现在的开发更加注重团队合作,开发效率,代码的可读性,项目的可维护性,代码的性能等方面。

1.那么,怎么样的去书写前端代码才是比较良好的方式呢?

大家不妨来看下以下的需求

写一段JS,控制一个网页,让它支持浅色和深色两种浏览模式。 如果是你来实现,你会怎么做?

如果用js来实现大家脑海里肯定会有一个想法就是这样的

    const btn = document.getElementById('pattern');
    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 = '🌞';
    }
  });

通过在太阳上绑定点击事件来控制整个主题的样式,这样是完全可以实现需求的,但是大家可否想过,他们违背了一个原则,就是:

让HTML、CSS和JavaScript职能分离。

html在前端应该是扮演一个书写结构的角色,css应该是一个展示表现的角色,js应该是一个体现行为的角色,三者应该各司其职,尽量减少一个角色去扮演另外一个角色的职能,例如

<p style="color:red;font-size="16px">测试</p>

这里的html直接去控制了css样式,也例如上面的例子中,通过了js控制了css本应控制的样式,这样的代码,无论是从团队之间阅读性,还是说从代码的可维护性,都变得更加困难,也没有让html、css、JavaScript发挥自己结构,表现,行为的职能,那么改如何改进上面的代码呢?

我们可以通过js去控制className去改变样式,并且通过 day 样式,和 night 样式来更改主题的样式,例如:

<div id="app">
  <h2 class="title">
    <p>贪得无厌的老虎的故事</p>
    <p id="pattern">🌞</p>
  </h1>
  <p id="mean">
    <img src="https://gimg2....."/>
    <p class="mean_box">从前,......</p>
  </p>
</div>
body,h2{
  margin:0px;
  padding: 0px;
}
#app{
  height: 1000px;
}
.title{
  display: flex;
  justify-content: space-between;
}
.title:nth-child(1){
  margin-left: 1rem;
}

#mean img{
  margin:0rem;
  width: 30rem;
  height: 20rem;
}
.mean_box{
  margin-left: 1rem;
  text-indent:2em;
}
#pattern:hover{
  cursor:pointer;
}
.night{
  background-color: black;
  color:white;
  transition: all 1s;
}
.day{
  background-color: white;
  color: black;
  transition: all 1s;
}
let btn = document.getElementById('app')
let pattern = document.getElementById('pattern')
btn.className = "night"
pattern.addEventListener("click",e=>{
  if(app.className == "day"){
    btn.className = "night"
  } 
  else{
    btn.className = "day"
  } 
})

这里通过去修改页面样classNmae 去修改主题,这样我们就不是直接通过js去修改样式,并且这样我们想去修改样式的时候,只需要找到对应的night 或者 day 即可修改不同的样式,并且功能更好的去扩展。也能让一个html css js 各司其职,但这里还有更好的解决方案,就是通过css3来实现全部功能,不动用js即可完成,这里就不做展示了。

1659009804422.jpg

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