Vue3——使用Mock.js

Vue3使用Mock.js

1、Mock 介绍

Mock 英文解释:模拟的,也就是模拟的数据。

作为一名前端人员我们通常会遇到这 2 种情况:

  1. 工作中等着和后端人员调试接口,但是后端接口写的太 TMD 慢了,实在等不及了。
  2. 只会写前端,不会写后端。需要后端接口提供测试数据。

那有了 Mock 之后,前端人员就有了测试数据,然后就可以愉快地进行开发和测试了。所以,说白了 Mock 就是一个像后端一样可以提供模拟数据的工具。在没有 Mock 之前,大多数人一般都是这样获取模拟数据的:提供一个 json 文件,里面都是死数据

json 复制代码
[
    {"id": 1001, "name": "Tom", "age": 18},
    {"id": 1002, "name": "李白", "age": 21},
    {"id": 1003, "name": "杜甫", "age": 22}
]

然后请求本地 json 文件:

html 复制代码
<script setup>
import {ref, onMounted} from 'vue'
onMounted(() => {
  getUserList()
})
const userList = ref([])
const getUserList = async () => {
  //直接请求本地JSON文件
  const response = await fetch('/src/mock/json/user.json', {
    headers: {
      'Cache-Control': 'no-cache'
    }
  })
  userList.value = await response.json()
}
</script>

<template>
  <div class="main-container">
    <h1>用户列表</h1>
    <el-table border :data="userList" style="width: 400px">
      <el-table-column prop="id" label="id"/>
      <el-table-column prop="name" label="姓名"/>
      <el-table-column prop="age" label="年龄"/>
    </el-table>
  </div>
</template>

这种情况虽然也能模拟后端接口数据,但数据不是动态的。比如无法模拟分页数据等动态接口行为。

所以我们需要在项目中安装 Mock 工具,帮助我们模拟动态接口行为。

2、Vue 项目中使用 Mock

2.1、安装使用 Mock

安装依赖:

shell 复制代码
npm install mockjs --save-dev

在项目中新建 mock 文件夹,然后新建 /api/index.js 文件,创建 Mock 服务:

js 复制代码
import Mock from 'mockjs'
//模拟用户列表的接口
Mock.mock('/api/users', 'get', {
    'list|10': [
        {
            'id|+1': 1,
            'name': '@cname',
            'age|18-60': 1
        }
    ]
})

在 main.js 中导入 mock

js 复制代码
import './mock/api/index.js'

在组件中使用 Mock 数据:

html 复制代码
<script setup>
import {ref, onMounted} from 'vue'
import axios from 'axios'

onMounted(() => {
  getUserList()
})
const userList = ref([])
const getUserList = async () => {
  const res = await axios.get('/api/users')
  userList.value = res.data.list 
}
</script>

<template>
  <div class="main-container">
    <h1>用户列表</h1>
    <el-table border :data="userList" style="width: 400px">
      <el-table-column prop="id" label="id"/>
      <el-table-column prop="name" label="姓名"/>
      <el-table-column prop="age" label="年龄"/>
    </el-table>
  </div>
</template>

2.2、Mock基础用法

Mock.js 使用特定的语法规则来定义模拟数据的结构,语法格式为:

js 复制代码
'name|rule': value
  • name:属性名
  • rule:生成规则(可选)
  • value:属性值

1. 字符串

js 复制代码
// 生成 1-5 个随机中文字符
'name|1-5': '@cword'

// 生成 5 个随机英文字符
'code|5': '@word'

2. 数字

js 复制代码
// 生成 30-100 之间的整数
'age|30-100': 1

// 生成带小数的浮点数(整数部分30-100,小数部分1-2位)
'score|30-100.1-2': 1

// id 自增(每次+1)
'id|+1': 100

3. 布尔值

js 复制代码
// 50% 概率为 true
'isActive|1': true

// 1/3 概率为 true,2/3 概率为 false
'isAdmin|1-2': true

4. 对象

js 复制代码
// 从对象中随机选取 2 个属性
'info|2': {
  name: '@cname',
  age: '@integer(30,100)',
  gender: '@pick(["男","女"])'
}

// 从对象中随机选取 1-3 个属性
'contact|1-3': {
  email: '@email',
  phone: /1[3-9]\d{9}/,
  wechat: '@word(4,16)'
}

5. 数组

js 复制代码
// 从数组中随机选取 1 个元素
'fruit|1': ['🍎', '🍌', '🍇', '🍊']

