如何使用MockJS自定义扩展方法
2021-11-30 本文已影响0人
Egbertbaron
在使用
mockjs.js
之前请确保已通过npm install mockjs
进行了安装。
讲解说明
其实定义扩展方式很容易,确切的来说主要是通过mockjs.js
中的Random.extend
方法进行自定义扩展方法。可以先看一下以下与Random.extend
相关的类型定义声明,有助于我们对扩展方法的构造和使用的理解:
declare namespace mockjs {
interface Mockjs {
Random: MockjsRandom;
}
interface MockjsRandomExtendOption {
[randomType: string]: (...args: any[]) => any;
}
// Mockjs.Random
// see https://github.com/nuysoft/Mock/wiki/Mock.Random
interface MockjsRandom
// Random.extend
extend(extendOption: MockjsRandomExtendOption): MockjsRandom;
}
以上就是Random.extend
方法的相关类型定义声明,由此可以得出Mockjs
只是通过Random.extend
方法将我们自定义的扩展(其实占位符和数据模板也如此)合并到Random
对象当中。
具体的扩展定义我们需要看MockjsRandomExtendOption
,然而通过上面的类型定义声明发现MockjsRandomExtendOption
只是一个key-value
对象,key
就是我们要定义的扩展方法的名称,value
就是名称所对应的要执行的函数。
代码案例
接下来我们举一个生成随机数量指定内容的列表的扩展方法的例子(也可以看官方案例),代码如下:
import Mock from "mockjs"
/**
* 生成随机数量指定内容的列表
*
* @param template 任意数据类型数据也可以是Mockjs数据模板
* @param min {?number} 最小数量
* @param max {?number} 最大数量
* @return {array} 返回随机数量指定内容的列表
*/
function dataListCallback(template, min, max) {
min = min === undefined ? 1 : min
max = max === undefined ? min : max
let len = Math.round(Math.random() * (max - min)) + min
let dataList, idx = new Array(len), 0
while (idx < len) {
dataList[idx++] = temmplate;
}
return dataList
}
// 扩展方法名称:`dataList` 通过Random.extend将扩展方法合并到Random中,方便我们可以直接通过Random使用扩展方法
Mock.Random.extend({
dataList: dataListCallback
})
使用方式如下代码:
import Mock from "mockjs"
// 生成固定数量元素的数组
Mock.Random.dataList("a", 1) // output: ["a"]
Mock.Random.dataList("a", 3) // output: ["a", "a", "a"]
// 生成最小值为 1 最大值为 3 的随机数的数量元素的数组
Mock.Random.dataList("a", 1, 3) // output: ["a"]
Mock.Random.dataList("a", 1, 3) // output: ["a", "a", "a"]
// 列表嵌套
Mock.Random.dataList(Mock.Random.dataList("a", 1), 2) // output: [["a"], ["a"]]
// 元素为字典
Mock.Random.dataList({1: 2}, 2) // output: [{1: 2}, {1: 2}]
// 使用Mockjs数据模板
Mock.Random.dataList({'number1|1-100.1-10': 1}, 2) // output: [{"number1": 12.92}, {"number1": 50}]
结语:
本人接触JavaScript不是太多,只是想记录一下知识点并分享给有同样问题的同学。如果有不正确的地方请在评论区指出:)。