常用前端方法总结

目的:记录一下 我用到的常用的 方法

// 随机生成id
export const uuid = () => Math.random().toString(24).substring(2, 12);
// 1. 判断对象是否为数组 Array.isArray(obj)

// 2. 数组内是否用重复数据
const isOk = array.some((i, index, arr) => {
          return index !== arr.findIndex((k) => k.id=== i.id);
       });
// 3. 过滤掉数组内某一条数据 可以用 filter 或者 我喜欢用 splice 等等
     array.splice(index, 1); // splice(索引,删除个数,追加的数据...) 注意:二维数组循环会出问题
// 4. 平铺的数组 转为树形数据
/**
 * 数组 转为树形数据
 * @param list 数组
 * @param rootValue 初始父节点值
 * @param id 当前id的字段名
 * @param parentId 父级id的字段名
 * @returns
 */
export const arrTransformTreeData = (list,rootValue,id= 'menuId',parentId = 'parentId') => {
  let array = []
  list.forEach((i) => {
    if (i[parentId] === rootValue) {
      const children = arrTransformTreeData(list, i[id])
      if (children.length) {
        i.children = children
      }
      array.push(i)
    }
  })
  return array
}
// 5. 根据id 查找对应的树形数据 这好像是之前百度的方法 
export const findTreeData = (list, searchId = 'id') => {
  for (let _i = 0; _i < list.length; _i++) {
    if (list[_i].id === searchId) {
      return list[_i];
    } else {
      if (list[_i].children && list[_i].children.length > 0) {
        let res = findTreeData(list[_i].children, searchId);
        if (res) {
          return res;
        }
      }
    }
  }
  return null;
};
/** 5.
 * 一维数组 转为指定 数组元素个数的 二维数组
 * @param arr 
 * @param num 二维数组内 一维数组内元素个数
 * @param eleNum 数组元素的个数 划分数
 * @returns 
 */
export const convertTwoDimensionalArr = (arr: [], num: number = 2, eleNum: number = 2) => {
  const len = arr.length
  const arrNum = len % eleNum === 0 ? len / eleNum : Math.floor((len / eleNum) + 1)  //得出多少份
  const res: any = [] //定义数组接受最终的数据
  for (let i = 0; i < arrNum; i++) {
    const newArr: any = arr.slice(i * num, i * num + num) //得到每份的数据
    res.push(newArr) //往res数组里加数据
  }
  return res
}
// 6. 截取字符串 符号对应的后面字符
export const subLastOfStr = (str: string, key='$') => {
  return str.slice(str.lastIndexOf(`${key}`) + 1);
};
/**
 * 7. 根据地址打开新窗口 可以修改窗口名称
 * @param url 地址
 * @param title 窗口名称
 */
function openWindow(url: string, title: string = '窗口名称') {
  const newWindow: any = window.open('about:blank', title);
  newWindow.document.title = title;
  let iframe = document.createElement('iframe');
  iframe.src = url;
  iframe.style.width = '100%';
  iframe.style.height = '100vh';
  iframe.style.margin = '0';
  iframe.style.padding = '0';
  iframe.style.overflow = 'hidden';
  iframe.style.border = 'none';
  newWindow.document.body.style.margin = '0';
  newWindow.document.body.appendChild(iframe);
}
// 8. 表单只能输入1-100数字
  <el-input
              type="number"
              :min="0"
              placeholder="再次确认比例"
              v-model="spotForm.repeatSpot"
              oninput="value=value.replace(/^0|[^0-9]/g,'');if(value>100)value=100;"
            >
// 9. 根据url地址 下载文件 并且修改文件名 (一定要注意文件名的后缀名 .xlsx或者别的格式之类的)
//传入url路径以及文件名即可
export function handleFileDown(url, fileName = "") {
  getBlob(url).then(blob => {
    console.log(blob, 'blob');
    downBlobFile(blob, fileName);
  });
}
// 获取blob格式数据
function getBlob(url) {
  return new Promise(resolve => {
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.responseType = "blob";
    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(xhr.response);
      }
    };
    xhr.send();
  });
}
// 对blob格式文件 进行下载并改名
function downBlobFile(blob, filename, fileSuffixName) {
  if (window.navigator.msSaveOrOpenBlob) {
    navigator.msSaveBlob(blob, filename);
  } else {
    const link = document.createElement("a");
    const body = document.querySelector("body");
    const url = window.URL.createObjectURL(blob);
    console.log(url, 'url');
    link.href = url;
    link.download = filename;
    // fix Firefox
    link.style.display = "none";
    body.appendChild(link);
    link.click();
    body.removeChild(link);
    window.URL.revokeObjectURL(link.href);
  }
}
// 10. 对文本进行省略号处理 可以js(截取+拼接...就行) 也可以css 我这里写css处理的
// 这是可以控制文本几行显示省略号的
.text_exceed_4row_ellipsis {
  //white-space 指定元素内的空白怎样处理,属性值pre-wrap指保留空白符序列,但是正常地进行换行。
  white-space: pre-wrap;
  //overflow属性指定如果内容溢出一个元素的框,会发生什么;属性值hidden:内容会被修剪,并且其余内容是不可见的。
  overflow: hidden;
  //text-overflow 属性指定当文本溢出包含它的元素时,应该如何显示;属性值ellipsis:显示省略符号 ... 来代表被修剪的文本。
  text-overflow: ellipsis;
  //下面这些组合完成实现多行文本溢出显示...效果
  // display: -webkit-box; 必须结合的属性,将对象作为弹性伸缩盒子模型显示 。
  // -webkit-line-clamp 用来限制在一个块元素显示的文本的行数。 为了实现该效果,它需要组合其他的WebKit属性。常见结合属性:
  // -webkit-box-orient 必须结合的属性,设置或检索伸缩盒对象的子元素的排列方式 。
  display: -webkit-box;
  word-break: break-all; // 5.字面意思:单词破坏:破坏英文单词的整体性,在英文单词还没有在一行完全展示时就换行  即一个单词可能会被分成两行展示
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 4;
}
// 这是单行显示省略号的
.text_exceed_1row_ellipsis{
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
// 11. 后端返回的文件流 进行下载
export const fileStreamDownload = res => {
  const fileName = getSessionStorage(fileNameKey, true) ?? ['文件名','.xlsx'];
  let blob = new Blob([res]);
  let a = document.createElement("a");
  const objectURL = window.URL.createObjectURL(blob);
  a.download = fileName[0] + "." + fileName[1];
  a.href = objectURL;
  a.click();
  URL.revokeObjectURL(objectURL);
  a = null;
};
// 如果下载的文件破损 注意 不是方法的问题 接口要加 responseType: 'blob'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值