在Vue中使用mockjs代码实例


Posted in Vue.js onNovember 25, 2020

前言

前后端分离的开发模式,前端需要向后端请求数据(ajax请求),但实际开发过程中,前后端会约定一份接口文档,但前后端开发进度并不一致,当后端没有完善接口功能时,前端需要在本地模拟数据返回,此时需要使用到mockjs。

安装

npm install mockjs --save-dev

目录结构

在Vue中使用mockjs代码实例

配置

1、api下的config.js:配置axios的拦截处理

import axios from 'axios'

// 创建一个axios实例
const service = axios.create({
  //请求超时配置
  timeout:3000
})
//添加请求拦截器
service.interceptors.request.use(
  config => {
    return config
  },
  err => {
    console.log(err)
  }
)
//添加响应拦截器
service.interceptors.response.use(
  response => {
    let res = {}
    res.status = response.status
    res.data = response.data
    return res
  },
  err => {
    console.log(err)
  }
)

export default service

另外一个应用场景,劫持请求,获取token,为请求添加token:

// 请求拦截器
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('userToken');
  if (token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
   config.headers.accessToken = token;
  }
  return config;
 }, 
 error => {
  return Promise.reject(error);
 })

2、mock目录下index.js

import Mock from 'mockjs'
import homeApi from './home'
import userApi from './user'


// 设置200-2000毫秒延时请求数据
// Mock.setup({
//  timeout: '200-2000'
// })

// 首页相关
// 拦截的是 /home/getData
Mock.mock(/\/home\/getData/, 'get', homeApi.getStatisticalData)

// 用户相关
Mock.mock(/\/user\/getUser/, 'get', userApi.getUserList)
Mock.mock(/\/user\/del/, 'get', userApi.deleteUser)
Mock.mock(/\/user\/batchremove/, 'get', userApi.batchremove)
Mock.mock(/\/user\/add/, 'post', userApi.createUser)
Mock.mock(/\/user\/edit/, 'post', userApi.updateUser)
Mock.mock(/\/home\/getData/, 'get', homeApi.getStatisticalData)
import Mock from 'mockjs'

