🍀简简单单使用 TS 封装个工具库【更新中 ✍】

一、表单篇

1、限制输入字符只能是整型字符串

vue 复制代码
<template>
    <t-input
      v-model="params.substringStart"
      placeholder="输入数字"
      @change="filterNumber('substringStart')"
    />
</template>
<script setup lang="ts">
const filterNumber = (key: string) => {
  let value = params.value[key].replace(/[^\d]/g, '');
  // 移除前导零,但保留单个零
  value = value.replace(/^0+/, '') || '0';
  params.value[key] = value;
};
</script>

2、限制输入字符串可以有小数点

vue 复制代码
<template>
    <t-input
      v-model="params.substringStart"
      placeholder="输入数值"
      @change="filterNumber('substringStart')"
    />
</template>
<script setup lang="ts">
const filterNumber = (key: any) => {
  formData.value[key] = formData.value[key].replace(/[^\d.]/g, '');
  // 确保只有一个小数点
  const parts = formData.value[key].split('.');
  if (parts.length > 2) {
    formData.value[field] = `${parts[0]}.${parts.slice(1).join('')}`;
  }
};
</script>

二、数据篇

1、下划线转驼峰

typescript 复制代码
/**
* @param {T} data 数据(可以是数组或对象)
* @returns {T} 返回驼峰命名的数组或对象
*/
export const camelCase = <T>(data: T): T => {
  let result: any;
  let key: string;
  if (typeof data === 'object') {
    if (Array.isArray(data)) {
      for (let i = 0; i < data.length; i++) {
        data[i] = camelCase(data[i]);
      }
    } else {
      result = {};
      for (const k in data) {
        key = k.replace(/(_[a-z])/g, (match) => match.substring(1).toUpperCase());
        result[key] = camelCase(data[k]);
      }
      data = result;
    }
  }
  return data;
};

2、驼峰转下划线

typescript 复制代码
/**
* @param {T} data 数据(可以是数组或对象)
* @returns {T} 返回下划线命名的数组或对象
*/
export const snakeCase = <T>(data: T): T => {
  let result: any;
  let key: string;
  if (typeof data === 'object') {
    if (Array.isArray(data)) {
      for (let i = 0; i < data.length; i++) {
        data[i] = snakeCase(data[i]);
      }
    } else {
      result = {};
      for (const k in data) {
        key = k.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase();
        result[key] = snakeCase(data[k]);
      }
      data = result;
    }
  }
  return data;
};

3、拷贝

typescript 复制代码
/**
 * @param {Array | Object} obj 待拷贝的数据 
 * @returns T 
 */
const copyData = <T>(obj: T): T => {
  let newObj = null
  if (typeof (obj) === 'object' && obj !== null) {
      newObj = obj instanceof Array ? [] : {}
      // 进入下一层进行递归
      for (let i in obj) newObj[i] = copyData(obj[i])
  } else {
      newObj = obj
  }
  return newObj
}

4、随机数

typescript 复制代码
/**
* @description 生成随机数
* @param {Number} min 最小值
* @param {Number} max 最大值
* @return number
*/
export function randomNum(min: number, max: number): number {
  let num = Math.floor(Math.random() * (min - max) + max);
  return num;
}

5、数值转化字符串

typescript 复制代码
/**
* @param {number} n 数值
* @returns {string} 返回字符串
*/
export const getAlphabetSequence = (n: number) => {
  let letter = '';
  while (n >= 0) {
    letter = String.fromCharCode(97 + (n % 26)) + letter;
    n = Math.floor(n / 26) - 1;
  }
  return letter;
};

6、数组转树结构

