vue3 Mock笔记

211 阅读4分钟

在前后端对接中,有时后端的接口数据没有 那么快能给出,因此我们可以通过mock模拟自己的请求数据,在后端接口没有给出的同时,先使用mock请求的数据完成前端相关的逻辑。

参考:github.com/vbenjs/vite…

安装依赖

通过命令行 npm install -D vite-plugin-mock mockjs 安装得vite-plugin-mock 之后发现再vite.config.ts里边报错viteMockServe({ localEnabled: command === 'serve', }) 类型“{ localEnabled: boolean; }”的参数不能赋给类型“ViteMockOptions”的参数。

npm install vite-plugin-mock mockjs -D

## npm uninstall vite-plugin-mock
## npm install mockjs vite-plugin-mock@2.9.6 -D

配置

mock数据十分简单的,无非就是提供数据的函数 + 对外暴露一个数组,数组中包含的对象便是接口。url是接口地址,method是请求方式,response是返回的数据。

// 新建mock测试文件 mock/example.ts
export default [
  {
    url: '/mock/getMapInfo',
    method: 'get',
    response: () => {
      return {
        code: 200,
        title: 'mock请求测试'
      }
    }
  }
]

// vue3 vite.config.js
import { UserConfigExport, ConfigEnv } from 'vite'
import { viteMockServe } from 'vite-plugin-mock'
import vue from '@vitejs/plugin-vue'
export default ({ command }: ConfigEnv): UserConfigExport => {
  return {
    plugins: [
      vue(),
      viteMockServe({
        mockPath: 'mock', //设置mockPath为根目录下的mock目录,为根目录
        localEnabled: command === 'serve', //设置是否监视mockPath对应的文件夹内文件中的更改
        prodEnabled: true, //prod环境下是否可以使用mock
        logger: true //是否在控制台显示请求日志
      }),
    ],
  }
}


使用axios获取本地mock数据

先下载axios依赖

npm install axios

axios测试

<template>
  <button @click="listReq">listReq</button>
</template>
<script setup>
  import axios from 'axios'
  const listReq = () => {
    axios.get('/mock/getMapInfo').then((res) => {
      if (res.data) {
        console.log(res.data)
        alert(res.data.title)
      }
    })
  }
</script>

用户登录->获取用户信息demo

<script setup lang="ts">
import axios from 'axios'
  const userLogin = () => {
    axios.post('/api/user/login',{
        username: 'admin',
        password: '111111'
      }
    ).then((res) => {
      if (res.data) {
        alert(res.data.data.token)
      }
    })
  }
  const userInfo = () => {
    axios.get('/api/user/info',{
      params: {
        userName: 'leo'
      },
      headers: {
        'Content-Type': 'application/json',
        'token': 'System Token'
      }
    }).then((res) => {
      if (res.data) {
        alert(res.data.data.checkUser.desc)
      }
    })
  }
</script>
<template>
  <button @click="userLogin">userLogin</button>
  <button @click="userInfo">userInfo</button>
</template>
// user.ts
//用户信息数据
function createUserList() {
  return [{
    userId: 1,
    avatar:
    'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
    username: 'admin',
    password: '111111',
    desc: '平台管理员',
    roles: ['平台管理员'],
    buttons: ['cuser.detail'],
    routes: ['home'],
    token: 'Admin Token',
  },{
    userId: 2,
    avatar:
    'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
    username: 'system',
    password: '111111',
    desc: '系统管理员',
    roles: ['系统管理员'],
    buttons: ['cuser.detail', 'cuser.user'],
    routes: ['home'],
    token: 'System Token',
  },]
}


export default [
  // 用户登录接口
  {
    url: '/api/user/login',//请求地址
    method: 'post',//请求方式
    response: ({ body }) => {
      //获取请求体携带过来的用户名与密码
      const { username, password } = body;
      //调用获取用户信息函数,用于判断是否有此用户
      const checkUser = createUserList().find((item) => item.username === username && item.password === password,)
      //没有用户返回失败信息
      if (!checkUser) {
        return { code: 201, data: { message: '账号或者密码不正确' } }
      }
      //如果有返回成功信息
      const { token } = checkUser
      return { code: 200, data: { token } }
    },
  },
  // 获取用户信息
  {
    url: '/api/user/info',
    method: 'get',
    response: (request) => {
      //获取请求头携带token
      const token = request.headers.token;
      //查看用户信息是否包含有次token用户
      const checkUser = createUserList().find((item) => item.token === token)
      //没有返回失败的信息
      if (!checkUser) {
        return { code: 201, data: { message: '获取用户信息失败' } }
      }
      //如果有返回成功信息
      return { code: 200, data: {checkUser} }
    },
  },
]

