vue+mockjs+axios 模拟请求数据-复杂版
vue+mockjs+axios 模拟请求数据-复杂版
基础知识
-
npm 安装 vue-cli 脚手架后,通过命令“ vue init webpack 项目名 ”来创建项目;
-
了解 mockjs:可以拦截 Ajax 请求,返回模拟的响应数据,实现前后端分离;
-
了解 axios: 基于http客户端的promise,面向浏览器和nodejs。
axios特色
- 浏览器端发起XMLHttpRequests请求
- node端发起http请求
- 支持Promise API
- 拦截请求和返回
- 转化请求和返回(数据)
- 取消请求
- 自动转化json数据
- 客户端支持抵御XSRF(跨站请求伪造)
vue项目初始化
vue init webpack Vue-ProjectName
npm install
# serve with hot reload at localhost:8080
npm run dev
安装 mockjs 和 axios
npm install mockjs --save-dev
npm install axios --save-dev
在项目中引用mockjs+axios模拟数据
文件目录结构:
- src
- api
- feedback.js
- project_classify.js
- components
- HelloWorld.vue
- mock
- index.js
- feedback.js
- project_classify.js
- utils
- fetch.js
- main.js
- api
Mock.mock
新建 src/mock/index.js
import Mock from 'mockjs';
import feedbackApi from './feedback.js';
// import projectClassifyApi from './project_classify.js';
Mock.mock(/\/feedback/, 'post', feedbackApi.getFeedback);
// Mock.mock(/\/project_classify/, 'get', projectClassifyApi.getProjectClassify);
export default Mock;
新建 src/mock/feedback.js
import Mock from 'mockjs';
export default {
getFeedback: () => ({
title: '我是feedback标题',
content: '我是feedback内容'
})
};
main.js 引入 ‘./mock/index’
src/main.js 新增如下内容
import './mock/index';
创建axios实例、请求拦截器、响应拦截器
新建 src/utils/fetch.js
import axios from 'axios';
import vue from 'vue';
const baseUrl = 'http://localhost:8080';
// 创建axios实例
const HTTP = axios.create({
baseURL: baseUrl,
timeout: 5000,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
// 请求拦截器
HTTP.interceptors.request.use(function(config) {
return config;
}, function(error) {
return Promise.reject(error);
});
// 响应拦截器
HTTP.interceptors.response.use(function(response) {
return response;
}, function(error) {
return Promise.reject(error);
});
export default HTTP;
创建请求api方法
新建 src/api/feedback.js
import HTTP from '../utils/fetch';
export function getFeedback() {
return HTTP({
url: '/feedback',
method: 'post'
})
}
组件中模拟使用请求-use
<template>
<div class="hello">
<h1></h1>
</div>
</template>
<script>
import { getFeedback } from '../api/feedback';
// import { getProjectClassify } from '../api/project_classify';
export default {
name: 'HelloWorld',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
},
created() {
getFeedback().then((res) => {
console.log(res);
})
.catch(error => console.log(error));
// getProjectClassify().then((res) => {
// console.log(res.data);
// })
}
}
</script>
<style scoped>
</style>
在浏览器中看到打印出的res
一般我们需要使用到 res.data ,获取返回的数据
如何再次add一个请求接口
- 新增 mock/project_classify.js,并加入 mock/index.js 中
- 新增 api/project_classify.js, 然后就能在组件中愉快的使用了
mock/project_classify.js
import Mock from 'mockjs';
export default {
getProjectClassify: () => (
[
"consumer electronics",
"private jet",
"fintech"
]
)
};
api/project_classify.js
import HTTP from '../utils/fetch';
export function getProjectClassify() {
return HTTP({
url: '/project_classify',
method: 'get'
});
}
mockjs深入学习
mockjs生成随机对象
src/mock/feecback.js
import Mock from 'mockjs';
var Random = Mock.Random;
export default {
getFeedback: () => ({
chinese_name: Mock.mock('@cname'),
english_name: Mock.mock('@name'),
number: Mock.mock('@integer(1, 100)'),
string: Mock.mock({
"string|1-10": "★"
}),
date: Mock.mock('@date("yyyy-MM-dd")'),
time: Mock.mock('@time("HH:mm:ss")'),
email: Random.email()
})
};
浏览器控制台随机打印出来的结果:
{
chinese_name: "周超",
date: "2012-06-28",
english_name: "Timothy Rodriguez",
number: 63,
string: {string: "★★★★★"},
time: "01:34:48",
email: 'd.ipmkjj@xdbl.sa'
}
mockjs生成随机数组
src/mock/feecback.js
import Mock from 'mockjs';
const List = [];
const count = 10;
for(let i = 0; i < count; i++) {
List.push(Mock.mock({
id: '@id',
title: '@ctitle(10, 20)',
'status|1': ['published', 'draft'],
author: '@cname',
display_time: '@datetime',
pageviews: '@integer(300, 5000)'
}))
}
export default {
getFeedback: () => List
};
更多例子请查看http://mockjs.com/examples.html
more
- http://mockjs.com/
- https://github.com/axios/axios
- 完整项目请看 github, 项目 v-mockjs-axios-complex