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

52 阅读2分钟

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

如何让写好JS

深夜食堂
版本一:

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

版本二:

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

用classname切换样式
版本三:

  background-color: black;
  color: white;
  transition: all 1s;
}

不使用js来操作白天夜晚模式切换,巧妙简便
总结
各司其职,纯展示类交互寻求零CSS方案,避免用不必要的JS操作样式
组件是指Web页面上抽出来的一个个HTML、CSS、JS的单元。好的组件具有封装性、正确性、扩展性、复用性

轮播图实现

HTML:轮播图是一个列表结构,可以用无序列表<ul>元素
CSS:

  • 绝对定位,将图片重叠在同一位置。
  • 切换状态使用修饰符(modifier)
  • 切换动画使用CSS transition
    JS:
  • API:
    1.+getSelectedltem() 当前选中图片元素
    2.+getSelectedltemIndex() 当前选中图片元素在列表中的下标
    3.slideTo() 当前某图片
    4.slideNext() 向后轮播下一张图片
    5.slidePrevious() 向前轮播下一张图片
  • Event
    1.使用自定义事件解耦
重构化
  • 将控制元素抽取成插件
  • 插件与组件之间通过依赖注入方式建立联系
模板化

HTML模板化,易于拓展

组件框架抽象化

将通用的组件模型抽象出来

过程抽象

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

image.png

例子:

操作次数限制
一些异步交互
一次性的HTTP请求
在两秒内,按钮只能点击一次,若点击多次就会报错

image.png

解决:

once:为了能够让“只执行一次”的需求覆盖不同的事件处理,我们可以将这个需求剥离出来。这个个过程称为过程抽象
高阶函数:以函数作为参数,以函数作为返回值,常用于作为函数装饰器 常用高阶函数

  • Once
  • Throttle节流函数
  • Debounce防抖函数
  • Consumer/2
  • Iterative
    命令式与声明式

image.png Toggle-命令式

  if(evt.target.className === 'on'){
    evt.target.className = 'off';
  }else{
    evt.target.className = 'on';
  }
}

Toggle-声明式

  return function(...args){
    let action = actions.shift();
    actions.push(action);
    return action.apply(this, args);
  }
}

switcher.onclick = toggle(
  evt => evt.target.className = 'off',
  evt => evt.target.className = 'on'
);

声明式有更强的可扩展性
Toggle-三态

  return function(...args){
    let action = actions.shift();
    actions.push(action);
    return action.apply(this, args);
  }
}

switcher.onclick = toggle(
  evt => evt.target.className = 'warn',
  evt => evt.target.className = 'off',
  evt => evt.target.className = 'on'
);
总结

本节课月影老师介绍了过程抽象,理解高阶函数和函数装饰器。编程语言有命令式和声明式两种风格,现在编程语言代码同时拥有两种编程方式。掌握了三个写代码原则,组件封装,过程抽象。