超好用-Vue、React项目开发中常用到的方法封装

在实际项目开发中,我们总是会遇到各种各样的小问题,功能不难,却要必须写,在这里我总结一些常用到的小方法,以便下次使用时可以直接调用。

1. 判断上传的文件是否为图片格式

// 自定义封装一个方法, 可以使用 export 导出

const judgeImg = (val: any) => {
	const fileNames = (val + '').split('.') // 将上传的文件名从 .  进行截取
	const fileType = fileNames[fileNames.length - 1] //  获取文件类型
	const strFilter = ['jpeg', 'gif', 'jpg', 'png', 'bmp', 'pic', 'svg'] // 所有的图片类型
	return strFilter.includes(fileType) // 如果是图片类型,则返回true
}

目前上述代码用来判断上传的文件是否是图片格式,当然也不局限于判断图片,同样也可以用来判断文档、表格等类型,只需要将strFilter 里的类型替换成相应的即可。

2.文件导出(下载)方法

// 1、先封装文件下载的接口api,可以使用 export 导出

const exportExcel = (url: string, params: any) => {
	return request({
		url,
		method: 'post',
		responseType: 'blob',
		data: params
	})
}

// 2、在封装文件导出方法,调用上面的接口api  可以使用 export 导出

const exportExcelHandler = (data: any, params: any) => {
	const hideLoading = message.loading('下载中...', 0)
	exportExcel(data.url, { ...params }).then((res:any) => {
		const link = document.createElement('a')
		const blob = new Blob([res], { type: 'application/vnd.ms-excel' }); // 如果不行,换成 [res.data]
		link.style.display = 'none';
      	link.href = URL.createObjectURL(blob);
      	link.download = `${dayjs(new Date()).format('YYYY-MM-DD')}${data.fileName}.xlsx`; //下载的文件名
      	document.body.appendChild(link);
      	link.click();
      	document.body.removeChild(link);
	}).finally(() => {
		setTimeout(hideLoading, 0);
	})
}

3. 图片下载方法

// 自定义封装一个方法,可以使用 export 导出

const fileDownload = (fileUrl: string, fileName: string) => {
	const hideLoading = message.loading('下载中...', 0);
	const link = document.createElement('a');
	link.style.display = 'none';
  	link.href = fileUrl; //文件的url
  	link.download = fileName; //下载的文件名
  	document.body.appendChild(link);
  	link.click();
  	document.body.removeChild(link);
  	setTimeout(hideLoading, 0);
}

4. 获取顶部地址栏地址

// 自定义封装一个方法,可以使用 export 导出

const getTopUrl = () => {
  return window.location.href.split('/#/')[0];
};

5. 数组对象中根据多个条件去重

// 自定义封装一个方法,可以使用 export 导出
// 在这里,我以id 和name 为例,根据这两个字段进行数组去重
const removal = (arr) => {
	const cache = []  // 缓存,用于记录
	for(const t of arr) {
		// 检查缓存中是否已经存在
		if(cache.find(item => item.id === t.id && item.name === t.name)) {
			// 如果存在,则说明已经记录过,现在这个是多余的,直接忽略
			continue;
		}
		// 不存在,说明没遇到过,把它记录下来
		cache.push(t)
	}
	// 最后得到的cache 就是去重后的结果
	return cache
}

6. 数组对象中根据某个条件去重

// 自定义封装一个方法,可以使用 export 导出
// 在这里,我以 name 为例,根据这个字段进行数组对象去重
// 方法一:
const removal = (arr: any[]) => {
	const res = new Map()
	// 这一步的逻辑是,判断res中是否已经存在 name,如果不存在,则添加,如果存在,则本条重复,过滤
	return arr.filter((item: any) => !res.has(item.name) && res.set(item.name, item.value)) 
}

// 方法二:
const removal = (arr: any[]) => {
	if(arr.length > 0) {
		const res= new Map()
		for (const item of arr) {
			if (!res.has(item.jobNo)) {
				res.set(item.jobNo, item)
			}
		}
		let data = [...map.values()]
		return data
	}
}

// 方法三:
const removal = (arr: any[]) => {
  	const step: any[] = [];
  	arr.reduce((prev, curr) => {
    	if (!prev.includes(curr.value)) {
      		step.push(curr);
      		prev.push(curr.value)
    	};
    	return prev
  	}, []);
  	return step;
}

7. 根据某个字段,判断数组对象中是否有重复的选项

// 自定义封装一个方法,可以使用 export 导出
// 在这里,我以 jobNo为例,根据这个字段进行数组对象去重

const judgeIsRepeat = (arr: any[]) => {
	const newArr = arr.map((item: any) => item.jobNo)
	const arrSet = new Set(newArr)  // 使用 Set去重
	if(!(arrSet.size == newArr.length)) {
		return message.warning('该数组对象有重复的选项')
	} else {
		return message.warning('数组没有重复')
	}
}

8、防抖


/* @params: fn  执行的方法(即回调函数)
*  @params: wati 时间间隔
* 对于短时间内连续触发的事件(上面的滚动事件),防抖的含义是让某个时间期限(如1000毫秒)内,事件处理函数只执行一次。
* 实际运用:按钮频繁点击,页面resize
*/ 

export const debounce = (fn: any, wait: number) => {
	let timer: any = null;
	return function () {
		if (timer) {
			clearTimeout(timer)
		}
		timer = setTimeout(fn, wait)
	}
}

9、节流


/* @params  fn  执行的方法(即回调方法)
*  @params  wait  时间间隔
* 定义: 让事件在一定时间内执行一次
* 实际运用: 搜索框input事件,例如要支持输入实时搜索可以使用节流方案
*/

export const throttle = (fn: any, wait: number) => {
	let timer: any = null;
	return function (...args: any) {
		if(!timer) {
			timer = setTimeout(function() {
				fn(...args);
				timer = null
			}, wait)
		}
	}
}

10、金钱格式化,去除多余逗号


// @params: num: 传入的数值

exprot const get_money_num = (num: string | undefined) => {
	if (!num) return 0
	num = num + ''
	if (num.indexOf(',') != -1) return num.replace(/\,/g, '')
	else return num
}

11、解决js中N个数据求和精度溢出

/**
 * 金额求和
 * @param arr 要求和的数组
 * @returns
 */
export const countSum: (arr: number[]) => number = (arr) => {
  if (!arr.length) return 0;
  arr = arr.map((v: number) => {
    if (v && !Number.isNaN(Number(v))) return Math.round(v * 100);
    return 0;
  });
  const result =  arr.reduce((prev: number, curr: number) => {
    return prev + curr
  }, 0);
  return result / 100;
};

// 使用方式
countSum( [ a, b, c ] )   // 相加
countSum( [ a, -b, -c ] ) // 相减

注意:

1、countSum方法中传入的值必须要是数字,使用该方法前,如果是字符串类型,需要将其转化,最简单的形式是在前面加个 +
2、如果是金额形式的数字字符串,则很可能包含逗号,在使用该方法前,需要去除其中的逗号,在将其转化成数字

PS: 接下来我会持续往里面完善我所用到的各类实用的方法,欢迎大家提出意见!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值