Mock.js快速入门

Mock.js

一、什么是Mock.js

Mock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:

  • 根据数据模板生成模拟数据
  • 模拟 Ajax 请求,生成并返回模拟数据
  • 基于 HTML 模板生成模拟数据

二、安装 Mock.js

1.通过 npm 安装 Mock.js

npm install mockjs

2.通过 yarn 安装 Mock.js

yarn add mockjs

3.通过 pnpm 安装 Mock.js

pnpm add mockjs

三、使用 Mock.js

// src/mock/index.js

// 导入 mock 
import Mock from 'mockjs'


// src/main.js
 
// 在 main.js 中导入 Mock
import '@/mock/index.js'

四、使用 Mock 生成数据的语法

1.生成指定类型

// string 表示生成字符串 
// 1-4 表示重复次数 
// 格式 'string|1-4' 或 'string|7'
// '哎呦!' 表示要重复生成的字符串
const data = Mock.mock({
  'string|1-4': '哎哟!'
})
// number 表示生成数字
// 50-99 表示要生成的数字的取值范围
// 格式 'number|20-50' 或 'number|8'
// 例子中的 10 表示要被覆盖的初始值
const data = Mock.mock({
  'number|50-99': 10
})

2.生成文字

// 函数中的 c 表示生成中文 去掉c 会生成英文
// 函数可传入 指定字数 或者 字数范围
// 生成词
// 函数 @cword() @ctitle() @csentence() @cparagraph()
const data = Mock.mock({
  string: '@cword(3,10)'
})

// 生成标题和句子
const data = Mock.mock({
  title: '@ctitle(5)',
  sentence: '@csentence()'
})

// 生成段落
const data = Mock.mock({
  content: '@cparagraph()'
})

3.生成增量id

// 参数表示起始量和增量的大小
// 函数 @increment()
const data = Mock.mock({
  'list|20': [
    {
      id: '@increment(2)' 
    }
  ]
})

4.生成姓名-地址-身份证号

// 函数 @cname() @id() @city() 
// 函数 @city() 的 参数 true 表示是否生成省
const data = Mock.mock({
  name: '@cname()',
  idCard: '@id()',
  address: '@city(true)' // true 是否显示省
})

5.生成随机图片

// 函数 @image()
// 参数 1. 图片大小 2. 图片背景色 3. 图片前景色 4. 图片格式 5. 图片文字
const data = Mock.mock({
  img_url: "@image('250x250','#bcbcbc','#666666','png','坤坤')"
})

6.生成时间

// 函数 @date
// 参数 时间格式 yyyy-MM-dd or yyyy-MM-dd hh:mm:ss
const data = Mock.mock({
  date: '@date(yyyy-MM-dd hh:mm:ss)'
})

7.生成列表

// 指定数组返回条数
// 格式 'list|20-50'
const data = Mock.mock({
  'list|20-50': [
    {
      name: '@cname()',
      idCard: '@id()',
      address: '@city(true)'
    }
  ]
})

五、使用 Mock 拦截请求

1.定义拦截 GET 请求

// /src/mock/index.js
// 三个参数 (路径,请求方式,返回的数据或者返回数据的回调函数)
Mock.mock('/api/get/news', 'get', {
  code: 1,
  msg: '获取数据成功'
})

// 请求方式
axios({
  method: 'GET',
  url: '/api/get/news'
})

2.定义拦截 POST 请求

Mock.mock('/api/post/news', 'post', {
  code: 1,
  msg: '获取数据成功'
})

// 请求方式
axios({
  method: 'POST',
  url: '/api/post/news'
})

3.回调函数形式

// 也可以写成回调函数的形式
Mock.mock('/api/post/news', 'post',() => {
    return {
        code: 1,
        msg: '获取数据成功'
    }
})

4.请求的接口地址可以使用正则表达式

// 当 GET 请求携带参数时
axios({
    method:'GET',
    url:'/api/get/news',
    params:{
        pageIndex: 1,
        pageSize: 20
    }
})

// 实际请求 url 为 http://localhost:5500/api/get/news?pageIndex=1&pageSize=20
// Mock 无法拦截 
// 使用正则匹配带有 /api/get/news 的请求,实现 GET 请求的拦截

// Mock 拦截
Mock.mock(/\/api\/get\/news/, 'get',() => {
    return {
        code: 1,
        msg: '获取数据成功'
    }
})

5.自定义函数获取url中的参数

// 当 GET 请求携带参数时
axios({
    method:'GET',
    url:'/api/get/news',
    params:{
        pageIndex: 1,
        pageSize: 20
    }
})

// 实际请求 url 为 http://localhost:5500/api/get/news?pageIndex=1&pageSize=20
// Mock

// 封装:根据 请求的 url 获取 以参数 name 为 key 的 value 
const getQuery = (url,name) => {
    // 得到 url 中 ? 的位置
    const index = url.indexOf('?')
    // 如果 ? 不存在 则 index 的值为 -1
    // 当 index 的值不为 -1 时,该请求一定有参数
    if(index !== -1){
        // 通过 substr 方法截取字符串 得到 url 中带有参数的部分
        // 再通过 split 方法 传参为 & 分割字符串为每项为参数的字符串数组
        const queryStrArr = url.substr(index+1).split('&')
        // 通过 for in 迭代 queryStrArr
        for(index in queryStrArr){
            // 调用 split 方法分割字符串 
            const itemArr = queryStrArr[index].split('=')
            // 判断
            if(itemArr[0] === name){
                // 返回值
                return itemArr[1]
            }
        }
    }
    // 该字符串没有参数 返回 null
    return null
}

Mock.mock(/\/api\/get\/news/, 'get', (options) => {
    const pageIndex = getQuery(options.url,options.name)
    return {
        code: 1,
        msg: '获取数据成功'
    }
})

6.获取 POST 请求中的 body

// 当 POST 请求携带参数时
axios({
    method:'POST',
    url:'/api/post/news',
    body:{
        title: 1,
        content: 20
    }
})

// 通过 options.body 来接收 POST 参数

Mock.mock('/api/get/news', 'get', (options) => {
    const body = JSON.parse(options.body)
    return {
        code: 1,
        msg: '获取数据成功',
        data: {
            title: body.title,
        	content: body.content
        }
    }
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IndulgeBack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值