让前端攻城师独立于后端进行开发: Mock.js

Mock.js

一.Mock.js是什么?

目前的大部分公司的项目都是采用的先后端分离, 后端接口的开发和前端人员是同时进行的. 那么这个时候就会存在一个问题, 在页面须要使用大量数据进行渲染生成前, 后端开发人员的接口也许并无写完, 做为前端的咱们也就没有办法获取数据. 因此 前端工程师就须要本身按照接口文档模拟后端人员提供的数据, 以此进行页面的开发. javascript

这个时候, Mock.js的做用就体现出来了, 在数据量较大的状况下, 咱们不用一个一个的编写数据, 只须要根据接口文档将数据的格式填入, Mock.js就可以自动的按需生成大量的模拟数据. 且Mock.js提供了大量的数据类型, 包括文本, 数字, 布尔值, 日期, 邮箱, 连接, 图片, 颜色等.前端

本文就简单的介绍一下Mock.js提供的语法, 并介绍一下我平时在项目中是如何使用Mock.js去更方便的进行开发的.vue

二. 下载和引入Mock.js

1. 下载Mock.js

Mock.js提供多种下载方式, 本文以目前国内最经常使用的npm举例, 只须要在命令行输入npm install mockjs
便可完成Mock.js的下载.java

2. 引入Mock.js

Mock.js暴露了一个全局的Mock对象, 咱们只须要将Mock对象引入到文件中, 调用Mock对象的方法便可jquery

  • CommonJS的引入方式
//CommonJS引入
let Mock = require('mockjs)

//调用Mock.mock()方法模拟数据
let data = Mock.mock({
'list|1-10': [{
  'id|+1': 1
}]
});
console.log(data);
  • ES6的引入方式
//ES6的引入方式
import Mock from 'mockjs'

let data = Mock.mock({
'list|1-10': [{
  'id|+1': 1
}]
});
console.log(data);

三.Mock.js的简单语法

Mock对象提供了4个方法, 分别是Mock.mock(), Mock.setup(), Mock.valid, Mock.toJSONSchema(), 一个工具库Mock.Random. 其中咱们常常使用到的就是Mock.mock()Mock.Random.ios

1. Mock.js的规范

第二部分引入Mock.js的代码中的如下部分就能够体现Mock.js的语法规范git

'list|1-10': [{
  'id|+1': 1
}]

上面的代码被称为数据模板, 用于告诉Mock.js生成什么样的数据, 其中数据模板中的每一个属性由三部分构成: 属性名, 生成规则, 属性值:github

  • list为数据模板中的属性名;
  • 1-10为生成规则(表示生成最少1个, 最多10个重复数据)
  • [{'id|+1': 1}]是属性值, 属性值中能够嵌套使用属性名和生成规则.
具体的生成规则参见: https://github.com/nuysoft/Mo...

2. Mock.mock()

Mock.mock()方法是用来根据数据模板生成模拟数据, 我经常使用到的是如下两种传参方式:ajax

  • Mock.mock(template): 根据数据模板template生成模拟数据
let data = Mock.mock({
data: {
  'products|10-20': [{
    name: '手机',
    price: 1000
  }]
}
})
console.log(data);
  • Mock.mock(url, template): 拦截请求地址为url的ajax请求, 并根据数据模板template生成模拟数据
let data = Mock.mock('api/products' , {
data: {
  'products|10-20': [{
    name: '手机',
    price: 1000
  }]
}
})

//使用jquery Ajax发送请求
$.ajax({
  url: 'api/products',
  type: 'GET',
  success: function(res) {
    console.log(res);
  }
})

3. Mock.Random

Mock.Random是Mock.js提供一个工具类, 用于生成经常使用的几种数据.vuex

  • 生成布尔值
//使用@占位符的方式
 let data = Mock.mock({
    data: {
      boolean: '@boolean'
    }
  })
  console.log(data);
  
//使用Mock.Random调用函数的方式
  let data = Mock.mock({
    data: {
      boolean: Mock.Random.boolean()
    }
  })
  console.log(data);
  • 生成日期
let data = Mock.mock({
    data: {
      date: Mock.Random.date('yyyy-MM-dd')
    }
  })
  console.log(data);
Mock.js支持丰富的日期格式的自定义: https://github.com/nuysoft/Mo...
  • 生成图片
let data = Mock.mock({
    data: {
    //用于生成高度自定义的图片地址
      imgURL: Mock.Random.image()
    }
  })
  console.log(data);
  • 生成名字
let data = Mock.mock({
    data: {
      //生成一个英文名字
      name: Mock.Random.name(),
      //生成一个中文名字
      chineseName: Mock.Random.cname()
    }
  })
  console.log(data);
更多Mock.Random工具库提供的数据: https://github.com/nuysoft/Mo...

四.在Vue项目中使用Mock.js

以模拟一个登录接口的数据为例:

1. 单独写一个mockData.js文件做为虚拟数据的生成文件.

//mockData.js

import Mock from 'mockjs'

let Random = Mock.Random;


//用户登录信息
let userInfo = Mock.mock({
  data: {
    responseCode: 200,
    responseMessage: 'success',
    userMessage: {
      email: Random.email(),
      'id|1-10': 1,
      realName: Random.cname(),
      roleCodes: 'admin',
      username: Random.first()
    }
  }
})



let mockData = {
  userInfo: userInfo
}

export default mockData;

2. 使用vuex去控制是否使用mock.js的数据

// src/store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './actions'

Vue.use(Vuex);

const state = {
  //使用模拟数据, 只是开发时使用, 若是不是开发时, 请务必设置为false
  useMock: true
}

export default new Vuex.Store({
  state,
  mutations,
  actions
})

3. 在Login.vue中去实现请求登录方法

//Login.vue

import mockData from '../utils/mockData.js'

exwport default {
  ...
  
  methods: {
    fetchUserInfo() {
      //若是vuex中userMock为true
      if (this.$store.state.useMock) {
        //使用延时器模拟异步
        window.setTimeout(() => {
          let res = mockData.userInfo;
          //业务逻辑
        }, 1000);
        return;
      }
      
      //若是vuex中userMock为false
      this.$axios.post('api/login', params).then(res => {
        //业务逻辑
      });
    }
  }
}

能够看出在Login.vue的fetchUserInfo()方法中, 若是userMocktrue, 将使用的是mock.js中的模拟数据; 若是useMockfalse, 使用的是经过Ajax请求的数据. 这么写的好处是, 你只须要在vuex中修改一下, 就能够控制全部请求接口函数中是使用Ajax请求数据, 仍是使用模拟数据. 这样在进行和后台联调的时候, 就能够自由的切换数据了!

参考连接

  1. Mock.js官网: http://mockjs.com/
相关文章
相关标签/搜索