123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /**
- * @description 函数防抖
- * @param fn 需要防抖的函数
- * @param delay 延迟时间(毫秒)
- * @param immediate 是否立即执行
- * @returns 防抖后的函数
- */
- import dayjs from "dayjs";
- export function debounce<T extends (...args: any[]) => any>(
- fn: T,
- delay = 200,
- immediate = false
- ): (...args: Parameters<T>) => ReturnType<T> | undefined {
- let timer: NodeJS.Timeout | null = null;
- let isInvoked = false;
- return function (this: ThisParameterType<T>, ...args: Parameters<T>) {
- const context = this;
- // 如果需要立即执行且未调用过
- if (immediate && !isInvoked) {
- isInvoked = true;
- return fn.apply(context, args);
- }
- // 清除之前的定时器
- if (timer) {
- clearTimeout(timer);
- }
- return new Promise<ReturnType<T>>((resolve) => {
- timer = setTimeout(() => {
- const result = fn.apply(context, args);
- isInvoked = false;
- resolve(result);
- }, delay);
- });
- };
- }
- export const phoneConvert = (number: string) => {
- if (!number) return "";
- let pat = /(\d{3})\d*(\d{3})/;
- return number.replace(pat, "$1****$2");
- };
- /**
- * @description 根据语言获取时区
- */
- const language = ["pt-BR", "zh-CN", "en-US"];
- function getLang(utc: string) {
- let reg = new RegExp(utc, "i");
- const i = language.findIndex((n, index) => {
- if (reg.test(n)) {
- return index;
- }
- });
- let n = i < 0 ? 0 : i;
- return language[n];
- }
- export const timeFormat = (
- time: number,
- lang = "en",
- delimiter?: undefined | string,
- day = false
- ): string => {
- if (!time) return "";
- const len = (time + "").length;
- if (len === 10) {
- time = time * 1000;
- }
- if (delimiter) {
- return dayjs(time).format("DD/MM/YYYY").replaceAll("/", delimiter);
- }
- // 月 /日 / 年
- // 日 / 月 / 年
- if (day) {
- return dayjs(time).format("DD/MM/YYYY");
- }
- return dayjs(time).format("DD/MM/YYYY HH:mm:ss");
- };
- export const brTimeFormat = (time: number) => {
- if (!time) return "";
- const len = (time + "").length;
- if (len === 10) {
- time = time * 1000;
- }
- const timeOffset = (new Date().getTimezoneOffset() - 3 * 60) * 60 * 1000;
- const brTime = time + timeOffset;
- return dayjs(brTime).format("DD/MM/YYYY HH:mm:ss");
- };
- /**
- * @description 复制文本
- */
- export let copyText = function (text: string) {
- if (navigator.clipboard) {
- copyText = (text: string) => {
- navigator.clipboard.writeText(text);
- };
- } else {
- copyText = (text) => {
- const input = document.createElement("input");
- input.setAttribute("value", text);
- document.body.appendChild(input);
- input.select();
- document.execCommand("copy");
- document.body.removeChild(input);
- };
- }
- copyText(text);
- };
- /**
- * @description 两个数值计算百分比
- * @param {current} 当前值
- * @param {source} 总值
- * @return number
- */
- export const percentage = (current: number, source: number) => {
- if (!source) return 0;
- const num = (current * 100) / source;
- return num > 100 ? 100 : flatPoint(num);
- };
- /**
- * @description 保留两位数浮点数
- */
- export const flatPoint = (num: number) => {
- return Number(num.toFixed(2));
- };
- /**
- * @description 是否是移动端
- */
- export function isMobile(): boolean {
- try {
- document.createEvent("TouchEvent");
- return true;
- } catch (e) {
- return false;
- }
- }
|