typescript 复制代码
/**
* @param {any} data 数据
* @param {string} id 当前节点 key
* @param {string} pid 父节点 key
* @returns {string} 返回字符串
*/
export function listToTree(data: any, id: string = 'id', pid: string = 'parentId') {
  const result: any = [];
  const temp: { [key: string]: any } = {};
  for (let i = 0; i < data.length; i++) {
    temp[data[i][id]] = data[i];
  }
  for (let k = 0; k < data.length; k++) {
    if (temp[data[k][pid]] && data[k][id] !== data[k][pid]) {
      if (!temp[data[k][pid]].children) {
        temp[data[k][pid]].children = [];
      }
      if (!temp[data[k][pid]].level) {
        temp[data[k][pid]].level = 1;
      }
      data[k].level = temp[data[k][pid]].level + 1;
      temp[data[k][pid]].children.push(data[k]);
    } else {
      result.push(data[k]);
    }
  }
  return result;
}

7、文件下载

typescript 复制代码
/**
* @param {Blob} blob Blob 流
* @param {string} fileName 文件名
*/
export const downloadFileByBlob = (blob: Blob, fileName: string) => {
  const url = window.URL.createObjectURL(blob); // 创建下载链接
  const aLink = document.createElement('a'); // 赋值给 a 标签的 href 属性
  aLink.style.display = 'none';
  aLink.href = url;
  aLink.setAttribute('download', fileName);
  document.body.appendChild(aLink); // 将 a 标签挂载上去
  aLink.click(); // a 标签 click 事件
  document.body.removeChild(aLink); // 移除 a 标签
  window.URL.revokeObjectURL(url); // 销毁下载链接
};

8、时区转换

typescript 复制代码
/**
* @param {string} timezone (时区 +9:00;-10:00)
* @returns {Date} date 时间
*/
export const convertByTimezone = (timezone: string, date = new Date()) => {
  // 验证时区格式
  if (!/^[+-]\d{1,2}:\d{2}$/.test(timezone)) {
      return '';
  }

  // 提取小时和分钟偏移量
  const [sign, hours, minutes] = timezone.match(/^([+-])(\d{1,2}):(\d{2})$/).slice(1);
  const offsetHours = parseInt(hours, 10);
  const offsetMinutes = parseInt(minutes, 10);
    
  // 计算总偏移毫秒数
  const totalOffset = (offsetHours * 60 + offsetMinutes) * 60000;
  const offsetMs = sign === '+' ? totalOffset : -totalOffset;
    
  // 获取UTC时间并应用偏移
  const utcTime = date.getTime() + date.getTimezoneOffset() * 60000;
  const targetDate = new Date(utcTime + offsetMs);
    
  // 格式化为yyyy-mm-dd hh:mm:ss
  const pad = (num: number) => num.toString().padStart(2, '0');
  return `${targetDate.getFullYear()}-${pad(targetDate.getMonth() + 1)}-${pad(targetDate.getDate())} ` +
         `${pad(targetDate.getHours())}:${pad(targetDate.getMinutes())}:${pad(targetDate.getSeconds())}`;
}

三、浏览器篇

1、获取 URL Query 参数

typescript 复制代码
/**
* @param {string} url URL
* @returns {Object} 参数数组
*/
export function getQueryParams(url: string) {
  // 返回当前 URL 的查询部分(问号 ? 之后的部分)。
  let urlParameters = window.location.search;

  if (url) {
    urlParameters = url.substring(url.indexOf('?'));
  }

  // 声明并初始化接收请求参数的对象
  const requestParameters: { [key: string]: string } = {};
  // 如果该参数中有请求的参数,则获取请求的参数,否则打印提示此请求没有请求的参数
  if (urlParameters.indexOf('?') !== -1) {
    // 获取请求参数的字符串
    const parameters = decodeURI(urlParameters.substr(1));
    // 将请求的参数以&分割中字符串数组
    const parameterArray = parameters.split('&');
    // 循环遍历,将请求的参数封装到请求参数的对象之中
    for (let i = 0; i < parameterArray.length; i++) {
      const [key, value] = parameterArray[i].split('=');
      requestParameters[key] = value;
    }
  }
  return requestParameters;
}

2、获取浏览器默认语言

typescript 复制代码
/**
 * @return string 语言
 */
