介绍
mock意为“模仿”或"模拟",简单来说,就是造数据,造你想要的几乎任何数据,包括api和通过api返回的数据。
在写完项目进行自测,或者写页面需要数据 但是又不想单独开个后端,这时候就可以用mockjs来实现返回随机数据。
官网 :http://mockjs.com/
官方文档 :https://github.com/nuysoft/Mock/wiki
示例文档 :http://mockjs.com/examples.html
安装 & 卸载 & 引入
npm i mockjs
npm uninstall mockjs
import Mock from 'mockjs'
基础语法 & 规范
Mock.mock
造数据,需要使用到mock方法:
Mock.mock(xxx)
每个被伪造的数据,都包含3部分:
属性名 name生成规则 rule属性值 value
比如:
const data = Mock.mock({
code: '0',
msg: 'success',
'list|5': [{ name: '@name', age: '@integer(18, 25)'}]
})
这里的code , msg , list 都是属性名,其中list和msg都是字符串,list是数组
code和msg的数据过于简单,所以生成规则在这里省略了,
而list对应的生成规则是|5 ,意思是生成一个数组,里面包含5个元素
这里的'0' , 'success' 和 [{ name: '@name', age: '@integer(18, 25)'}] 就是他们各自对应的值。
打印一下生成的结果看看:
console.log(data)
{
"code": "0",
"msg": "success",
"list": [
{
"name": "Nancy Lewis",
"age": 18
},
{
"name": "Gary Wilson",
"age": 25
},
{
"name": "Shirley Gonzalez",
"age": 22
},
{
"name": "Mark Moore",
"age": 24
},
{
"name": "Richard Gonzalez",
"age": 22
}
]
}
从上面的例子可以得知,生成规则是可选的,非必须的
如果存在生成规则,那么属性名和生成规则之间需要用|隔开
7种生成规则
const data = Mock.mock({
'list|1-5': ['hello-']
})
[
"hello-",
"hello-",
"hello-",
"hello-",
"hello-"
]
[
"hello-",
"hello-",
"hello-"
]
const data = Mock.mock({
'list|2': ['hello-']
})
[
"hello-",
"hello-"
]
'name|min-max.dmin-dmax': value
const data = Mock.mock({
'num1|1-100.1-3': 1
})
生成的结果可能是: 也可能是:
'name|min-max.dcount': value
'name|count.dmin-dmax': value
'name|count.dcount': value
生成规则和属性值value的关系
属性值是布尔值
'name|1': value
'name|min-max': value
属性值是对象 Object
'name|count': object
'name|min-max': object
属性值是数组 Array
'name|1': array
'name|+1': array
'name|min-max': array
通过重复属性值 array 生成一个新数组,重复次数为 count。
属性值是正则表达式 RegExp
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"
}
占位符@
占位符 引用的是 Mock.Random 中的方法,
这跟vue中的v-on:click省略成@click很像。可以简单理解为Mock.Random的缩写。
@后面跟上Mock.Random的一些固定方法,用来生成随机数据。
用法示例:
const data = Mock.Random.cname()
改成占位符的方法就是:
const data = Mock.mock('@cname')
这里的cname 就是Mock.Random的一个方法,表示获取随机的中文人名。
这里有一张表格,包含了Mock.Random的方法,并进行了简单的分类:
方法名前面带c 的,都是用来获取中文相关的数据的。比如@name 用来生成随机的英文名,而@cname 就是用来生成随机的中文名。
另外,这些方法还可以带参数,以下有一些例子:
import Mock from 'mockjs'
let basicData = Mock.mock({
'list|1-100': [{
'id|+1': 1,
'isBoolean': '@boolean(10, 0, true)',
'naturalNumber': '@natural(1, 1000)',
'integer': '@integer(0)',
'float': '@float(1, 100, 3, 6)',
'character': '@character("upper")',
'string': '@string("lower", 5, 20)',
'range': '@range(1, 10, 2)',
}]
});
let Date = Mock.mock({
'dateList|10': [{
'date': '@date',
'date-yyyy-MM-dd': '@date(yyyy-MM-dd)',
'date-yy-MM-dd': '@date(yy-MM-dd)',
'date-y-MM-dd': '@date(y-MM-dd)',
'date-y-M-d': '@date(y-M-d)',
'line-through': '------------------------------------------------',
'timessss': '@time',
'time-format': '@time()',
'time-format-1': '@time("A HH:mm:ss")',
'time-format-2': '@time("a HH:mm:ss")',
'time-format-3': '@time("HH:mm:ss")',
'time-format-4': '@time("H:m:s")',
'datetime': '@datetime("yyyy-MM-dd A HH:mm:ss")',
'dateNow': '@now("second")'
}]
});
let imageList = Mock.mock({
'imageList|5': [{
'id|+1': 1,
'img': '@image',
'img-1': '@image("200x100", "#000", "#fff", "png", "Mock.js")',
}]
})
let paragraph = Mock.mock({
'paragraphList|5': [{
'id|+1': 1,
'paragraph1': '@cparagraph(2)',
'paragraph2': '@paragraph(3)',
'title': '@title',
'ctitle': '@ctitle',
}]
})
let name = Mock.mock({
'nameList|5': [{
'id|+1': 1,
'name': '@name',
'cname': '@cname',
}]
})
let webList = Mock.mock({
'webList|5': [{
'id|+1': 0,
'url': '@url("http", "baidu.com")',
'protocol': '@protocol',
'domain': '@domain',
'email': '@email',
'ip': '@ip'
}]
})
let address = Mock.mock({
'addressList|5': [{
'id|+1': 1,
'region': '@region',
'province': '@province',
'city': '@city',
'country': '@country',
'zip': '@zip',
}]
})
console.log(address)
此外,有完整的官方示例文档:http://mockjs.com/examples.html
哪个方法不知道怎么用了, 就可以直接去示例文档中查看。
模拟接口
Mock.mock( rurl, rtype, data)
介绍以下三个参数:
rurl :请求路径,可以是相对路径,也可以是绝对路径rtype :请求方式,比如get post put delete等data :要返回的模拟数据
举例:
import React, {useEffect} from 'react'
import Mock from 'mockjs'
import axios from 'axios'
Mock.mock('/mock/usermsg', 'get', {
code: '0',
msg: 'success',
'list|5': [{ name: '@name', age: '@integer(18, 25)'}]
})
const DemoMock = () => {
useEffect(async () => {
const res = await axios('/mock/usermsg')
console.log(res.data)
})
return <h3>hello react</h3>
}
export default DemoMock
返回的结果:
是不是很好玩?
|