JavaScript 编码原则| 青训营笔记

35 阅读2分钟

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

JavaScript 编码原则

各司其责

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

下面有三段代码。

  • 版本1
const btn = document.getElementById( 'modeBtn');btn.addEventListener('click', (e)=> {
const body = document.body;
if(e.target.innerHTML === '0'){
body.style.backgroundColor ='black';
body.style.color = 'white';
e.target.innerHTML = '0';}
else {
body.style.backgroundColor ="white';
body.style.color = 'black ';
e.target.innerHTML = '.';}
});
  • 版本2
const btn = document.getElementById( ' modeBtbtn.addEventListener( 'click', (e)=→> {
const body = document. body;
if(body.className !== 'night ' ) {body.className = 'night';
}else {
body.className = '';}
});

  • 版本3

#modeCheckBox{
display: none;
}

#modeCheckBox:checked + .content 
{
background-color: black;
color:  white;
transition: all 1s;
}
<header>
<label id-""modeBtn" for="modeCheckBox"></label-<h1>深夜食堂</h1>
</header>
  • 版本一通过id来操作元素样式
  • 版本二通过控制class来改变样式
  • 版本三通过纯css代码来实现样式变换

组件封装

总结:基本方法

  • 结构设计
  • 展现效果·行为设计
  • API(功能)
  • Event(控制流)

重构:插件化

解耦

  • 将控制元素抽取成插件
  • 插件和组件之间通过依赖注入方式建立联系

示例代码


function pluginController(slider){
const controller = slider.container.querySelector(if(controller){
const buttons = controller.querySelectorAll( '.s1controller.addEventListener( 'mouseover', evt=>{const idx = Array.from(buttons).indexof(evt.taif(idx =0){
slider.slideTo(idx);slider.stop();
}
});
controller.addEventListener( 'mouseout", evt>{slider.start(;
});
class Slider{
constructor(id,opts = {images:[],cycle: 3000})this.container = document.getElementById( id);this.options = opts;
this.container.innerHTML = this.render();
this.items = this.container.querySelectorAll( '.Sthis.cycle = opts.cycle l3000;
this.slideTo(0);
}
render(){
const images = this.options.images;const content = images.map(image ->`<li class="slider-list___item">
<img src="${image}">
</li>
'.trim());
return '<ul>${content.join( ")/ul>;}

这里的情况就是将slider从大组件中抽取出来单独成一个小组件,使用依赖注入的方式将小组件和大组件联系起来。

过程抽象

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

示例

function once(fn){
return function(...args){
if(fn) {
const ret = fn.apply(this,args);fn= null;
return ret;}
}}

高阶函数

  • HOF 以函数作为参数以函数作为返回值常用于作为函数装饰器 HOF
  • Once
  • Throttle
  • Debounce
  • Consumer/2
  • lterative

编程范式

  • 命令式
let list =[1,234];
let mapl=[];
for(let i=0; i< list.length; i++)
{mapl.push(list[i] * 2);
}

  • 声明式
let list = [1234];
const double = x →>×* 2;
list.map(double);

声明式代码更加简洁