Vite项目实践总结(五):工具函数

141 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

通过前面的依赖安装、代码规范的配置以及打包配置,项目的搭建工作基本上已经完成了,现在需要做的就是封装我们平时用的比较频繁的工具函数。

先安装Axios

yarn add axios

request.ts - 请求函数

在src下的utils文件夹中新建request.ts文件

import axios, { AxiosRequestConfig, AxiosInstance } from 'axios';

//创建请求实例的函数
const createAxiosInstance = () => {
  //1、首先我们需要定义一些比较常用的配置
  // axios.create()会创建一个实例
  const instance: AxiosInstance = axios.create({
    timeout: 15000, //超时时间
    headers: {
      'Content-Type': 'application/json',
    }
  });

  //2、请求之前添加一些我们需要的操作,拦截器
  //比如添加token,请求参数判空等
  instance.interceptors.request.use(
    config => {
      //...
      return config;
    },
    error => {
      throw new Error(error);
    }
  );

  //3、请求成功返回的数据,使用拦截器拦截器请求成功的数据
  //比如处理成功返回的数据(后端返回的data数据可能嵌套了很多层,我们可以在请求成功后直接将数据解构并返回出去)
  instance.interceptors.response.use(
    response => {
      let res = response.data;
      if (!(res instanceof Object)) {
        res = {
          code: '200',
          msg: '成功',
          data: res
        }
      }
      const validateStatus = /^(2|3)\d{2}$/;//code以2或3开头的视为请求成功,具体看前后端之间定义的规范
      if (res.code && validateStatus.test(res.code) && res.data) {
        return res.data; //直接return我们需要的data
      }
      //判断失败的code码并做出提示操作
      if (res.code === '401') {
        //提示错误,$nofity是一个全局的方法,封装了element-plus的ElNotification方法
        window.$notify('请求错误', res?.msg || '接口请求报错', 'error');
      } else {
        window.$notify('警告', res?.msg || '接口请求出现错误', 'warning');
      }
      return Promise.reject(res);
    },
    error => {
      //判断是否网络问题
      if (!window.navigator.onLine) {
        window.$notify(
          '网络异常',
          '请检查网络是否正常连接',
          'error'
        );
      } else {
        window.$notify(
          '服务器异常',
          '请稍后再试',
          'error'
        );
      }
      return Promise.reject(error);
    }
  );
  //将我们的实例返回出去
  return instance;
}

export const request = createAxiosInstance();

其他的工具函数

延时函数

有时我们需要将某个动画或过渡进行延时展示,或者测试时需要验证loading效果等,这时延时函数就派上用场了

//延时函数
const wait = (time: number) => {
    return new Promise<void>(resolve => setTimeout(() => resolve(), time));
}

//使用
wait(1000).then(() => {
  dom.style.transition = 'all 800ms'; //延时过渡
  //...
});

全局唯一值-uuid

全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。

MDN - performance.now()

function uuid(): string {
    let d = new Date().getTime();
    window.performance && (d += performance.now());
    const uuid = 'xxxyyxxx-xxxx-6xxx-yxxx-xxxxxyyyxxxx'.replace(/[xy]/g, function (c) {
      const r = (d + Math.random() * 16) % 16 | 0;
      return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
    })
    return uuid.replace(/-/g, '');
}