JavaScript前端实用的工具函数封装

2022-07-20 661阅读

温馨提示:这篇文章已超过636天没有更新,请注意相关的内容是否还可用!

这篇文章主要为大家介绍了JavaScript前端实用的一些工具函数的封装,有需要的朋友可以借鉴参考下,希望能够有所帮助!

1.webpack里面配置自动注册组件

第一个参数是匹配路径,第二个是深度匹配,第三个是匹配规则

const requireComponent = require.context('./libary', true, /\.vue$/)
export default {
  install (Vue) {
requireComponent.keys().forEach((item) => {
  **根据组件的name注册全局组件**
  Vue.component(
requireComponent(item).default.name,
requireComponent(item).default
  )
})
  }
}

2.自定义指令图片懒加载

导入默认图片

import defaultImg from '@/assets/images/200.png'
export default {
  install (Vue) {
// // 注册自定义指令   v2方法
Vue.directive('lazy', {
  // inserted () {
  //   console.log(11111)
  // }
 //注册自定义指令  v3方法
  mounted (el, binding) {
// 浏览器提供 IntersectionObserver
const observer = new IntersectionObserver(
  ([{ isIntersecting }]) => {
// console.log(isIntersecting, '====IntersectionObserver')
if (isIntersecting) {
  console.log(el, binding, 11111)
  // 图片加载失败就显示默认图片
  el.onerror = function () {
el.src = defaultImg
  }
  el.src = binding.value
  // 不在监听dom
  observer.unobserve(el)
}
  },
  {
threshold: 0.01
  }
)
// 监听dom
observer.observe(el)
  }
})
  }
}

3.图片文件转base64格式(实现预览)

基于 FileReader 把文件读取为 base64 的字符串:

fileChange (e) {
  // console.log(e.target.files)
  if (e.target.files.length === 0) {
// 没有选择图片
this.avatar = ''
  } else {
// 创建 fr 对象---FileReader构造函数
const fr = new FileReader()
// 读取文件
fr.readAsDataURL(e.target.files[0])
// 监听加载事件,读取成功后执行里面的回调
fr.onload = () => {
// 将结果赋给xxx
  this.avatar = fr.result
}
  }
},

给input设置change改变事件

1 设置一个变量接收转换的数据2 拿到事件目标,里面有个方法e.target.files是个伪数组.通过e.target.files.length判断用户是否选择了图片3 通过new FileReader拿到一个实例4 通过 实例名.readAsDataURL 将图片转成base64格式5 onload可以监听转换完成后/给声明变量赋值

4.数组转为tree型结构(递归实现)

当后端传来的数据是扁平化的时候,前端可用代码处理数据得到树形结构

列表型数据的关键属性: id 和 pid, id指的是自己的部门id, pid指的是父级部门的id (空则没有父级部门) 孩子的pid与父亲的id一致

// 注  :  list 传来的数组 , value 筛选的条件
function arrToTree(list, value) {
  // 1.定义一个空数组,后续往里面添加树形结构
  const arr = []
  list.forEach(item => {
  // 2. 筛选满足要求的item
if (item.pid === value) {
  // 3.筛选所有孩子,即pid与父级id一致的(外循环走一次,里面走完所有)
  const children = arrToTree(list, item.id)
  // 4.父级中有孩子,才能加上children属性
  if (children.length > 0) {
   // 5. 因为需要的树形结构中孩子属性名为children,手动给父级添加一个children属性,并赋值
item.children = children
  }
   // 6. 把满足要求的一组数据push进去
  arr.push(item)
}
  })
  // 返回树形结构
  return arr
}

// 第一次调用函数,找出pid为''的每一项(即父级),后面调用,找孩子

调用: arrToTree(list, '')

5.递归深拷贝

  let obj = {
name:'张三',
age:20,
hobby:['学习','上课','干饭'],
student:{
name:'尼古拉斯赵四',
age:38
}
}
//深拷贝函数
function copy(obj,newObj){
for(let key in obj ){
if( obj[key] instanceof Array ){
newObj[key] = []
//递归调用 继续深拷贝数组
copy(obj[key],newObj[key])
}else if( obj[key] instanceof Object ){
newObj[key] = {}
//递归调用 继续深拷贝对象
copy(obj[key],newObj[key])
}else{
newObj[key] = obj[key]
}
}
}
//开始拷贝
let newObj = {}
copy(obj,newObj)

6.将数组里面的对象转换成我们需要的键值对

我们拿到的数据:arr=[{入职日期:43535,姓名:'jack',手机号:111111....},{}]

需要的上传格式: [{timeOfEntry:43535,username:'jack',mobile:111111....},{}]

 //手动写一个具有对应关系的对象
  const userRelations = {
'入职日期': 'timeOfEntry',
'手机号': 'mobile',
'姓名': 'username',
'转正日期': 'correctionTime',
'工号': 'workNumber'
  }
 //第一个参数是自己写的对应关系对象,第二个参数是原数组
 function demandArr(userRelations,arr){
  //创建一个空数组
  const newArr = []
  arr.forEach(item => {
  //创建一个空对象
const obj = {}
//循环数组里的每一个对象
for (const k in item) {
  const englishKey = userRelations[k] 
obj[englishKey] = item[k]
  }
 newArr.push(obj)
   })
  }
  // console.log(newArr)