封装axios

utils/http.ts

import axios from 'axios'
const service = axios.create({
  baseURL: '/',
  timeout: 100000
})
export default service

http.ts mock数据使用

  import http from './utils/http'
  const userLogin = () => {
    http({ url: '/api/user/login', method: 'post',data:{
        username: 'admin',
        password: '111111'
    } }).then((res) => {
      if (res.data) {
        console.log(res.data)
        alert(res.data.data.token)
      }
    })
  }
  const userInfo = () => {
    http({ url: '/api/user/info', method: 'get',
      params: {
        userName: 'leo'
      },
      headers: {
        'Content-Type': 'application/json',
        'token': 'System Token'
      }
     }).then((res) => {
      if (res.data) {
        console.log(res.data)
        alert(res.data.data.checkUser.desc)
      }
    })
  }

Mock的用法规则

import Mock from 'mockjs'
  1. 属性值是字符串 String
// (1)'name|min-max': string  
// 随机生成1-10个a
// obj = { string:'aaa' }
let obj = Mock.mock({
      'string|1-10': 'a'
    })

// (2)'name|count': string  
// 指定生成个a
// obj = { string:'aaaaa' }
let obj = Mock.mock({
      'string|5': 'a'
    })
  1. 属性值是数字 Number
// (1)'name|+1': number  
// 属性自动加1,初始值为number
// (2)'name|min-max': number  
// 随机生成大于1,小于10的整数,number仅用于确认类型
// obj = { id:8 }
let obj = Mock.mock({
      'id|1-10': 1
    })

// (3)'name|min-max.dmin-dmax': number 
// 生成一个浮点数,整数部分大于等于1,小于等于100,小数部分保留1-8位,number仅用于确认类型
// obj = { num:44.555 }
let obj = Mock.mock({
      'num|1-100.1-8': 1
    })

  1. 属性值是布尔值 Boolean
// (1)'name|1': boolaen  
// 随机生成布尔值,true/false,概率各占一半
// obj = { flag:true }
let obj = Mock.mock({
      'flag|1': true
    })

// (2)'name|min-max': boolaen 
// 随机生成布尔值,值为为boolaen 的概率是min/(min+max),当前true的概率为1/3
// obj = { flag:true }
let obj = Mock.mock({
      'flag|1-2': true
    })

  1. 属性值是对象 Object
// (1)'name|min-max': object  
// 从属性object 中随机选取1-3个属性
// obj = { curObj:{ a:1,b:2 } }
let obj = Mock.mock({
      'curObj|1-3': {
        a: 1,
        b: 2,
        c: 3
      }
    })

// (2)'name|count': object  
// 从属性object 中随机选取3个属性
// obj = { curObj:{ a:1,b:2,c:3 } }
let obj = Mock.mock({
      'curObj|3': {
        a: 1,
        b: 2,
        c: 3
      }
    })

  1. 属性值是对象 Array
// (1)'name|min-max': array  
// 随机生成属性值为array,长度1-3的数组
// obj = { arr:[{ id:1 }, { id:2 }}
let obj = Mock.mock({
      'arr|1-3': [{
        'id|+1': 1
      }]
    })

// (2)'name|count': array  
// 生成属性值为array,长度3的数组
// obj = { arr:[{ id:1 }, { id:2 }, { id:3 }}
let obj = Mock.mock({
      'arr|3': {
        'id|+1': 1
      }
    })

  1. 属性值是正则表达式 RegExp
// (1)'name': regexp 
// obj={regexp:1234567}
let obj = Mock.mock({
      'regexp':/\d{5,10}/
    })

  1. Mock.Random
let Random = Mock.Random
Random.email()

  1. 实例
let obj = Mock.mock({
  'arr|1-20': [
    {
      'index|+1': 1,
      'num|1-100.1-2': 1,
      'status|1': ['进行中', '暂停中', '已完成'],
      'string|1': 'ABCD' + Mock.Random.integer(0, 99),
    }
  ]
})