前端项目需要用到的Mock自己看API学习,感觉收获满满,加油!!!
啊啊啊!!!,我就是参考的官网,没有抄别的,老是不通过审核,哎,我也不管能不能过了,我就说说吧,能过最后,不能也就这样,这都是的一笔财富。我突然感觉压力好大,因为快就业了,感觉一下就长大,想的多了,还是怀念高中的时光,也不知道能找到一个什么样的工作,我一个小姑娘,本来跟男生学这个就差很多,我又感觉我好笨,最近跟舍友感情局,聊到白月光与朱砂痣,想到了我得意难平,如果再给我一个机会,我一定要好好把握
什么是Mock
官网
mock解决的问题
开发时,后端还没完成数据输出,前端只好写静态模拟数据。数据太长了,将数据写在js文件里,完成后挨个改url。某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据,要么编写更多代码,要么手动修改模拟数据。特殊的格式,例如IP,随机数,图片,地址,需要去收集
mock优点
-
前后端分离
让前端工程师独立于后端进行开发。 -
增加测试的真实性
通过随机数据,模拟各种场景。 -
开发无侵入
通过随机数据,模拟各种场景。
-
用法简单
符合直觉的接口。
-
数据类型丰富
支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。
-
方便扩展
支持支持扩展更多数据类型,支持自定义函数和正则。 -
在已有接口文档的情况下,我们可以直接按照接口文档来开发,将相应的字段写好,在接口完成 之后,只需要改变url地址即可。
-
不涉及跨域问题
安装Mock
npm install mockjs
或者在vue脚手架中下载
在vue中使用Mock
在src中创建Mock/index.js文件储存生成的数据
然后在main.js主入口文件中引入改文件
然后就可以在页面中进行axios请求了
Mock/index.js文件
const Mock = require("mockjs");
let data = Mock.mock({
"data|4": [ //生成4条数据 数组
{
"shopId|+1": 1,//生成商品id,自增1
}
]
})
Mock.mock(/goods\/goodAll/, 'post', () => { //三个参数。第一个路径,第二个请求方式post/get,第三个回调,返回值
return data
})
main.js
import "./mock/index.js"
App.vue
<template>
<div id="app">
<ul>
<li v-for="(user) in foodList" :key="user.shopId">
{{ user.shopId }}
</li>
</ul>
</div>
</template>
<script>
import axios from "axios";
export default {
data() {
return {
foodList: [],
};
},
mounted() {
this.initMsg();
},
methods: {
initMsg() {
axios.post("http://localhost:8080/goods/goodAll").then((res) => {
this.foodList = res.data.data;
console.log(this.foodList);
});
},
},
};
</script>
<style>
</style>
效果:
可以尝试一下这个小Demo,你就可以简单的使用mock了
Mock知识点
语法规范
Mock.js 的语法规范包括两部分:
- 数据模板定义规范(Data Template Definition,DTD)
- 数据占位符定义规范(Data Placeholder Definition,DPD)
数据模板定义规范 DTD
数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值:
// 属性名 name
// 生成规则 rule
// 属性值 value
'name|rule': value
注意:
-
属性名 和 生成规则 之间用竖线
|
分隔。 -
生成规则 是可选的。
-
生成规则
有 7 种格式:
'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
-
生成规则 的 含义 需要依赖 属性值的类型 才能确定。
-
属性值 中可以含有
@占位符
。 -
属性值 还指定了最终值的初始值和类型。
数据占位符定义规范 DPD
占位符 只是在属性值字符串中占个位置,并不出现在最终的属性值中。
占位符 的格式为:
@占位符
@占位符(参数 [, 参数])
注意:
- 用
@
来标识其后的字符串是 占位符。 - 占位符 引用的是
Mock.Random
中的方法。 - 通过
Mock.Random.extend()
来扩展自定义占位符。 - 占位符 也可以引用 数据模板 中的属性。
- 占位符 会优先引用 数据模板 中的属性。
- 占位符 支持 相对路径 和 绝对路径。
Mock.mock()
Mock.mock( rurl?, rtype?, template|function( options ) )
根据数据模板生成模拟数据。
-
rurl
可选。
表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如
/\/domain\/list\.json/
、'/domian/list.json'
。 -
rtype
可选。
表示需要拦截的 Ajax 请求类型。例如
GET
、POST
、PUT
、DELETE
等。 -
template
可选。
表示数据模板,可以是对象或字符串。例如
{ 'data|1-10':[{}] }
、'@EMAIL'
。 -
function(options)
可选。
表示用于生成响应数据的函数。
-
options
指向本次请求的 Ajax 选项集,含有
url
、type
和body
三个属性,参见 XMLHttpRequest 规范。
-
Mock.setup()
Mock.setup( settings )
- Mock.setup( settings )
配置拦截 Ajax 请求时的行为。支持的配置项有:timeout
。
settings
必选。
配置项集合。
timeout
可选。
指定被拦截的 Ajax 请求的响应时间,单位是毫秒。值可以是正整数,例如 400
,表示 400 毫秒 后才会返回响应内容;也可以是横杠 '-'
风格的字符串,例如 '200-600'
,表示响应时间介于 200 和 600 毫秒之间。默认值是'10-100'
。
Mock.setup({
timeout: 400
})
Mock.setup({
timeout: '200-600'
})
目前,接口
Mock.setup( settings )
仅用于配置 Ajax 请求,将来可能用于配置 Mock 的其他行为。
Mock.Random
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.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 |
具体的方法可以参考mock官网
扩展
Mock.Random 中的方法与数据模板的 @占位符
一一对应,在需要时还可以为 Mock.Random 扩展方法,然后在数据模板中通过 @扩展方法
引用。例如:
Random.extend({
constellation: function(date) {
var constellations = ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座']
return this.pick(constellations)
}
})
Random.constellation()
// => "水瓶座"
Mock.mock('@CONSTELLATION')
// => "天蝎座"
Mock.mock({
constellation: '@CONSTELLATION'
})
// => { constellation: "射手座" }
Mock.valid()
Mock.valid( template, data )
校验真实数据 data
是否与数据模板 template
匹配。
-
Mock.valid( template, data )
-
template
必选。
表示数据模板,可以是对象或字符串。例如
{ 'list|1-10':[{}] }
、'@EMAIL'
。 -
data
必选。
表示真实数据。
var template = {
name: 'value1'
}
var data = {
name: 'value2'
}
Mock.valid(template, data)
// =>
[
{
"path": [
"data",
"name"
],
"type": "value",
"actual": "value2",
"expected": "value1",
"action": "equal to",
"message": "[VALUE] Expect ROOT.name'value is equal to value1, but is value2"
}
]
Mock.toJSONSchema()
Mock.toJSONSchema( template )
把 Mock.js 风格的数据模板 template
转换成 JSON Schema。
我感觉就是把Mock.js风格的数据模板转换为json格式的
-
Mock.toJSONSchema( template )
-
template
必选。
表示数据模板,可以是对象或字符串。例如
{ 'list|1-10':[{}] }
、'@EMAIL'
。
var template = {
'key|1-10': '★'
}
Mock.toJSONSchema(template)
// =>
{
"name": undefined,
"path": [
"ROOT"
],
"type": "object",
"template": {
"key|1-10": "★"
},
"rule": {},
"properties": [{
"name": "key",
"path": [
"ROOT",
"key"
],
"type": "string",
"template": "★",
"rule": {
"parameters": ["key|1-10", "key", null, "1-10", null],
"range": ["1-10", "1", "10"],
"min": 1,
"max": 10,
"count": 3,
"decimal": undefined,
"dmin": undefined,
"dmax": undefined,
"dcount": undefined
}
}]
}
var template = {
'list|1-10': [{}]
}
Mock.toJSONSchema(template)
// =>
{
"name": undefined,
"path": ["ROOT"],
"type": "object",
"template": {
"list|1-10": [{}]
},
"rule": {},
"properties": [{
"name": "list",
"path": ["ROOT", "list"],
"type": "array",
"template": [{}],
"rule": {
"parameters": ["list|1-10", "list", null, "1-10", null],
"range": ["1-10", "1", "10"],
"min": 1,
"max": 10,
"count": 6,
"decimal": undefined,
"dmin": undefined,
"dmax": undefined,
"dcount": undefined
},
"items": [{
"name": 0,
"path": ["data", "list", 0],
"type": "object",
"template": {},
"rule": {},
"properties": []
}]
}]
}