mockjs生成假数据的基本使用

1.安装

1
npm install mockjs --save 	
  • 截止写这篇文章的时候,mockjs安装的版本为"mockjs": "^1.1.0"

2.建立一个文件夹(mock)和文件(mock.js)

  • 注意: mock文件夹和components组件或者是store是同级的(不是说一定,而是一般这样子做~)
  • 建立的文件如下

3.编辑mock.js文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//引入mockjs库
import mockjs from "mockjs";
//引入数据
// import bannerData from "./bannerData.json";

//这里为了演示,就不单独建立一个bannerData的文件了
const bannerData = [
{
"id|1-3": "001",
"name|1": ["家用电器1", "家用电器2", "家用电器3"],
"keywords": ["节能补贴", "4K电视", "空气净化器", "IH电饭煲", "滚筒洗衣机"],
}
]

// 记录数据模板。当拦截到匹配 url 的 Ajax 请求时,将根据数据模板 template 生成模拟数据,并作为响应数据返回。
Mock.mock("/mock/bannerData",{
code:200,
data:bannerData
});

4.在main.js中引入

1
2
3
4
5
6
7
import Vue from "vue"
import App from "@/App"
import "@/mock/mock";
new Vue({
el:"#app",
render:h=>h(App)
})

5.测试

  • 为了测试mock,这里安装了下axios

App.vue测试mock

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<template>
<divdiv>
</template>
<script>
import axios from "axios";
export default {
name: "",
data() {
return {}
},
mounted(){
axios.get("/mock/bannerData").then(res=>{
console.log("假数据结果",res.data);
}).catch(error=>{
console.log(error);
})
}
};
</script>

输出结果

mockjs的数据生成规范

疑问

  • 我们刚刚编写了下面这段代码,去生成假数据,那么下面这段代码是什么意思呢?
1
2
3
4
5
6
7
const bannerData = [
{
"id|1-3": "001",
"name|1": ["家用电器1", "家用电器2", "家用电器3"],
"keywords": ["节能补贴", "4K电视", "空气净化器", "IH电饭煲", "滚筒洗衣机"],
}
]
  • 根据规范的说明,大概如下

数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值

1
2
3
4
// 属性名   name
// 生成规则 rule
// 属性值 value
'name|rule': value

并且根据官方提供的生成规则和示例:

1.属性值是字符串 String

  1. 'name|min-max': string

    通过重复 string 生成一个字符串,重复次数大于等于 min,小于等于 max

  2. 'name|count': string

    通过重复 string 生成一个字符串,重复次数等于 count

2. 属性值是数字 Number

  1. 'name|+1': number

    属性值自动加 1,初始值为 number

  2. 'name|min-max': number

    生成一个大于等于 min、小于等于 max 的整数,属性值 number 只是用来确定类型。

  3. 'name|min-max.dmin-dmax': number

    生成一个浮点数,整数部分大于等于 min、小于等于 max,小数部分保留 dmindmax 位。

1
2
3
4
5
6
7
8
9
10
11
12
13
Mock.mock({
'number1|1-100.1-10': 1,
'number2|123.1-10': 1,
'number3|123.3': 1,
'number4|123.10': 1.123
})
// =>
{
"number1": 12.92,
"number2": 123.51,
"number3": 123.777,
"number4": 123.1231091814
}

3. 属性值是布尔型 Boolean

  1. 'name|1': boolean

    随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率同样是 1/2。

  2. 'name|min-max': value

    随机生成一个布尔值,值为 value 的概率是 min / (min + max),值为 !value 的概率是 max / (min + max)

4. 属性值是对象 Object

  1. 'name|count': object

    从属性值 object 中随机选取 count 个属性。

  2. 'name|min-max': object

    从属性值 object 中随机选取 minmax 个属性。

5. 属性值是数组 Array

  1. 'name|1': array

    从属性值 array 中随机选取 1 个元素,作为最终值。

  2. 'name|+1': array

    从属性值 array 中顺序选取 1 个元素,作为最终值。

  3. 'name|min-max': array

    通过重复属性值 array 生成一个新数组,重复次数大于等于 min,小于等于 max

  4. 'name|count': array

    通过重复属性值 array 生成一个新数组,重复次数为 count

