自定义工具函数库
[toc]
打包自定义工具库
自定义功能
函数相关
防抖函数(debounce)
函数防抖(Debounce):指触发事件后在 n 秒内函数只执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。如:搜索框,滚动条
功能:当事件被触发N秒之后再执行回调,如果在N秒内被触发,则重新计时。
比如一个输入框,当应用实现防抖函数之后,用户不断输入内容时,函数会一直被触发,则不会发送请求。只有当用户在一段规定时间N内未进行输入操作,才会发送一次请求。如果在N秒内间断的输入内容,且间断的时间小于规定时间N时,则会重新计时且不会发送请求。
这样降低了发送请求的次数,提高性能的同时也提升了用户体验。
注意:
防抖和节流函数中 return 的函数不能使用箭头函数,如果使用箭头函数则 this 就会指向 globalFunction,就会有问题
手写实现防抖函数(js):
1 | // func是用户传入需要防抖的函数 |
vue
1 | export default { |
1 | <template> |
说明:
globalFunction 类的 debounce、throttle 返回的一个函数,就相当于
1 | btnDebounce() { |
节流函数(throttle)
函数节流(throttle):指连续触发事件但在 n 秒中只执行一次,避免某些事件频繁触发。如:按钮点击
功能:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。
实现节流函数(js):
1 | // func是用户传入需要防抖的函数 |
vue
1 | export default { |
使用lodash
https://www.lodashjs.com/docs/lodash.debounce?ivk_sa=1024320u
https://www.cnblogs.com/zhongxu6868/articles/15932369.html
1 | // 全部引入lodash |
数组相关
扁平结构与树形结构互转
扁平结构转树形结构
1 | // 数据源格式 |
可配置项
1 | // 源数据 |
可以这样调用
1 | FlatToNested(nodes,{ |
树形结构转扁平结构
1 | ``` |
对象相关
过滤掉不需要的key / 只取需要的key
1 | let device = { |
替换key的名称
1 | // 源数据 |
结果:
1 | [ |
交换指定索引位置的值
源代码
1 | let swap = (arr, i, j) => { |
测试
1 | let arr = Array.from(Array(10), (_, k) => k) |
测试结果
1 | [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] |
对象合并
对象合并的多种方式(对于通过接口获取数据之后赋值给本地对象的时候极其有用)
第一种:手动赋值(很捞)
1 | const obj1 = { |
这种方法时最简单的,但是日常项目中一个对象的属性是非常多的,如果还是用这种方法的话就会有点繁琐了
第二种:扩展运算符
1 | const obj1 = { |
通过扩展运算符的特性可以快速的进行对象的合并,缺点就是需要用一个新的变量来接收
第三种:Object.assign()
(最推荐)
1 | const obj1 = { |
Object.assign()
方法可以接收一个目标对象和一个或者多个源对象作为参数,如果对象中有一样的属性,后面对象的属性会覆盖掉前面对象的那个属性。
其原理是将后面的对象通过
set
访问属性来添加进目标对象,所以最后返回的值其实就是第一个目对象,可以在目标对象上添加访问属性来见识覆盖过程
1 | const obj1 = { |
这个方法的使用场景有很多,都特别好用,例如:
1.vue 项目清空表单
日常有些同学清空表单可能会给 form
里面的数据一个一个的赋空值来进行表单的清空操作,其实效率是非常低的,但是如果使用 Object.assign()
和$options
配合的话,效率就很高
1 | // 日常 |
如果用的element
的el-form
,也是一个道理
Tips: $options
存储的是 Vue
实例的初始值,所以通过 Object.assign()
覆盖值的特性,可以快速的做到重置表单
同理,如果是在进行表单数据修改的时候也能对页面的 ruleForm
进行快速的赋值
1 | const { data } = await xxxApi.getList(); |
获取对象的keys和values
1 | getKeys(obj) { |