目录

1、入门

1.1、下载

1.2、配置与定义数据

1.3、使用方式

1.4、效果图

2、语法规范

2.1、数据模板定义规范 

2.2、数据占位符定义规

3、深入学习mockjs

3.1、Mock.mock

3.2、Mock.setup

3.3、Mock.Random

Mock.Random 方法 

Random.extend 扩展(自定义随机数据)

3.4、Mock.valid() 、Mock.toJSONSchema()

Mock.valid() 

 Mock.toJSONSchema()


版本:

 "axios": "^1.2.0",

"mockjs": "^1.1.0",

"vite-plugin-mock": "^2.9.6",

1、入门

1.1、下载

npm 下载axios 

 npm install axios

npm下载 mockjs + 在 vite 的mockjs的配置插件

npm i  mockjs vite-plugin-mock -D

1.2、配置与定义数据

vite.config.ts 

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
//vite-plugin-mock
import { viteMockServe } from 'vite-plugin-mock'
export default defineConfig({plugins: [vue(),viteMockServe({ //vite-plugin-mockmockPath: "./src/request/",// 指向mock下的文件,这个很重要,一定要指向 mock ,localEnabled: true, // 是否开启开发环境(生产环境不要打开.为 false将禁用 mock 功能)})],
})

创建一个request文件夹,创建以下三个文件,分别是: (要分开也行,注意路径就行,)

request : 用来封闭 axios

mock     : 用来拦截 axios 然后自定义数据 **** 这个才是配置mockjs的数据并返回的

api         :  请求 axios 

这样做可以最大化的把请求接口与mock的界线区分开,

到时候有真的接口,不要mock的某个接口时,删除mock文件下对应的数据就行

vite+vue3+axios+ts入门mockjs以及深入学习,直接一步精通-编程知识网

 request/request 文件配置

import axios from 'axios'
// 创建一个 axios 实例
const request = axios.create({baseURL: 'http://127.0.0.1:5173', // 所有的请求地址前缀部分timeout: 60000, // 请求超时时间毫秒withCredentials: true, // 异步请求携带cookie
})
// 添加请求拦截器
request.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config},function (error) {// 对请求错误做些什么console.error('请求错误', error)return Promise.reject(error)}
)
// 添加响应拦截器
request.interceptors.response.use(function (response) {// 对响应数据做点什么return response.data},function (error) {return Promise.reject(error)}
)export default request 

request/mock 定义数据 ,

这个文件在哪里vite.config.ts 的 mockPath 属性值就要写到mock.ts的上级目录

import Mock from "mockjs";
let mock = Mock.mock({url: "/mock", //请求路径method: "post",//请求方法response: () => {return {"data|6": [ //生成6条数据 数组{"shopId|+1": 1,//生成商品id,自增1"shopMsg": "@ctitle(10)", //生成商品信息,长度为10个汉字"shopAddress": "@county(true)", //随机生成地址"shopStar|1-5": "★", //随机生成1-5个星星}]}}
})
let index = Mock.mock({url: "/index",method: "get",response: () => {return {"data|6": [ //生成6条数据 数组{"shopId|+1": 1,//生成商品id,自增1"shopName": "@cname",//生成商品名 , 都是中国人的名字"shopTel": /^1(5|3|7|8)[0-9]{9}$/,//生成随机电话号}]}}
})
//导出给mockjs处理,导出的变量名随便定义
export default [mock,index,
]

上面 ( mock文件 ) 的导出的变量名随便定义,因为是给mockjs自动处理并返回数据的

但是Mock.mock中的url一定要和下面 ( api文件 ) 的路径要一样,因为 url 是浏览器请求的数据的路径

request/api 接口文件 ,这个文档主要写接口的路径与参数

// 导入axios实例
import request from './request'
// PAI
export const login = () => request.post('/mock')
export const index = () => request.get('/index')

1.3、使用方式

<script setup lang='ts'>
import { login,index } from "../request/api";//第一种方式:使用 promise.then
login().then(res => {console.log("login", res.data);
})//第二种方式:使用 await, 但第二种会有一个警告,
let res = await index()
console.log("index", res.data);</script>

第二种方式:警报

警报的意思中:具有异步setup()的组件必须嵌套在<Suspense>中才能呈现。

解决:在父组件套一个

    <Suspense>

        <异步请求的组件></异步请求的组件>

    </Suspense>

这就行了,但这个<Suspense>是一个实验性功能,其API可能会发生变化。

1.4、效果图

vite+vue3+axios+ts入门mockjs以及深入学习,直接一步精通-编程知识网

mockjs的示例文档

vite-plugin-mock的中文配置文档

2、语法规范

Mock.js 的语法规范包括两部分:1.数据模板定义规范  2.数据占位符定义规

2.1、数据模板定义规范 

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

属性名 name 、生成规则rule、属性值 value

格式:   name | rule: value

注意:

1.属性名和生成规则之间用竖线 | 分隔。

2.生成规则是可选的

3.生成规则有7种格式:

let constellationsObj = { Aries: '白羊座', Taurus: '金牛座', Gemini: '双子座', Cancer: '巨蟹座', Leo: '狮子座',virgo: '处女座',libra: '天秤座', scorpio: '天蝎座', sagittarius: '射手座', Capricornus: '摩羯座', aquarius: '水瓶座', Pisces: '双鱼座',}let constellationsArr = ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座']

   1、"name|min-max":value

        1.1:如果value是srting,重复value的值,重复次数等于随机min-max之间的次数。

        1.2:如果value是number,就会随机min-max之间选一个值

        1.3:如果value是boolean,最终值是与相反值的概率

        1.4:如果value是object,最终值是在value值中随机min-max个值

        1.5:如果value是array,最终值是重复valur值,会重复min-max之间次数

如: 1.1:"id|1-10":'1',  //第一次:'1'  ,第二次 :'11111111'1.2:"id|1-10":1,    //第一次:1   ,第二次 :81.3: "bool|1-10":true //true的的率为11为之1,false的的率为11为之101.4:"obj|1-3": constellationsObj , // 第一 obj:{aquarius:'水瓶座'}//第二 obj:{Cancer:'巨蟹座', Capricornus:'摩羯座'}  1.5: "arr|1-3": constellationsArr,//变量是 constellations ,不过是数组的//arr:['白羊座',...'双鱼座','白羊座',...'双鱼座','白羊座',...'双鱼座',]

   2、"name|count":value

        2.1:如果value是srting,重复value的值,重复次数等于count。

        2.2:如果value是boolean,最终值是相反值概的率倍数

        2.3:如果value是object,从属性值 object 中随机选取 count 个属性。

        2.4:如果value是array,分两种情况,count值为1,和1以上

                               count 为1的值:随机选中array中的一个值

                               count 为1以上的值:最终值是重复valur值,会重复count次数

        

如: 2.1: "id|5":'1', //=>'11111'  五个12.2: "bool|1":true, //=> true与false都是2分之1"bool|5":true, //=> true为5分之4, false都是5分之1,2.3:"obj|1": constellationsObj,//变量和上面的一样//一次 obj:{Aries: '白羊座'} ,二次 obj:{libra: '天秤座'}2.4:"arr|1": constellationsArr,//count 为1的值//一次 arr: '双子座' ,二次 arr: '水瓶座'"arr|2": constellationsArr,//count 为1以上的值// arr:['白羊座',...'双鱼座','白羊座',...'双鱼座']

   3、"name|min-max.dmix-dmax":value

        3.1:生成一个浮点数,整数部分大于等于min、小于等于max,

                小数部分保留dmin到dmax位,value只能是number值就行多少无所谓

如:3.1 "num|1-100.1-10": 1, 
//第一次 num: 13.502312311, 第二 num: 12.51 第三num: 53.6747

   4、"name|min-dcount":value

        4.1:生成一个浮点数,整数部分小于等于max、大于等于dcount整数,

                 小数部分保留dcount . 后的位数,value只能是number值就行多少无所谓

如:4.1 'num|1-10.2': 200,
//第一次num: 10.53 第二 num: 3.56 第三 num: 6.31

   5、"name|count.dmin-dmax":value

        5.1:把count作为一个值并小数部分保留dmin到dmax位,

                value只能是number值就行多少无所谓

如:5.1'num|1.1-10': 1,
//第一次num: 1.18737543 第二 num: 1.3170182 第三 num: 1.5665

   6、"name|count.dcount":value

        6.1:把count作为一个值并小数部分保留dcount位,但它最终值的前几位

                由value的小数点前几位占置,value只能是number值,且整数无用,小数有用

如:6.1 'num|1.8': 232.123
//第一次 num: 1.12377547 第二 num: 1.12379682 第三 num: 1.12356685

   7、"name|+step":value

        7.1:如果value是number,属性值自动加 step,初始值为 value。

        7.2:如果value是array,最终值为上次再加 step 顺序选取,会重复

如:5.1:"num|+1": 12, //第一 num: 12 第二 num: 13 第三 num: 145.2:"arr|+1": constellationsArr,//第一arr:'白羊座'  第二arr:'金牛座'   第三 arr:'双子座'

4.value是函数Function:执行函数 function,取其返回值作为最终的属性值

5.value是正则表达式 RegExp:根据正则表达式 regexp 反向生成可以匹配它的字符串

2.2、数据占位符定义规

占位符只是在属性值字符串中占个位置,

并不出现在最终的属性值中。

占位符的格式为:  @占位符    @占位符(参数[,参数])

注意:

1.用@来标识其后的字符串是占位符。

2.占位符引用的是Mock. Random中的方法。

3. 通过Mock. Random extend()来扩展自定义占位符。

4.占位符也可以引用数据模板中的属性。

5.占位符会优先引用数据模板中的属性。

6.占位符支持 相对路径和绝对路径。

这个 3.3、Mock.Random 会有说,知道123点,并过下就行

其实这个入门就够, 后面都是要看文档来配置数据的了

3、深入学习mockjs

3.1、Mock.mock

Mock.mock( rurl?, rtype?, template|function( options ) )

这个已经在入门展示过了其他使用的具体方法:mock.js学习之Mock.mock()&Mock.setup()使用_篇3

但上面这个是要在同一个组件上使用,如果你想要定义数据接口分开,还是使用我上面这种方法,

分开定义的好处就是数据来源清晰,容易修改数据、接口、请求方法等,

缺点就是要开多个文件,以及使用分开定义的mock bug有点多,这是因为mock从未更新过,但这是bug大都是可以用其它方法来避免的

后面 我用 分开定义  表示是我这种方法(一个文件定义mock数据,一个请求,还有一个要使用的组件)

组件定义  表示的是在同一个组件上定义的方法(在一个组件上定义数据并请求使用数据)

3.2、Mock.setup

配置拦截 Ajax 请求时的行为。支持的配置项只有一个:timeout 。

如果你是使用上面的链接的方法的话,也是在同一个组件上使用

但在我这定义数据接口分开是不行的,如何做才行?

let index = Mock.mock({url: "/index",method: "post",timeout: 1000,  //其实也很简单,就是在定义数据这加多一个这个属性就行response: () => { return *** }
})

 timeout : 它的参数是  numbe正整数 如400  或

                string 'xx – xx' 风格的字符串,如 "200 -600" ; 单位是毫秒 

表示 200 – 600 毫秒后才会返回响应内容,

3.3、Mock.Random

Mock.Random 是一个工具类,用于生成各种随机数据。

Mock.Random 的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数]) 。

官方示例:这个可以在任何地方使用

使用方法:Mock.Random
import Mock from "mockjs";
var Random = Mock.Random//在某一组件单独使用
Random.email()
// => "n.clark@miller.io"//在定义数据上使用  mock.ts 文件上
let index = Mock.mock({url: "/index",method: "post",response: () => {return {"email": Random.email(),// =>  { email: "v.lewis@hall.gov" }}}
})使用方法二:'@方法'
Mock.mock('@email')
// => "y.lee@lewis.org"

Mock.Random 方法 

类型 方法

基本

boolean, natural, integer, float, character, string , range,  date  , time,   datetime,   now

布尔值,    自然数,整数,  浮动,字符,   字符串, 范围,日期,时间,日期时间,现在

图像

image, dataImage

图像,生成一段随机的 Base64 图片编码(这个用定义数据接口是会报错的,用不了)

颜色 color
文本

paragraph, sentence, word,   title,     cparagraph, csentence, cword, ctitle

   段落,     句子,    单词,   标题,   后面和前面的一样,后面加个 c 表示是中文

名字

first, last,  name, cfirst, clast, cname

 姓 ,   名 , 全名    ,加 c 为中文

网络

url, domain,  email,       ip,    tld

Url,域名,电子邮件,ip,顶级域名

地址

area, region

区域 , 地区

辅助

capitalize    : 把字符串的第一个字母转换为大写   

upper          : 把字符串转换为大写,

lower           : 为大写,

pick             : 从数组中随机选取一个元素,并返回

shuffle         : 打乱数组中元素的顺序,并返回

杂项

      guid    ,          id

全局唯一标示符,  id

 Random.方法的参数比较多,就不在这说了,而且官网说的也很明的Random.方法的参数

Random.extend 扩展(自定义随机数据)

这是官网的方法,但vue3的组合式API是没有this的,不过它this是Random,

var Random = Mock.Random
Random.extend({constellation: (conut) => {let constellations = ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座']//如果传参,并且是number值,就随机返回 conut 个值 if (conut !== undefined && Object.prototype.toString.call(conut) === '[object Number]') {let arr = []for (let i = 0; i < conut; i++) {let pickOn = Random.pick(constellations)constellations.splice(constellations.indexOf(pickOn),1)arr.push(pickOn)}return arr} else {return Random.pick(constellations)}}
})使用
let index = Mock.mock({url: "/index",method: "post",response: () => {return {"data": [{"arr": Random.constellation(2),//arr: ['双子座', '水瓶座']"arr1": Random.constellation(4),//arr1:['摩羯座', '射手座', '狮子座']"arr2": Random.constellation(),//arr2: "射手座"}]}}
})

返回的 pick 方法是在辅助类型上的,可以从中选一个,也可以自己写

不过我这分开定义的,它这 extend 在不同的文件用不了自定义和方法,真心觉得不用 extend 都行

自定义随机数据最好是使用方法一 : Random.constellation()  记得加(),这是方法,不是属性

因为方法二多多少少都有点问题,虽然还是在一些情况能用,但没必要太麻烦一个个试验

3.4、Mock.valid() 、Mock.toJSONSchema()

Mock.valid() 

校验真实数据 data 是否与数据模板 template 匹配。

template :表示数据模板,可以是对象或字符串。

data    :表示真实数据

…这个.怎么说呢,应该没人会用,有真实数据估计也没几个人用这个了

 Mock.toJSONSchema()

 Mock.toJSONSchema() ,

把 Mock.js 风格的数据模板 template 转换成 JSON Schema。

那可以忽略了,无聊可以去官网看下

 完成! ✨