// 图表数据
let List = []
export default {
 getStatisticalData: () => {
  for (let i = 0; i < 7; i++) {
   List.push(
    Mock.mock({
     vue: Mock.Random.float(100, 8000, 0, 2),
     wechat: Mock.Random.float(100, 8000, 0, 2),
     ES6: Mock.Random.float(100, 8000, 0, 2),
     Redis: Mock.Random.float(100, 8000, 0, 2),
     React: Mock.Random.float(100, 8000, 0, 2),
     springboot: Mock.Random.float(100, 8000, 0, 2)
    })
   )
  }
  return {
   code: 20000,
   data: {
    // 饼图
    videoData: [
     {
      name: 'springboot',
      value: Mock.Random.float(1000, 10000, 0, 2)
     },
     {
      name: 'vue',
      value: Mock.Random.float(1000, 10000, 0, 2)
     },
     {
      name: '小程序',
      value: Mock.Random.float(1000, 10000, 0, 2)
     },
     {
      name: 'ES6',
      value: Mock.Random.float(1000, 10000, 0, 2)
     },
     {
      name: 'Redis',
      value: Mock.Random.float(1000, 10000, 0, 2)
     },
     {
      name: 'React',
      value: Mock.Random.float(1000, 10000, 0, 2)
     }
    ],
    // 柱状图
    userData: [
     {
      date: '周一',
      new: Mock.Random.integer(1, 100),
      active: Mock.Random.integer(100, 1000)
     },
     {
      date: '周二',
      new: Mock.Random.integer(1, 100),
      active: Mock.Random.integer(100, 1000)
     },
     {
      date: '周三',
      new: Mock.Random.integer(1, 100),
      active: Mock.Random.integer(100, 1000)
     },
     {
      date: '周四',
      new: Mock.Random.integer(1, 100),
      active: Mock.Random.integer(100, 1000)
     },
     {
      date: '周五',
      new: Mock.Random.integer(1, 100),
      active: Mock.Random.integer(100, 1000)
     },
     {
      date: '周六',
      new: Mock.Random.integer(1, 100),
      active: Mock.Random.integer(100, 1000)
     },
     {
      date: '周日',
      new: Mock.Random.integer(1, 100),
      active: Mock.Random.integer(100, 1000)
     }
    ],
    // 折线图
    orderData: {
     date: ['20191001', '20191002', '20191003', '20191004', '20191005', '20191006', '20191007'],
     data: List
    },
    tableData: [
     {
      name: 'ES6',
      todayBuy: Mock.Random.float(100, 1000, 0, 2),
      monthBuy: Mock.Random.float(3000, 5000, 0, 2),
      totalBuy: Mock.Random.float(40000, 1000000, 0, 2)
     },
     {
      name: '小程序',
      todayBuy: Mock.Random.float(100, 1000, 0, 2),
      monthBuy: Mock.Random.float(3000, 5000, 0, 2),
      totalBuy: Mock.Random.float(40000, 1000000, 0, 2)
     },
     {
      name: 'Vue',
      todayBuy: Mock.Random.float(100, 1000, 0, 2),
      monthBuy: Mock.Random.float(3000, 5000, 0, 2),
      totalBuy: Mock.Random.float(40000, 1000000, 0, 2)
     },
     {
      name: 'springboot',
      todayBuy: Mock.Random.float(100, 1000, 0, 2),
      monthBuy: Mock.Random.float(3000, 5000, 0, 2),
      totalBuy: Mock.Random.float(40000, 1000000, 0, 2)
     },
     {
      name: 'React',
      todayBuy: Mock.Random.float(100, 1000, 0, 2),
      monthBuy: Mock.Random.float(3000, 5000, 0, 2),
      totalBuy: Mock.Random.float(40000, 1000000, 0, 2)
     },
     {
      name: 'Redis',
      todayBuy: Mock.Random.float(100, 1000, 0, 2),
      monthBuy: Mock.Random.float(3000, 5000, 0, 2),
      totalBuy: Mock.Random.float(40000, 1000000, 0, 2)
     }
    ]
   }
  }
 }
}

home.js
import Mock from 'mockjs'

// get请求从config.url获取参数,post从config.body中获取参数
function param2Obj(url) {
 const search = url.split('?')[1]
 if (!search) {
  return {}
 }
 return JSON.parse(
  '{"' +
   decodeURIComponent(search)
    .replace(/"/g, '\\"')
    .replace(/&/g, '","')
    .replace(/=/g, '":"') +
   '"}'
 )
}
let List = []
const count = 200
for (let i = 0; i < count; i++) {
 List.push(
  Mock.mock({
   id: Mock.Random.guid(),
   name: Mock.Random.cname(),
   addr: Mock.mock('@county(true)'),
   'age|18-60': 1,
   birth: Mock.Random.date(),
   sex: Mock.Random.integer(0, 1)
  })
 )
}

export default {
 /**
  * 获取列表
  * 要带参数 name, page, limt; name可以不填, page,limit有默认值。
  * @param name, page, limit
  * @return {{code: number, count: number, data: *[]}}
  */
 getUserList: config => {
  const { name, page = 1, limit = 20 } = param2Obj(config.url)
  console.log('name:' + name, 'page:' + page, '分页大小limit:' + limit)
  const mockList = List.filter(user => {
   if (name && user.name.indexOf(name) === -1 && user.addr.indexOf(name) === -1) return false
   return true
  })
  const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1))
  return {
   code: 20000,
   count: mockList.length,
   list: pageList
  }
 },
 /**
  * 增加用户
  * @param name, addr, age, birth, sex
  * @return {{code: number, data: {message: string}}}
  */
 createUser: config => {
  const { name, addr, age, birth, sex } = JSON.parse(config.body)
  console.log(JSON.parse(config.body))
  List.unshift({
   id: Mock.Random.guid(),
   name: name,
   addr: addr,
   age: age,
   birth: birth,
   sex: sex
  })
  return {
   code: 20000,
   data: {
    message: '添加成功'
   }
  }
 },
 /**
  * 删除用户
  * @param id
  * @return {*}
  */
 deleteUser: config => {
  const { id } = param2Obj(config.url)
  if (!id) {
   return {
    code: -999,
    message: '参数不正确'
   }
  } else {
   List = List.filter(u => u.id !== id)
   return {
    code: 20000,
    message: '删除成功'
   }
  }
 },
 /**
  * 批量删除
  * @param config
  * @return {{code: number, data: {message: string}}}
  */
 batchremove: config => {
  let { ids } = param2Obj(config.url)
  ids = ids.split(',')
  List = List.filter(u => !ids.includes(u.id))
  return {
   code: 20000,
   data: {
    message: '批量删除成功'
   }
  }
 },
 /**
  * 修改用户
  * @param id, name, addr, age, birth, sex
  * @return {{code: number, data: {message: string}}}
  */
 updateUser: config => {
  const { id, name, addr, age, birth, sex } = JSON.parse(config.body)
  const sex_num = parseInt(sex)
  List.some(u => {
   if (u.id === id) {
    u.name = name
    u.addr = addr
    u.age = age
    u.birth = birth
    u.sex = sex_num
    return true
   }
  })
  return {
   code: 20000,
   data: {
    message: '编辑成功'
   }
  }
 }
}

