🌟 Mock.js核心价值
Mock.js 是一个强大的前端模拟数据生成器,它的核心优势在于:
- 🎲 丰富的随机数据生成:支持生成各种类型的随机数据
- ⚡ 拦截Ajax请求:无需修改业务代码即可模拟API请求
- 🖥️ 跨环境支持:同时支持浏览器和Node.js环境
- ✨ 简单语法:通过直观的模板语法定义数据结构
📦 安装与基础配置
1. 多环境安装方式
浏览器环境直接引入:
<!-- 通过CDN引入 -->
<script src="https://cdn.bootcdn.net/ajax/libs/Mock.js/1.0.0/mock-min.js"></script>
Node.js/React项目安装:
npm install mockjs --save-dev
# 或
yarn add mockjs -D
2. 基础配置示例(带详细注释)
// src/mock/index.js
import Mock from 'mockjs'
// 配置全局设置
Mock.setup({
timeout: '200-600' // 随机延迟200-600ms,模拟真实网络请求
})
// 模拟用户数据接口
Mock.mock('/api/users', 'get', {
'list|5-10': [{ // 随机生成5-10条用户数据
'id|+1': 1, // 自增ID,每次+1
'name': '@cname', // 随机中文名
'age|18-60': 1, // 18-60之间的随机年龄
'gender|1': ['男', '女'], // 随机选择性别
'email': '@email', // 随机邮箱
'avatar': '@image("100x100")', // 100x100随机图片
'address': '@county(true)', // 随机详细地址
'regDate': '@date("yyyy-MM-dd")' // 随机注册日期
}]
})
// 模拟登录接口
Mock.mock('/api/login', 'post', function(options) {
// 解析POST请求体
const { username, password } = JSON.parse(options.body)
// 模拟登录验证
if (username === 'admin' && password === '123456') {
return Mock.mock({
code: 200,
message: '登录成功',
token: '@guid', // 随机GUID作为token
user: {
id: 1,
name: '管理员',
role: 'admin'
}
})
} else {
return {
code: 401,
message: '用户名或密码错误'
}
}
})
🎨 深度解析Mock.js语法
数据模板定义规范
Mock.js使用 'name|rule': value 的语法结构:
{
// 属性值是字符串
'username|1-3': 'a', // 重复'a'1-3次 → 'a', 'aa' 或 'aaa'
'fixed|2': 'b', // 固定重复2次 → 'bb'
// 属性值是数字
'age|1-100': 1, // 1-100的随机整数
'score|1-100.2': 1, // 1-100的随机数,保留2位小数
// 属性值是布尔值
'isAdmin|1': true, // 50%概率为true
// 属性值是对象
'profile|2': { // 随机选取2个属性
age: 25,
gender: 'male',
email: 'test@example.com'
},
// 属性值是数组
'hobbies|1-3': ['coding', 'reading', 'gaming'] // 随机选取1-3项
}
常用占位符详解
| 分类 | 占位符 | 示例输出 | 说明 |
|---|---|---|---|
| 基础 | @id | "430000198502128762" | 随机ID |
@guid | "6EC9B178-6E4B-468E-BF38-5BC7B79CDA56" | GUID格式 | |
| 姓名 | @cname | "张三" | 中文姓名 |
@name | "John Smith" | 英文姓名 | |
| 地址 | @region | "华北" | 大区 |
@county(true) | "北京市海淀区" | 详细地址 | |
| 日期 | @datetime | "2023-05-20 14:23:12" | 随机日期时间 |
@date('yyyy-MM-dd') | "1990-10-15" | 格式化日期 | |
| 文本 | @ctitle(5,10) | "深入学习Mock.js" | 5-10字中文标题 |
@cparagraph(2,4) | "Mock.js是...非常实用。" | 2-4段中文段落 | |
| 网络 | @email | "example@gmail.com" | 随机邮箱 |
@url | "www.example.com/path" | 随机URL | |
| 图像 | @image('200x100') | "dummyimage.com/200x100" | 随机图片URL |
🔌 React集成最佳实践
1. 环境区分配置
// src/setupMock.js
import Mock from 'mockjs'
// 只在开发环境启用Mock
if (process.env.NODE_ENV === 'development') {
// 用户相关接口
Mock.mock(/\/api\/users\/\d+/, 'get', (options) => {
const id = options.url.match(/\/api\/users\/(\d+)/)[1]
return Mock.mock({
id: parseInt(id),
name: '@cname',
age: '@integer(18,60)',
email: '@email',
lastLogin: '@datetime'
})
})
// 商品分页接口
Mock.mock('/api/products', 'get', (options) => {
const { page = 1, size = 10 } = options.params
return Mock.mock({
[`list|${size}`]: [{
'id|+1': (page - 1) * size + 1,
'name': '@ctitle(5,10)',
'price|100-9999': 1,
'stock|0-200': 0,
'image': '@image("200x200")'
}],
page,
size,
total: 100,
pages: 10
})
})
}
2. 自定义Hook封装
// hooks/useMockApi.js
import { useState, useEffect } from 'react'
import axios from 'axios'
export function useMockApi(url, options = {}) {
const [data, setData] = useState(null)
const [loading, setLoading] = useState(true)
const [error, setError] = useState(null)
const fetchData = async (params) => {
try {
setLoading(true)
const response = await axios({
url,
method: options.method || 'get',
params,
data: options.body
})
setData(response.data)
} catch (err) {
setError(err)
} finally {
setLoading(false)
}
}
useEffect(() => {
fetchData(options.params)
}, [url, JSON.stringify(options.params)])
return {
data,
loading,
error,
refetch: fetchData
}
}
// 使用示例
const { data: products, loading } = useMockApi('/api/products', {
params: { page: 1, size: 5 }
})
🎯 高级应用场景
1. 动态响应处理
// 模拟搜索接口,根据query参数返回不同结果
Mock.mock('/api/search', 'get', (options) => {
const { query } = options.params
const count = query ? 5 : 0
return Mock.mock({
'list|${count}': [{
id: '@id',
title: `@ctitle(3,5)${query}`,
description: '@cparagraph(1)',
image: '@image("100x100")'
}],
query,
timestamp: '@now'
})
})
2. 自定义随机扩展
// 扩展自定义随机生成器
Mock.Random.extend({
tech: function() {
const techs = ['React', 'Vue', 'Angular', 'Svelte', 'Next.js']
return this.pick(techs)
},
level: function() {
return this.pick(['初级', '中级', '高级', '专家'])
}
})
// 使用自定义扩展
Mock.mock('/api/skills', {
'list|5': [{
name: '@tech',
level: '@level',
'score|1-5': '⭐'
}]
})
🚨 生产环境注意事项
-
条件引入:确保Mock只在开发环境加载
// src/index.js if (process.env.NODE_ENV === 'development') { import('./mock').then(module => module.default()) } -
构建排除:通过Webpack配置排除Mock代码
// webpack.config.js plugins: [ new webpack.DefinePlugin({ 'process.env.USE_MOCK': JSON.stringify(process.env.NODE_ENV === 'development') }) ] -
API切换:使用axios拦截器实现环境切换
// src/utils/api.js const instance = axios.create({ baseURL: process.env.NODE_ENV === 'production' ? 'https://real-api.com' : '/api' })
🎉 总结与资源推荐
Mock.js为React开发提供了完整的模拟数据解决方案,通过本文您已经掌握:
- 🛠️ 多环境配置方法
- 🎨 丰富的数据模板语法
- 🔌 与React的深度集成
- 🚀 高级应用场景实现
推荐资源:
希望这篇深度指南能帮助您在React项目中高效使用Mock.js!💻✨