mock.js模拟前后台交互


Posted in Javascript onJuly 25, 2019

本文实例为大家分享了mock.js模拟前后台交互的具体代码,供大家参考,具体内容如下

使用背景: vue项目 axios

使用详情:

1、首先安装

# 在项目中安装
 npm install mockjs

2、在项目中使用

在项目中src文件夹下 新建mock文件夹 新建mock.js 和index.js文件 这里面用来生成基础的接口
项目结构截图:

mock.js模拟前后台交互

数据
mock.js 文件

//-----------------mock.js-------------------
// 引入mockjs
import Mock from 'mockjs'

// 创建模拟数据 具体的数据生成方法 请查看文档http://mockjs.com/examples.html
function creatPostMock () {
 const list = []
 const mockdata = {
 id: '@increment', // 数据定义 @increment
 'object|1': {
 '310000': '上海市',
 '320000': '江苏省',
 '330000': '浙江省',
 '340000': '安徽省'
 },
 name: '@pick(["a", "e", "i", "o", "u"])',
 m1: '@integer(60, 100)',
 m2: '@integer(60, 100)',
 m3: '@integer(60, 100)',
 m4: '@integer(60, 100)',
 m5: '@integer(60, 100)',
 m6: '@integer(60, 100)',
 m7: '@integer(60, 100)',
 m8: '@integer(60, 100)',
 m9: '@integer(60, 100)'
 }
 for (var i = 0; i < 10; i++) {
 const a = Mock.mock(mockdata)
 list.push(a)
 }
 const data = {
 data: {},
 size: 1,
 pagesize: 10
 }
 data.data = list
 return data
}

// 创建模拟数据
function creatGetMock () {
 const getMock = Mock.mock({
 'list|1-10': [{
 'id|+1': 1
 }]
 })
 return getMock
}

// 将模拟好的数据输出出去;
export {creatPostMock, creatGetMock}

index.js 文件

// ------------index.js---------------
// 引入mockjs
import Mock from 'mockjs'
// 引入生成的模拟数据
import {creatPostMock, creatGetMock} from './mock'

// 设置请求延时时间
Mock.setup({
 // timeout: 2000 方式一 直接设置值
 timeout: '2000 - 5000' // 方式二 设置区间 注意这个是一个字符串形式
})

// 设置拦截的接口 格式请看文档 https://github.com/nuysoft/Mock/wiki/Mock.mock()
// 注意: 这里拦截的地址 最好使用正则匹配 如果直接使用字符串接口 就有可能拦截不到带参数的请求 报错404
Mock.mock(/\/api\/mock(|\?\S*)$/, 'post', creatPostMock)
// Mock.mock('/api/mock', 'get', creatGetMock) // 方式一
Mock.mock(/\/api\/mock(|\?\S*)$/, 'get', creatGetMock) // 方式二

然后在main.js 文件里面引入我们写好的mock/index.js文件 用于拦截请求

//------------------main.js-------------------
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios' // 引入axios
import('./mock/index') // 引入设置好基础的mock, 用于拦截请求

// 设置为 false 以阻止 vue 在启动时生成生产提示。
Vue.config.productionTip = false

// 在vue项目中 axios中无法直接使用vue.use() 所以将axios直接添加到Vue的原型上
Vue.prototype.axios = axios

/* eslint-disable no-new */
new Vue({
 el: '#app',
 router,
 components: { App },
 template: '<App/>'
})

接下来我们就可以定义api了 在api文件下 新建一个自定义接口文件 如questMock.js 里面是我们需要请求数据的模拟接口;

//-------------questMock.js----------------
// 引入axios
import axios from 'axios'
// 使用
this.axios = axios
// 封装的post
function postMockList (data) {
 return this.axios.post('/api/mock', {
 data
 })
}
// 封装的get
function getMockList (data) {
 return this.axios.get('/api/mock', {
 data
 })
}
// 输出
export { postMockList, getMockList }

最后在组件中使用

// ----------------------HelloWorld---------------------
<template>
 <div class="hello">
 <div class="mask" :class="{boxNone:isMask }"></div>
 <div>
 <p>这是获取mock 数据</p>
 <button @click="getMockData">get模拟数据</button>
 <button @click="postMockData">post模拟数据</button>
 </div>
 </div>
</template>

<script>
import { postMockList, getMockList } from '../api/questMock.js'
export default {
 name: 'HelloWorld',
 data () {
 return {
 msg: '模拟前后台交互',
 getMock: getMockList,
 postMock: postMockList,
 isMask: true
 }
 },
 methods: {
 getMockData () {
 this.isMask = false
 this.getMock({
 params: {
  name: '隔壁老王'
 }
 }).then(res => {
 this.isMask = true
 console.log('GET模拟数据', res)
 }).catch(e => {
 console.log('错误', e)
 })
 },
 postMockData () {
 this.isMask = false
 this.postMock({
 name: 'xiaoming',
 age: '5'
 }).then(res => {
 this.isMask = true
 console.log('POST模拟数据', res)
 }).catch(e => {
 console.log('错误', e)
 })
 }
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
 font-weight: normal;
}
ul {
 list-style-type: none;
 padding: 0;
}
li {
 display: inline-block;
 margin: 0 10px;
}
a {
 color: #42b983;
}
.mask {
 position: fixed;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 z-index: 1000;
 background-color: green;
 opacity: 0.5;
}
.mask.boxNone {
 display: none;
}
</style>

遇到的问题

1、在设置模拟接口时 使用get请求 发现报错404 后来查资料发现是因为直接使用字符串接口会导致mockjs 拦截不到地址 解决办法就是使用 正则去匹配请求接口
2、如何设置请求延时 由于mockjs 是在本地模拟数据所以并未发起真正的请求,无法看到请求的加载效果,解决办法就是使用Mock.setup({timeout: 加载时间}) 来设置每次的模拟请求时间
也可参考以下:

服务器端数据模拟,支持请求转发、返回JSON静态数据、返回JS可变数据 .

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

Javascript 相关文章推荐
flash javascript之间的通讯方法小结
Dec 20 Javascript
修改jQuery Validation里默认的验证方法
Feb 14 Javascript
js sort 二维数组排序的用法小结
Jan 24 Javascript
js函数名与form表单元素同名冲突的问题
Mar 07 Javascript
node.js中的fs.readdirSync方法使用说明
Dec 17 Javascript
jQuery无刷新分页完整实例代码
Oct 27 Javascript
浅谈使用MVC模式进行JavaScript程序开发
Nov 10 Javascript
Google Maps基础及实例解析
Aug 06 Javascript
URL中“#” “?” &amp;“”号的作用浅析
Feb 04 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
Jul 29 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
解决Vue打包后访问图片/图标不显示的问题
Jul 25 #Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
Jul 25 #Javascript
vue使用代理解决请求跨域问题详解
Jul 24 #Javascript
Vue父组件如何获取子组件中的变量
Jul 24 #Javascript
mock.js模拟数据实现前后端分离
Jul 24 #Javascript
vue+mock.js实现前后端分离
Jul 24 #Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
Jul 24 #Javascript
You might like
PHP之变量、常量学习笔记
2008/03/27 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
PHP反射实际应用示例
2019/04/03 PHP
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
原生js二级联动效果
2017/06/20 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
Python实现list反转实例汇总
2014/11/11 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
C#软件工程师英语面试题
2015/06/07 面试题
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
驾驶员岗位职责
2014/01/29 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
JavaScript 定时器详情
2021/11/11 Javascript