user.js

mockjs

Mock.mock( rurl, rtype, function( options ) )
Mock.mock( rurl, rtype, template )
表示当拦截到rurl和rtype的ajax请求时,将根据数据模板template生成模拟数据,并作为响应数据返回。

Mock.mock( rurl, rtype, function( options ) )
记录用于生成响应数据的函数。当拦截到匹配 rurl 和 rtype 的 Ajax 请求时,函数 function(options) 将被执行,并把执行结果作为响应数据返回。
其中:
rurl 可选
表示要拦截的url,可以使字符串,也可以是正则
rtype 可选
表示要拦截的ajax请求方式,如get、post
template 可选
数据模板,可以是对象也可以是字符串
function(option) 可选
表示用于生成响应数据的函数

3.main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
//全局配置
import http from '@/api/config'
import './mock'

//第三方包

Vue.prototype.$http = http
Vue.config.productionTip = false

new Vue({
 router,
 store,
 render: h => h(App)
}).$mount('#app')

4、组件中的方法如何使用:

this.$http.get('/home/getData').then(res => {
    //
   })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
Vue实现图书管理小案例
Dec 03 Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 Vue.js
vue中如何添加百度统计代码
Dec 19 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
vue watch监控对象的简单方法示例
Jan 07 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
Vue实现todo应用的示例
Feb 20 Vue.js
使用vue-element-admin框架从后端动态获取菜单功能的实现
Apr 29 Vue.js
Vue和Flask通信的实现
May 19 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
Vue3配置axios跨域实现过程解析
Nov 25 #Vue.js
Vue使用Element实现增删改查+打包的步骤
Nov 25 #Vue.js
vue + el-form 实现的多层循环表单验证
Nov 25 #Vue.js
vue打开其他项目页面并传入数据详解
Nov 25 #Vue.js
Vue开发中常见的套路和技巧总结
Nov 24 #Vue.js
浅析VUE防抖与节流
Nov 24 #Vue.js
解决vue页面刷新,数据丢失的问题
Nov 24 #Vue.js
You might like
php 设计模式之 单例模式
2008/12/19 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
原生js实现放大镜
2017/02/20 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
Python中使用asyncio 封装文件读写
2016/09/11 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
python3爬虫怎样构建请求header
2018/12/23 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
《阳光》教学反思
2014/02/23 职场文书
十佳党员事迹材料
2014/08/28 职场文书
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis