Skip to content

Mock 数据

了解如何使用 Mock 数据进行开发和调试。

什么是 Mock?

Mock 是一种在前端开发中模拟后端接口返回数据的技术,可以在后端接口未完成时进行前端开发。

开启 Mock

.env.development 文件中配置:

bash
# 开启 Mock 服务
VITE_MOCK_DEV_SERVER = true

Mock 配置

Mock 文件存放在 mock 目录下:

mock/
├── user.mock.ts        # 用户相关 Mock
├── role.mock.ts        # 角色相关 Mock
├── menu.mock.ts        # 菜单相关 Mock
└── ...

创建 Mock

基础示例

typescript
// mock/user.mock.ts
import { defineMock } from 'vite-plugin-mock-dev-server'

export default defineMock([
  {
    url: '/api/v1/users',
    method: 'GET',
    response: () => {
      return {
        code: '00000',
        data: {
          list: [
            {
              id: 1,
              username: 'admin',
              nickname: '管理员',
              status: 1
            }
          ],
          total: 1
        },
        msg: '成功'
      }
    }
  }
])

带参数的 Mock

typescript
export default defineMock([
  {
    url: '/api/v1/users/:id',
    method: 'GET',
    response: (req) => {
      const { id } = req.params
      return {
        code: '00000',
        data: {
          id: Number(id),
          username: 'admin',
          nickname: '管理员'
        },
        msg: '成功'
      }
    }
  }
])

Query 参数

typescript
export default defineMock([
  {
    url: '/api/v1/users',
    method: 'GET',
    response: (req) => {
      const { pageNum = 1, pageSize = 10, username } = req.query

      let list = mockData.filter(item => {
        if (username && !item.username.includes(username)) {
          return false
        }
        return true
      })

      const start = (pageNum - 1) * pageSize
      const end = start + pageSize

      return {
        code: '00000',
        data: {
          list: list.slice(start, end),
          total: list.length
        },
        msg: '成功'
      }
    }
  }
])

POST 请求

typescript
export default defineMock([
  {
    url: '/api/v1/users',
    method: 'POST',
    response: (req) => {
      const { body } = req
      return {
        code: '00000',
        data: {
          id: Date.now(),
          ...body
        },
        msg: '添加成功'
      }
    }
  }
])

PUT 请求

typescript
export default defineMock([
  {
    url: '/api/v1/users/:id',
    method: 'PUT',
    response: (req) => {
      const { id } = req.params
      const { body } = req
      return {
        code: '00000',
        data: {
          id: Number(id),
          ...body
        },
        msg: '更新成功'
      }
    }
  }
])

DELETE 请求

typescript
export default defineMock([
  {
    url: '/api/v1/users/:id',
    method: 'DELETE',
    response: () => {
      return {
        code: '00000',
        data: null,
        msg: '删除成功'
      }
    }
  }
])

响应延迟

模拟网络延迟:

typescript
export default defineMock([
  {
    url: '/api/v1/users',
    method: 'GET',
    delay: 1000, // 延迟 1 秒
    response: () => {
      return {
        code: '00000',
        data: [],
        msg: '成功'
      }
    }
  }
])

动态数据

使用 Mock.js 生成随机数据:

typescript
import { Random } from 'mockjs'

export default defineMock([
  {
    url: '/api/v1/users',
    method: 'GET',
    response: () => {
      const list = []
      for (let i = 0; i < 10; i++) {
        list.push({
          id: Random.id(),
          username: Random.word(),
          nickname: Random.cname(),
          email: Random.email(),
          phone: /^1[3-9]\d{9}$/,
          createTime: Random.datetime()
        })
      }
      return {
        code: '00000',
        data: { list, total: 100 },
        msg: '成功'
      }
    }
  }
])

Mock 数据持久化

使用 localStorage 持久化数据:

typescript
const STORAGE_KEY = 'mock_users'

// 获取数据
function getData() {
  const data = localStorage.getItem(STORAGE_KEY)
  return data ? JSON.parse(data) : []
}

// 保存数据
function setData(data: any[]) {
  localStorage.setItem(STORAGE_KEY, JSON.stringify(data))
}

export default defineMock([
  {
    url: '/api/v1/users',
    method: 'GET',
    response: () => {
      return {
        code: '00000',
        data: { list: getData(), total: getData().length },
        msg: '成功'
      }
    }
  },
  {
    url: '/api/v1/users',
    method: 'POST',
    response: (req) => {
      const list = getData()
      const newUser = { id: Date.now(), ...req.body }
      list.push(newUser)
      setData(list)
      return {
        code: '00000',
        data: newUser,
        msg: '添加成功'
      }
    }
  }
])

切换 Mock 和真实接口

全局切换

.env.development 中配置:

bash
# 开启 Mock
VITE_MOCK_DEV_SERVER = true

# 关闭 Mock,使用真实接口
VITE_MOCK_DEV_SERVER = false

部分接口使用 Mock

typescript
// utils/request.ts
import { isMockEnabled } from './env'

const request = axios.create({
  baseURL: isMockEnabled ? '/mock' : import.meta.env.VITE_APP_API_URL
})

最佳实践

1. 规范响应格式

保持 Mock 数据的响应格式与真实接口一致:

typescript
{
  code: '00000',  // 状态码
  data: {},       // 响应数据
  msg: '成功'     // 提示信息
}

2. 模拟真实场景

  • 模拟分页
  • 模拟搜索过滤
  • 模拟错误情况
  • 模拟网络延迟

3. 数据真实性

使用 Mock.js 生成接近真实的数据。

4. 注释说明

为 Mock 接口添加注释说明:

typescript
export default defineMock([
  {
    // 获取用户列表
    // 支持分页、搜索过滤
    url: '/api/v1/users',
    method: 'GET',
    response: () => {
      // ...
    }
  }
])

常见问题

1. Mock 不生效

解决方案

  • 检查 .env.developmentVITE_MOCK_DEV_SERVER 是否为 true
  • 重启开发服务器
  • 检查 Mock 文件路径和格式

2. Mock 数据无法持久化

解决方案:使用 localStorage 或 sessionStorage 存储数据

3. Mock 延迟太长

解决方案:调整 delay 参数或删除该配置

相关链接

基于 MIT 许可发布