6. 属性值是函数 Function

  1. 'name': function

    执行函数 function,取其返回值作为最终的属性值,函数的上下文为属性 'name' 所在的对象。

7. 属性值是正则表达式 RegExp

  1. 'name': regexp

    根据正则表达式 regexp 反向生成可以匹配它的字符串。用于生成自定义格式的字符串。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Mock.mock({
    'regexp1': /[a-z][A-Z][0-9]/,
    'regexp2': /\w\W\s\S\d\D/,
    'regexp3': /\d{5,10}/
    })
    // =>
    {
    "regexp1": "pJ7",
    "regexp2": "F)\fp1G",
    "regexp3": "561659409"
    }

那么我们接着下面这段代码的含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const bannerData = [
{
//属性名为id,生成规则为1-3 属性值为 字符串'001'
//所以根据规则,是重复字符串'001',重复次数为1-3次
"id|1-3": "001",

//属性名为name,生成规则为1 属性值为 数组
//根据规则,从数组当中随机选取一个并返回
"name|1": ["家用电器1", "家用电器2", "家用电器3"],

//属性名为name,生成规则为空 属性值为 数组
//根据规则,原封不动返回,因为生成规则为空
"keywords": ["节能补贴", "4K电视", "空气净化器", "IH电饭煲", "滚筒洗衣机"],
}
]

mock从数组对象当中随机选取指定数目的值返回

  • 如下数据,我想从bannerData当中的shopList随机选取2项返回,那么要怎么做呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const bannerData = {
shopList:[
{
id:"1",
name:"李白",
age:"18",
},
{
id:"2",
name:"李黑",
age:"25",
},
{
id:"3",
name:"李明",
age:"28",
},
{
id:"4",
name:"李暗",
age:"32",
},
]
}

误区

  • 一开始我想这样子,将生成规则设置为2,因为上面的数据生成规范说'name|1': array意思是从属性值 array 中随机选取 1 个元素,作为最终值。那么我讲生成规则设置为2,岂不是随机选取2个
    • 于是我设置"shopList|2",但是事与原委,结果是重复shopList这个数组重复了2次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const bannerData = {
"shopList|2":[
{
id:"1",
name:"李白",
age:"18",
},
{
id:"2",
name:"李黑",
age:"25",
},
{
id:"3",
name:"李明",
age:"28",
},
{
id:"4",
name:"李暗",
age:"32",
},
]
}

shopList|2

解法

  • 后面细看才知道,
    • 'name|1': array 从属性值 array 中随机选取 1 个元素,作为最终值。
    • 'name|count': array 通过重复属性值 array 生成一个新数组,重复次数为 count
  • 也就是说我们设置"shopList|2":array,因为我们设置的生成规则是2,2大于了1,所以是采取重复次数
  • 真正做法就是使用Mock当中的pick方法
    • 可以用过Mock.Random引入Random库
    • 也可以直接通过占位符来使用@官方api
  • Random.pick()在官方是传入一个参数,但是后面查看别人写法,也可以传入参数2,参数3,语法规范如下
    • Random.pick(要取的数据,取的最小数据个数(定位min),取的最大数据个数(定位max)),从要取的数据当中随机取min-max的数据个数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//引入mockjs库
import Mock from "mockjs";
var Random = Mock.Random;//引入Random库
const bannerData = {
"shopList":[
{
id:"1",
name:"李白",
age:"18",
},
{
id:"2",
name:"李黑",
age:"25",
},
{
id:"3",
name:"李明",
age:"28",
},
{
id:"4",
name:"李暗",
age:"32",
},
]
}

var a = Random.pick(bannerData.shopList,2,4)
console.log(a);

可以看到,每一次循环都是不一样的数据返回

参考文章

Mock.Random:https://github.com/nuysoft/Mock/wiki/Mock.Random

Mock.js之数据占位符定义:https://www.jianshu.com/p/c12072f231d4