88 lines
2.5 KiB
TypeScript
88 lines
2.5 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||
|
||
// 深拷贝
|
||
export function deepMerge(...objs: any[]): any {
|
||
const result = Object.create(null)
|
||
objs.forEach((obj) => {
|
||
if (obj) {
|
||
Object.keys(obj).forEach((key) => {
|
||
const val = obj[key]
|
||
if (isPlainObject(val)) {
|
||
// 递归
|
||
if (isPlainObject(result[key])) {
|
||
result[key] = deepMerge(result[key], val)
|
||
} else {
|
||
result[key] = deepMerge(val)
|
||
}
|
||
} else {
|
||
result[key] = val
|
||
}
|
||
})
|
||
}
|
||
})
|
||
return result
|
||
}
|
||
|
||
export const isPlainObject = (val: any) =>
|
||
!!val && typeof val === 'object' && val.constructor === Object
|
||
|
||
//防抖
|
||
// fn 要执行的函数
|
||
// delay 执行函数
|
||
export const debounce = <T extends (...args: any[]) => ReturnType<T>>(
|
||
callback: T,
|
||
timeout: number
|
||
): ((...args: Parameters<T>) => void) => {
|
||
let timer: ReturnType<typeof setTimeout>
|
||
|
||
return (...args: Parameters<T>) => {
|
||
clearTimeout(timer)
|
||
timer = setTimeout(() => {
|
||
callback(...args)
|
||
}, timeout)
|
||
}
|
||
}
|
||
|
||
//封装节流
|
||
// fn 要执行的函数
|
||
// delay 执行函数
|
||
export const throttle = <T extends (...args: any[]) => ReturnType<T>>(
|
||
callback: T,
|
||
timeout: number
|
||
): ((...args: Parameters<T>) => void) => {
|
||
let valid = true
|
||
let timer: ReturnType<typeof setTimeout>
|
||
|
||
return (...args: Parameters<T>) => {
|
||
if (!valid) {
|
||
return false
|
||
}
|
||
valid = false
|
||
|
||
clearTimeout(timer)
|
||
timer = setTimeout(() => {
|
||
callback(...args)
|
||
valid = true
|
||
}, timeout)
|
||
}
|
||
}
|
||
|
||
export const exportBlob =(res:any)=>{
|
||
const blob = new Blob([res]); //res为后台返回的文件流,注意参数是以数组的形式上传
|
||
const href = URL.createObjectURL(blob); //URL都要大写,这点也要注意
|
||
const link = document.createElement("a") //生成a标签用于模拟下载
|
||
link.download = "test.xlsx"; //自定义下载文件名称
|
||
link.href = href //把生成的href赋值到a标签上,在这里我遇到一个问题,
|
||
//直接赋值无法把href赋值到a标签的href上(不知道是不是因为封装框架的问题)
|
||
//我采用了原生的方法
|
||
//link.setAttribute("href", href);
|
||
document.body.appendChild(link);
|
||
link.click();
|
||
//释放空间
|
||
document.body.removeChild("link");
|
||
URL.removeObjectURL(href);
|
||
}
|
||
|
||
|
||
|