// 重复数组元素 3-5 次生成新数组
'tags|3-5': ['前端', 'JavaScript', 'Vue', 'React']

// 生成包含 10 个对象的数组
'users|10': [
  {
    'id|+1': 100,
    'name': '@cname',
    'age': '@integer(18,60)'
  }
]

2.3、常用占位符

Mock.js 提供了丰富的占位符来生成特定格式的数据:

占位符 说明 示例
@boolean 随机布尔值 true/false
@integer(min, max) 随机整数 18, 42
@float(min, max, dmin, dmax) 随机浮点数 1998.12
@string(length) 随机字符串 "fgG"
@cword(length) 随机中文字符 "脚手架"
@ctitle(min, max) 随机中文标题 "React知否技术"
@cname 随机中文姓名 "知否君"
@email 随机邮箱 "zhifou@qq.com"
@region 随机地区 "西北"
@province 随机省份 "浙江省"
@city 随机城市 "杭州市"
@county 随机区县 "滨江区"
@url 随机URL "https://qq.com"
@date(format) 随机日期 "2025-06-24"
@time(format) 随机时间 "22:31:23"
@datetime 随机日期时间 "2025-06-24 22:31:23"
@image(size, bg, fg, text) 随机图片 URL"https://image.com/300x100"@color随机颜色"#ffffff"

3、Mock案例

3.1、用户登录

js 复制代码
//模拟登录接口
Mock.mock('/api/login', 'post', (options) => {
    const {username, password} = JSON.parse(options.body)
    if (username === 'root' && password === '123456') {
        return {
            status: 200,
            message: '登录成功',
            token: '@www.123'
        }
    } else {
        return  {
            status: 401,
            message: '用户名或者密码错误'
        }
    }
})
js 复制代码
//登录
const login = async ()=>{
  const res = await axios.post('/api/login', {
    username: 'root',
    password: '123456'
  })
  console.log(res.data)
}

3.2、新增用户

js 复制代码
// 拦截 POST 请求
Mock.mock('/api/user/create', 'post', (options) => {
  const body = JSON.parse(options.body)
  return {
    'code': 200,
    'message': 'success',
    'data': {
      'id': '@id',
      'name': body.name,
      'createTime': '@now'
    }
  }
})

3.3、分页数据

js 复制代码
Mock.mock('/api/items', 'get', (options)=> {
    const pageSize = Number(options.query.pageSize) || 10; // 每页大小,默认为10
    const page = Number(options.query.page) || 1; 
    return Mock.mock({
    'code': 200,
    'message': 'success',
    'data': {
      'total': 100,
      [`list|${pageSize}`]: [{
        'id|+1': (page - 1) * pageSize + 1,
        'name': '@cname',
        'age|18-60': 1,
        'gender|1': ['男', '女'],
        'email': '@email',
        'address': '@county(true)',
        'status|1': ['正常', '禁用'],
        'createTime': '@datetime'
      }]
    }
  })
});

4、注意事项

4.1、按功能模块维护 Mock 数据

为了方便管理和维护,我们可以将不同功能模块的 Mock 数据分别放在不同的文件中。

4.2、区分开发环境和生产环境

我们只在开发环境中使用 Mock 数据,所以可以通过环境变量来控制是否引入 Mock 文件。例如:

js 复制代码
if (process.env.NODE_ENV === 'development') {
    import('./mock');
}
相关推荐
时光足迹1 小时前
ThreeJS之GUI控制器
前端·javascript·three.js
时光足迹1 小时前
Tiptap编辑器
前端·javascript·react.js
im_AMBER1 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
时光足迹1 小时前
电子书阅读器之笔记高亮(跨段处理)
前端·javascript·react.js
Hello-Mr.Wang2 小时前
【保姆级教程】MasterGo MCP + Cursor 一键实现 UI 设计稿还原
前端·javascript·vue.js·ai编程
宁雨桥2 小时前
前端修行日记之JS 原型与 AI基础常识
前端·javascript·原型模式
水云桐程序员2 小时前
前端教程官方文档|HTML、CSS、JavaScript教程官方文档
前端·javascript·css·html·学习方法
本末倒置1833 小时前
Vue 3 开发者转型 React 指南:保姆级教程
前端·javascript·vue.js
空中海4 小时前
03 渲染机制、性能优化与现代 React
javascript·react.js·性能优化