# 工具库

前言

补充一些官方文档中没有的,但是实际开发中最好需要了解的内容

# 1.axios

# 1.1 封装

import axios from "axios";
import { Message, MessageBox } from "element-ui";
import { getToken } from "@/util/auth";

// 创建axios实例
let baseURL = "/web-vue2x/";
try {
  baseURL = process ? process.env?.BASE_API : "/web-vue2x/";
} catch (e) {}
const service = axios.create({
  baseURL,
  timeout: 5000, // 请求超时时间
});

// request拦截器
service.interceptors.request.use(
  (config) => {
    const token = getToken();
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
      // config.headers['token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    return config;
  },
  (error) => {
    // Do something with request error
    console.log(error); // for debug
    Promise.reject(error);
  }
);

// response 拦截器
service.interceptors.response.use(
  (response) => {
    /**
     * code为非20000是抛错 可结合自己业务进行修改
     */
    const res = response;
    if (res.status !== 200) {
      Message({
        message: res.data.message,
        type: "error",
        duration: 5 * 1000,
      });
      // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
      if (
        res.status === 50008 ||
        res.status === 50012 ||
        res.status === 50014
      ) {
        MessageBox.confirm(
          "你已被登出,可以取消继续留在该页面,或者重新登录",
          "确定登出",
          {
            confirmButtonText: "重新登录",
            cancelButtonText: "取消",
            type: "warning",
          }
        ).then(() => {
          location.reload(); // 为了重新实例化vue-router对象 避免bug
        });
      }
    } else {
      return Promise.resolve(res.data.result);
    }
  },
  (error) => {
    console.log("err" + error); // for debug
    Message({
      message: error.message,
      type: "error",
      duration: 5 * 1000,
    });
    return Promise.reject(error);
  }
);

export default service;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

# 1.2 配置

import axios from "axios"

export default {
  install(Vue) {
    Vue.prototype.$axios = axios
  },
}
1
2
3
4
5
6
7

# 1.3 get 请求

刷新
全屏/自适应

# 1.4 post 请求

后端拿不到数据

axios?.post(url, { id: 1 }) //后台控制器接收到的 id 为 null
1

原因是:axios 使用 post 携带参数请求默认使用 application/json

  • 改进 1:使用 qs

    刷新
    全屏/自适应

    后台接收参数用 req.body

  • 改进 2:使用 URLSearchParams

    刷新
    全屏/自适应

    后台接收参数用 req.body(服务器段给接收到的参数加上@requestBody)

  • 改进 3:使用请求地址中的参数"id=1&name=2"

    刷新
    全屏/自适应

    后台接收参数用 chunk

# 1.5 delete 请求

有问题后端拿不到数据

let params = { id: 1 }
axios?.delete(url, params)
1
2
  • 改进 1:使用 qs
const qs = require("qs")
axios?.delete(url, qs.stringify(params)).then()
1
2
axios({
  method: "delete",
  url,
  data: qs.stringify(params),
}).then()
1
2
3
4
5

后台接收参数用 req.body

  • 改进 2:使用 URLSearchParams
const param = new URLSearchParams()
param.append("id", 1)
axios?.delete(url, param).then()
1
2
3
axios({
  method: "delete",
  url,
  data: param,
}).then()
1
2
3
4
5

后台接收参数用 req.body

  • 改进 3:使用请求地址中的参数"id=1&name=2"
axios?.delete(url, "id=1")
1
axios({
    method:"delete",
    url,
    "id=1"
})
1
2
3
4
5

后台接收参数用 chunk

# 1.6 put 请求

有问题后端拿不到数据

let params = { id: 1 }
axios?.put(url, params)
1
2
  • 改进 1:使用 qs
const qs = require("qs")
axios?.put(url, qs.stringify(params)).then()
1
2
axios({
  method: "put",
  url,
  data: qs.stringify(params),
}).then()
1
2
3
4
5

后台接收参数用 req.body

  • 改进 2:使用 URLSearchParams
const param = new URLSearchParams()
param.append("id", 1)
axios?.put(url, param).then()
1
2
3
axios({
  method: "put",
  url,
  data: param,
}).then()
1
2
3
4
5

后台接收参数用 req.body

  • 改进 3:使用请求地址中的参数"id=1&name=2"
axios?.put(url, "id=1")
1
axios({
    method:"put",
    url,
    "id=1"
})
1
2
3
4
5

后台接收参数用 chunk

# 1.7 学生管理系统

刷新
全屏/自适应

# 2.Moment

刷新
全屏/自适应

格式化参考表格

格式代码 说明 返回值例子
M 数字表示的月份,没有前导零 1 到 12
MM 数字表示的月份,有前导零 01 到 12
MMM 三个字母缩写表示的月份 Jan 到 Dec
MMMM 月份,完整的文本格式 January 到 December
Q 季度 1 到 4
D 月份中的第几天,没有前导零 1 到 31
DD 月份中的第几天,有前导零 01 到 31
d 星期中的第几天,数字表示 0 到 6, 0 表示周日,6 表示周六
ddd 三个字母表示星期中的第几天 Sun 到 Sat
dddd 星期几,完整的星期文本 从 Sunday 到 Saturday
w 年份中的第几周 如 42:表示第 42 周
YYYY 四位数字完整表示的年份 如:2014 或 2000
YY 两位数字表示的年份 如:14 或 98
A 大写的 AM PM AM PM
a 小写的 am pm am pm
HH 小时,24 小时制,有前导零 00 到 23
H 小时,24 小时制,无前导零 0 到 23
hh 小时,12 小时制,有前导零 00 到 12
h 小时,12 小时制,无前导零 0 到 12
m 没有前导零的分钟数 0 到 59
mm 有前导零的分钟数 00 到 59
s 没有前导零的秒数 1 到 59
ss 有前导零的描述 01 到 59
X Unix 时间戳 1411572969

# 2.DevTools

# 3.lodash

  • isEqual:对象比较
isEqual(newVal,oldVal)
1
  • cloneDeep:深克隆
cloneDeep(obj)
1
  • debounce:防抖
debounce(fn,time)
1
  • throttle:节流
throttle(fn,time)
1

# 4.performance

performance API是 Vue 全局配置 API 中的一个,我们可以使用它来进行网页性能的追踪,我们可以在入口文件中添加:

if (process.env.NODE_ENV !== "production") {
  Vue.config.performance = true
}
1
2
3

来开启这一功能,该 API 功能只适用于开发模式和支持performance.mark API 的浏览器上,开启后我们可以下载Vue Performance Devtool这一 chrome 插件来查看各个组件的加载情况

从中我们可以清晰的看到页面组件在每个阶段的耗时情况,而针对耗时比较久的组件,我们便可以对其进行相应优化。

而其在 Vue 源码中主要适用了 window.performance 来获取网页性能数据,其中包含了performace.markperformance.measure

  • performance.mark 主要用于创建标记
  • performance.measuer 主要用于记录两个标记的时间间隔

例如:

performance.mark("start") //创建start标记
performance.mark("end") //创建end标记
performance.measuer("output", "start", "ent") //计算两者时间间隔
performace.getEntriesByName("output") //获取标记,返回值是一个数组,包含了间隔时间数据
1
2
3
4

熟练使用 performance 我们可以查看并分析网页的很多数据,为我们项目优化提供保障。除了上述介绍的两个方法,我们还可以使用performance.timing来计算页面各个阶段的加载情况。

# 5.粘贴

new clipboard(".element", { text: text })
1