首頁 > 軟體

在react中使用mockjs的方法你知道嗎

2022-03-10 13:00:46

介紹

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)
// 這裡面的xxx就是要通過mock來模擬的資料

每個被偽造的資料,都包含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種生成規則

'name|min-max': value

// 表示value值重複的次數,最少min次,最多max次
const data = Mock.mock({
    'list|1-5': ['hello-']
})
// 得到的結果可能是:
[
    "hello-",
    "hello-",
    "hello-",
    "hello-",
    "hello-"
]
// 也可能是:
[
    "hello-",
    "hello-",
    "hello-"
]
// hello-隨機重複1-5次作為結果

'name|count': value

// value固定重複count次
const data = Mock.mock({
    'list|2': ['hello-']
})
// 得到的結果是:
[
    "hello-",
    "hello-"
]

'name|min-max.dmin-dmax': value

// 當value 是數位型時,生成一個浮點數,
// 浮點數的整數部分大於等於 min、小於等於 max,小數部分保留 dmin 到 dmax 位。
// 生成的值和初始寫的value值的大小無關,value的初始值只是用來確定資料型別
const data = Mock.mock({
    'num1|1-100.1-3': 1
})

生成的結果可能是:

也可能是:

'name|min-max.dcount': value

// 當value 是數位型時,生成一個浮點數,
// 浮點數的整數部分大於等於 min、小於等於 max,小數部分保留dcount位。
// 生成的值和初始寫的value值的大小無關,value的初始值只是用來確定資料型別

'name|count.dmin-dmax': value

// 當value 是數位型時,生成一個浮點數,
// 浮點數的整數部分等於count,小數部分保留 dmin 到 dmax 位。
// 生成的值和初始寫的value值的大小無關,value的初始值只是用來確定資料型別

'name|count.dcount': value

// 當value 是數位型時,生成一個浮點數,
// 浮點數的整數部分是count,小數部分保留dcount位。
// 生成的值和初始寫的value值的大小無關,value的初始值只是用來確定資料型別

'name|+step': value

// 當value為數位時,初始值為value,每次得到的結果會自增1

生成規則和屬性值value的關係

屬性值是布林值

'name|1': value
// 當value是true或者false時
// 最終結果會返回一個布林值,返回true的概率是1/2,返回false的概率也是1/2
'name|min-max': value
// 當value是一個表示布林值的結果時,
// 會隨機生成一個布林值,值為 value 的概率是 min / (min + max),
// 值為 !value 的概率是 max / (min + max)

屬性值是物件 Object

'name|count': object
// 從屬性值 object 中隨機選取 count 個屬性
'name|min-max': object
// 從屬性值 object 中隨機選取 min 到 max 個屬性

屬性值是陣列 Array

'name|1': array
// 從屬性值 array 中隨機選取 1 個元素,作為最終值。
'name|+1': array
// 從屬性值 array 中順序選取 1 個元素,作為最終值。
'name|min-max': array
// 通過重複屬性值 array 生成一個新陣列,重複次數大於等於 min,小於等於 max。
// 'name|count': array
通過重複屬性值 array 生成一個新陣列,重複次數為 count。

屬性值是正規表示式 RegExp

// 根據正規表示式 regexp 反向生成可以匹配它的字串。用於生成自定義格式的字串
Mock.mock({
    'regexp1': /[a-z][A-Z][0-9]/,
    'regexp2': /wWsSdD/,
    '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()
// 結果:
// data: 趙麗

改成預留位置的方法就是:

const data = Mock.mock('@cname')
// 結果:
// data:  張秀蘭

這裡的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)',//百分之百的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)', //一個整形陣列,步長為2
    }]
});
// console.log(basicData);
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()', //指示生成的時間字串的格式, default: 'HH: mm: ss',
        '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")' //獲取當前完整時間
    }]
});
// console.log(Date);
let imageList = Mock.mock({
    'imageList|5': [{
        'id|+1': 1,
        'img': '@image',//生成一個隨機的圖片地址,
        'img-1': '@image("200x100", "#000", "#fff", "png", "Mock.js")', //生成一個200*100, 背景色#000,前景色#fff, 格式png, 文字mock.js的圖片
    }]
})
// console.log(imageList);
let paragraph = Mock.mock({
    'paragraphList|5': [{
        'id|+1': 1,
        'paragraph1': '@cparagraph(2)', //生成一段2句話的中文文字,
        'paragraph2': '@paragraph(3)', //生成一個3句話的英文文字
        'title': '@title', //隨機生成一個英文標題
        'ctitle': '@ctitle', //隨機生成一箇中文標題
    }]
})
// console.log(paragraph);
let name = Mock.mock({
    'nameList|5': [{
        'id|+1': 1,
        'name': '@name', //英文名,
        'cname': '@cname', //中文名
    }]
})
// console.log(name);
let webList = Mock.mock({
    'webList|5': [{
        'id|+1': 0,
        'url': '@url("http", "baidu.com")', //url: http://www.baidu.com
        'protocol': '@protocol', //隨機生成一個url協定
        'domain': '@domain', //隨機生成一個域名,
        'email': '@email', //隨機生成一個郵箱地址,
        'ip': '@ip' //隨機生成一個ip地址
    }]
})
// console.log(webList);
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

返回的結果:

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!     


IT145.com E-mail:sddin#qq.com