打开官网http://mockjs.com/,映入眼帘的就是“生成随机数据,拦截 Ajax 请求”。Mock.js就是一款方便进行前后端分离开发的工具,能够拦截Ajax请求,并返回模拟数据,保证前端工程师们的开发不依赖于后端开发进度。具有:前后端分离、开发无侵入、数据类型丰富、用法简单、方便拓展的特点。
Mock.js支持多种安装方式,我们在项目中可以直接使用npm进行安装
npm install mockjs
或者直接Bower进行安装
npm install -g bower
bower install --save mockjs
之后使用标签进行引用
<script type="text/javascript" src="./bower_components/mockjs/dist/mock.js"></script>
更多的安装方式在官网都有详细介绍,可以根据自身项目需要进行选择。
最好的讲解方法永远是实践,学习的第一步,我们先在工程内实践一个Mock的应用,以此有一个总体的概念,便于理解(公司项目更多是以Vue为框架,所以本文的介绍也以Vue为主)。
安装好Mock.js后,我们在项目中创建mock.js文件,我比较推荐建立mock文件夹,然后以服务对文件进行分类,这里我们就简单建立一个了解用法。
//引入mockjs
import Mock from 'mockjs'
//使用mockjs模拟数据
//Mock.mock( rurl?, rtype?, template|function( options ) )
const username = ['admin', 'user']
const password = ['123456', '123456']
const login = (options) => {
const body = getBody(options)
console.log('mock: body', body)
if (!username.includes(body.username) || !password.includes(body.password)) {
return { isLogin: true }
}
return {
'id': Mock.mock('@guid'),
'name': Mock.mock('@name'),
'username': 'admin',
'password': '',
'status': 1,
'telephone': '',
'creatorId': 'admin',
'createTime': "@datetime",
'deleted': 0,
'roleId': 'admin',
'lang': 'zh-CN',
'token': '4291d7da9005377ec9aec4a71ea837f'
}
}
Mock.mock('/\/auth\/login/', 'post', login);
main.js文件中引入写好的文件
import './mock/mock'//此部分引入的是我们所编写的mockjs文档
xxx.vue文件中调用mock.js中模拟的数据接口,这时返回的response就是mock.js中用Mock.mock( rurl?, rtype?, template|function( options ) ) 中设置的返回值了。
query_common_credit(){
var url = '/api/auth/login'
this.$axios.post(url, data)
.then(response => {
})
.catch(error => {
})
}
为了更好的模拟接口状态,有时我们需要对接口返回进行延时。如果不设置延时,数据是很快就取到的,这在真实场景下是存在问题的,与后台同学联调极易出现坑,所以要记得规避。
//设置延时可以设置一个固定值
Mock.setup({
timeout: 400 //延时400s请求到数据
})
//也可以设定一个范围值
Mock.setup({
timeout: '200-600' //延时200-600毫秒请求到数据
})
数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值:
// 属性名 name
// 生成规则 rule
// 属性值 value
'name|rule': value
|
分隔。'name|min-max': value
'name|count': value
'name|min-max.dmin-dmax': value
'name|min-max.dcount': value
'name|count.dmin-dmax': value
'name|count.dcount': value
'name|+step': value
@占位符
。生成规则和示例:
'name|min-max': string
通过重复 string
生成一个字符串,重复次数大于等于 min
,小于等于 max
。
'name|count': string
通过重复 string
生成一个字符串,重复次数等于 count
。
'name|+1': number
属性值自动加 1,初始值为 number
。
'name|min-max': number
生成一个大于等于 min
、小于等于 max
的整数,属性值 number
只是用来确定类型。
'name|min-max.dmin-dmax': number
生成一个浮点数,整数部分大于等于 min
、小于等于 max
,小数部分保留 dmin
到 dmax
位。
'name|1': boolean
随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率同样是 1/2。
'name|min-max': value
随机生成一个布尔值,值为 value
的概率是 min / (min + max)
,值为 !value
的概率是 max / (min + max)
。
'name|count': object
从属性值 object
中随机选取 count
个属性。
'name|min-max': object
从属性值 object
中随机选取 min
到 max
个属性。
'name|1': array
从属性值 array
中随机选取 1 个元素,作为最终值。
'name|+1': array
从属性值 array
中顺序选取 1 个元素,作为最终值。
'name|min-max': array
通过重复属性值 array
生成一个新数组,重复次数大于等于 min
,小于等于 max
。
'name|count': array
通过重复属性值 array
生成一个新数组,重复次数为 count
。
'name': function
执行函数 function
,取其返回值作为最终的属性值,函数的上下文为属性 'name'
所在的对象。
'name': regexp
根据正则表达式 regexp
反向生成可以匹配它的字符串。用于生成自定义格式的字符串。
占位符 只是在属性值字符串中占个位置,并不出现在最终的属性值中。
占位符 的格式为:
@占位符
@占位符(参数 [, 参数])
注意:
@
来标识其后的字符串是 占位符。Mock.Random
中的方法。Mock.Random.extend()
来扩展自定义占位符。Mock.Random 是一个工具类,用于生成各种随机数据。
Mock.Random 的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数])
。
var Random = Mock.Random
Random.email()
// => "n.clark@miller.io"
Mock.mock('@email')
// => "y.lee@lewis.org"
Mock.mock( { email: '@email' } )
// => { email: "v.lewis@hall.gov" }
//例子
Mock.mock(/(\/api\/)([a-z]{2,4})(\/proxy\/query_detail)/, {
"err":0,
"data": {
boo1:"@boolean",//随机获取boolean值
img:"@image",//随机获取图片路径
name:"@name"//随机获取名字
}
});
Mock.Random 提供的完整方法(占位符)如下:
Type | Method |
---|---|
Basic | boolean, natural, integer, float, character, string, range, date, time, datetime, now |
Image | image, dataImage |
Color | color |
Text | paragraph, sentence, word, title, cparagraph, csentence, cword, ctitle |
Name | first, last, name, cfirst, clast, cname |
Web | url, domain, email, ip, tld |
Address | area, region |
Helper | capitalize, upper, lower, pick, shuffle |
Miscellaneous | guid, id |