7:函数的防抖与节流
7.1 卡顿现象
原因:事件的触发非常频繁,每一次的触发都会引起回调函数的执行,如果回调函数内部有计算,且频繁触发,那么就会导致浏览器卡顿。
7.2 防抖
介绍:指频繁触发事件,但是只会执行最后一次的事件回调,之前的回调都会被取消。
技术:lodash中debounce方法封装了防抖的实现
7.3 节流
介绍:指频繁触发事件,但是事件回调在一定的时间内只会执行一次,把频繁触发变为少量触发。
技术:lodash中的throttle方法封装了节流的实现
7.4 三级联动的添加一级分类背景色的节流操作
import throttle from 'lodash/throttle'
//注意使用普通函数,箭头函数有this问题
changeIndex: throttle(function(index){
this.currentIndex = index
},50)
8:三级联动路由的跳转与传参
8.1 跳转
1.声明式路由导航:不能较好的完成路由跳转
存在问题:卡顿问题
原因:router-link标签它是一个组件,当循环遍历三级联动分类时,会在一瞬间创建很多router-link标签,当数据发生变化时,还涉及到模板解析、虚拟DOM、真实DOM等很多步骤,消耗内存很大,导致页面卡顿。
2.编程式路由导航:能够较好的完成跳转,但是不够优秀
存在问题:每一个a标签都绑定了对应的点击事件,会使点击事件很多。
3.编程式路由导航 + 事件委派:能够很好的完成路由跳转
原因:将所有的点击跳转事件都委派给统一的父节点来完成,只有一个回调。
8.2 传参(要求传递名字与对应id)
1.编程式路由导航 + 事件委派涉及的问题与解决方法
问题1:因为父节点中包含了较多的子节点(h3、dt、dl、a等),怎么区分点击的是a节点?
解决方法:给a标签添加自定义属性 :data-categoryName="c1.categoryName",通过鼠标事件 event.target.dataset 去拿到对应的自定义属性并且判断是否是a标签(注意浏览器会把驼峰式自定义属性名改为非驼峰式 categoryName ==> categoryname)
问题2:怎么传递对应的id
解决方法:给三级a标签分别添加自定义属性 :data-category1Id、:data-category2Id、:data-category3Id进行区分
// 三级联动路由跳转
goSearch(event) {
// 解构出自定义属性
const { categoryname, category1id, category2id, category3id } = event.target.dataset;
// 整理参数
const location = { name: "search" };
const query = { categoryName: categoryname };
// 判断是否是 a标签
if (categoryname) {
if (category1id) {
query.category1Id = category1id;
} else if (category2id) {
query.category2Id = category2id;
} else {
query.category3Id = category3id;
}
}
// 整理参数
location.query = query
this.$router.push(location);