这是我参与「第五届青训营 」伴学笔记创作活动的第6天。
写好JS的原则
- 各司其职
- 组件封装
- 过程抽象
各司其职
- HTML/CSS/JS各司其职
- 应当避免不必要的由JS直接操作样式
- 可以用class来表示状态
- 纯展示类交互寻求零JS方案
组件封装
用js写轮播图
-
结构:HTML 轮播图——>列表结构,使用无序列表
<ul>元素实现 -
表现:CSS 使用CSS绝对定位将图片重叠在同一个位置
轮播图切换的状态使用修饰符(modifier)
切换动画使用CSS的transition
-
行为设计:API JS API设计应保证原子操作,职责单一,满足灵活性
Slider
+getSelectedItem()
+getSelectedItemIndex()
+slideTo()
+slideNext()
+slidePrevious()
- 行为:控制流 使用自定义事件来解耦
组件封装
总结:基本方法 封装性、正确性、扩展性、复用性
重构:插件化、模板化、组件框架
解耦
- 将控制元素抽取成插件
- 插件与组件之间通过依赖注入方式建立联系
- 将HTML模板化,更易于扩展
抽象
- 将通用的组件模型抽象出来
过程抽象
- 用来处理局部细节控制的一些方法
- 函数式编程思想的基础应用
例子
操作次数限制
- 一些异步交互
- 一次性的http请求
高阶函数
- 以函数作为参数
- 以函数作为返回值
- 常用于作为函数装饰器
编程范式
- Toggle - 命令式
- Toggle - 声明式
- Toggle - 三态
举个例子
window.addEventListener('load', function() {
var leftArrow = this.document.querySelector('.lf'); var rightArrow = this.document.querySelector('.lr'); // 鼠标移动到左右箭头的位置更换图片 有灰色背景的图片 leftArrow.addEventListener('mouseenter', function() { this.style.backgroundPosition = '0 0'; }); leftArrow.addEventListener('mouseleave', function() { this.style.backgroundPosition = '-83px 0'; }); rightArrow.addEventListener('mouseenter', function() { this.style.backgroundPosition = '-42px 0'; }); rightArrow.addEventListener('mouseleave', function() { this.style.backgroundPosition = '-123px 0'; }); // 获取图片 和 小点 var imgs = this.document.querySelectorAll('.img'); var dots = this.document.querySelector('.dots').querySelectorAll('span'); // 给图片设置index 属性,好判断当前的图片是哪一张 for (let i = 0; i < imgs.length; i++) { imgs[i].setAttribute('data-index', i); } // 获取当前图片 和 图片的index(数组下标) var current = this.document.querySelector('.current'); var currentIndex = current.getAttribute('data-index'); // 左箭头的点击事件,点击了就返回前一张图片 // 如果当前图片为第一张那么需要更换到最后一张图片也就是第四张 leftArrow.addEventListener('click', function() { if (currentIndex > 0) { imgs[currentIndex].classList.remove('current'); dots[currentIndex].classList.remove('square'); imgs[--currentIndex].classList.add('current'); dots[currentIndex].classList.add('square'); } else { imgs[currentIndex].classList.remove('current'); dots[currentIndex].classList.remove('square'); currentIndex = 4; imgs[currentIndex].classList.add('current'); dots[currentIndex].classList.add('square'); } }); // 点击右箭头下一张图片切换 // 如果当前为第五张图片,那么切换回第一张图片 rightArrow.addEventListener('click', changeImage); var timer = this.setInterval(changeImage, 8000); function changeImage() { if (currentIndex < 4) { imgs[currentIndex].classList.remove('current'); dots[currentIndex].classList.remove('square'); imgs[++currentIndex].classList.add('current'); dots[currentIndex].classList.add('square'); } else { imgs[currentIndex].classList.remove('current'); dots[currentIndex].classList.remove('square'); currentIndex = 0; imgs[currentIndex].classList.add('current'); dots[currentIndex].classList.add('square'); } }; // 小圆点的点击事件 for (let k = 0; k < dots.length; k++) { dots[k].setAttribute('data-index', k); dots[k].addEventListener('click', function() { var index = this.getAttribute('data-index'); if (index != currentIndex) { imgs[currentIndex].classList.remove('current'); dots[currentIndex].classList.remove('square'); imgs[index].classList.add('current'); dots[index].classList.add('square'); currentIndex = index; } }) }}); t.csdn.cn/dm495