实用utils

一、json转字符串

/**
 * JSON 转 url params
 *
 * @param {object} params 参数
 * @returns {string} 返回转换后的 query 字符串
 */
export const jsonToUrlParams = (params) => {
  const query = [];
  Object.keys(params)
    .forEach((key) => {
      if (params[`${key}`]) {
        query.push(`${key}=${params[`${key}`]}`);
      }
    });
  if (query.length) return `?${query.join('&')}`;
  return '';
};

二、用a标签打开新页面

/**
 * 用 a 标签打开新页面
 *
 * @param {object} obj 参数
 * @param {string} obj.url 下载地址
 * @param {object} obj.params 请求参数
 */
export const open = ({ url, params = {} }) => {
  const a = document.createElement('a');
  a.target = '_blank';
  a.href = `${url}${jsonToUrlParams(params)}`;
  a.style.display = 'none';
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
};

三、用a标签下载文件

/**
 * 用 a 标签下载文件
 *
 * @param {object} obj 参数
 * @param {string} obj.url 下载地址
 * @param {object} obj.params 请求参数
 * @param {string} obj.fileName 文件名
 * @param {string} obj.target 弹窗方式
 */
export const syncExportFile = ({
  url, params = {}, fileName = '', target = '_blank',
}) => {
  const a = document.createElement('a');
  if ('download' in a) {
    if (fileName) a.download = decodeURIComponent(fileName);
  }
  a.target = target;
  a.href = typeof url === 'string' ? `${url}${jsonToUrlParams(params)}` : url;
  a.style.display = 'none';
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
};

四、文件链接转文件流下载

/**
 * 文件链接转文件流下载
 *
 * @param {object} obj 参数
 * @param {string} obj.method 请求方式
 * @param {string} obj.url 文件链接
 * @param {object} obj.params 请求参数
 * @param {object} obj.options axios extend options 扩展参数
 * @returns {Promise} axios
 */
export const asyncExportFile = (
  {
    method = 'GET',
    url,
    params = {},
    options = {},
  },
) => axios({
  method,
  url,
  [method === 'GET' ? 'params' : 'data']: {
    ...params,
  },
  responseType: 'blob',
  ...options,
})
  // eslint-disable-next-line max-statements
  .then((res) => {
    if (res) {
      const { data, headers } = res;
      const blob = new Blob([data], { type: 'application/octet-stream' });
      const fileName = headers['content-disposition'].replace(/\w+;[\s]?filename=(.*)/, '$1');
      if (typeof window.navigator.msSaveBlob === 'undefined') {
        const URL = window.URL.createObjectURL(blob);
        syncExportFile({
          url: URL,
          fileName,
        });
        window.URL.revokeObjectURL(url);
      } else {
        window.navigator.msSaveBlob(blob, fileName);
      }
    }
    return res;
  });

五、数据扁平化

// 数组扁平化
export const flatten = (arr) => arr.reduce((prev, next) => prev.concat(Array.isArray(next)
  ? flatten(next)
  : next), []);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值