export const getBrowserLang = () => {
  let browserLang = navigator.language ? navigator.language : navigator.browserLanguage;
  let defaultBrowserLang = "";
  if (browserLang.toLowerCase() === "cn" || browserLang.toLowerCase() === "zh" || browserLang.toLowerCase() === "zh-cn") {
	defaultBrowserLang = "zh";
  } else {
	defaultBrowserLang = "en";
  }
  return defaultBrowserLang;
};

三、颜色篇

1、hex 颜色转 rgb 颜色

typescript 复制代码
/**
* @param {String} str 颜色值字符串
* @returns {String} 返回处理后的颜色值
*/
export function hexToRgb(str: any) {
  let hexs: any = "";
  let reg = /^\#?[0-9A-Fa-f]{6}$/;
  if (!reg.test(str)) return ElMessage.warning("输入错误的hex");
  str = str.replace("#", "");
  hexs = str.match(/../g);
  for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16);
  return hexs;
}

2、rgb 颜色转 hex 颜色

typescript 复制代码
/**
* @param {*} r 代表红色
* @param {*} g 代表绿色
* @param {*} b 代表蓝色
* @returns {String} 返回处理后的颜色值
*/
export function rgbToHex(r: any, g: any, b: any) {
  let reg = /^\d{1,3}$/;
  if (!reg.test(r) || !reg.test(g) || !reg.test(b)) return ElMessage.warning("输入错误的rgb颜色值");
  let hexs = [r.toString(16), g.toString(16), b.toString(16)];
  for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`;
  return `#${hexs.join("")}`;
}

3、加深颜色值

typescript 复制代码
/**
* @param {String} color 颜色值字符串
* @param {Number} level 加深的程度,限0-1之间
* @returns {String} 返回处理后的颜色值
*/
export function getDarkColor(color: string, level: number) {
  let reg = /^\#?[0-9A-Fa-f]{6}$/;
  if (!reg.test(color)) return ElMessage.warning("输入错误的hex颜色值");
  let rgb = hexToRgb(color);
  for (let i = 0; i < 3; i++) rgb[i] = Math.round(20.5 * level + rgb[i] * (1 - level));
  return rgbToHex(rgb[0], rgb[1], rgb[2]);
}

4、变浅颜色值

typescript 复制代码
/**
* @param {String} color 颜色值字符串
* @param {Number} level 加深的程度,限0-1之间
* @returns {String} 返回处理后的颜色值
*/
export function getLightColor(color: string, level: number) {
  let reg = /^\#?[0-9A-Fa-f]{6}$/;
  if (!reg.test(color)) return ElMessage.warning("输入错误的hex颜色值");
  let rgb = hexToRgb(color);
  for (let i = 0; i < 3; i++) rgb[i] = Math.round(255 * level + rgb[i] * (1 - level));
  return rgbToHex(rgb[0], rgb[1], rgb[2]);
}
相关推荐
YL雷子24 分钟前
纯前端使用ExcelJS插件导出Excel
前端·vue·excel
什么什么什么?32 分钟前
el-table高度自适应vue页面指令
前端·javascript·elementui
码上暴富4 小时前
axios请求的取消
前端·javascript·vue.js
JefferyXZF4 小时前
Next.js 初识:从 React 到全栈开发的第一步(一)
前端·全栈·next.js
一只韩非子5 小时前
AI时代,程序员如何优雅地搞定页面设计?
前端·ai编程
新中地GIS开发老师5 小时前
2025Mapbox零基础入门教程(14)定位功能
前端·javascript·arcgis·gis·mapbox·gis开发·地理信息科学
tager5 小时前
Vue 3 组件开发中的"双脚本"困境
前端·vue.js·代码规范
烛阴6 小时前
Int / Floor
前端·webgl
excel6 小时前
使用 PWA 时,为什么你必须手动添加更新逻辑,否则会报错?
前端
Moment6 小时前
Node.js 这么多后端框架,我到底该用哪个?🫠🫠🫠
前端·后端·node.js