关于模拟数据,这里使用Mock.js
这个库,关于用法,官网说的也比较详细,这里我就简单的带一下。html
咱们先将项目中src/components/HelloWorld.vue
删除,将src/router/index.js
做以下修改:vue
import Vue from 'vue' import Router from 'vue-router' import Index from '@/views/vacation/' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'Index', component: Index } ] })
而后,在src/views/vacation/
创建index.vue
:ios
<template> <div>list view</div> </template>
在手机模式下,显示效果以下:git
在项目根目录下,使用命令行npm i -D mockjs
;github
新建src/mock/list.js
:web
import { mock, Random } from "mockjs"; export default mock({ 'list|0-50': [ { 'approveId': '@id', 'applier': { 'userId': '@guid', 'userName': '@cname', 'sectionId': '@id', 'sectionName': '@ctitle', } ... } ] })
'@id'
(称为“占位符”)是Random.id()
的简写形式;'@id'
(称为“占位符”)必须使用引号包裹;'@id' + 111
会是将'@id'
看成字符串(返回'@id111'
),不等于Random.id() + 111
;新建src/mock/index.js
:正则表达式
Mock.js
拦截请求地址:vue-router
import { mock, Random } from "mockjs"; import List from "./list"; mock('\/','get',()=> List);
Mock.mock( rurl?, rtype?, function( options ) )
拦截路由请求的/
路径,返回模拟的List
列表。rurl
:拦截路径规则,能够是字符串'/'
,也能够是一个正则表达式/\//
。vuex
/?id="1"
,mock
的拦截路径能够写成Mock.mock(/\/?id=\"\d\"/,'get',()=>List)
;id
的数据,则须要本身截取url
字符串做判断了;rtype
:拦截请求类型,get
或post
;function(options)
:回调函数,拦截成功后的处理逻辑;chrome
optioins = {url, type, body}
;url
为请求地址;type
为请求类型;body
为请求时传入的数据(只在post
请求时有用);这里,咱们使用vuex
做状态管理,axios
请求数据:npm i -S vuex axios
;
新建src/store/index.js
:
import Vue from 'vue'; import Vuex from 'vuex'; import axios from 'axios'; Vue.use(Vuex); const $setApplications = 'SETAPPLICATIONS'; export default new Vuex.Store({ state: { applications: null, }, mutations: { [$setApplications]: (state, list) => state.applications = list, }, actions: { requestApplications({ commit, state }) { axios.get('/') .then(({data:{list}}) => { commit($setApplications, list); }) .catch(() => { console.log(arguments); }) } } })
state
保存整个项目公用的状态,mutations
进行同步数据处理,actions
处理异步请求。mutations
是惟一修改state
的入口,actions
要想修改state
,须要内部调用一下mutations
;在项目程序中,经过this.$store.commit('SETAPPLICATIONS',null)
修改state
的值。
在项目中,经过this.$store.dispatch('requestApplications')
调用一个异步请求。
目前,经过以上步骤,咱们独立的构建了模拟数据和状态管理,但尚未将它们结合起来。
src/main.js
中添加import './mock'
、import store from './store'
,且修改:
new Vue({ el: '#app', router, store, components: { App }, template: '<App/>' })
结束了?
尚未,咱们还要获取数据:
在src/views/vacation/index.vue
中添加:
<script> export default { beforeCreate(){ this.$store.dispatch('requestApplications'); } } </script>
触发请求。
若是想了解Mock.js
的用法,推荐看官网的"文档"页,而不是"示例"页。
Mock.js
返回的数据格式都是对象,若是想获取其它格式(如数组...)须要本身另辟蹊径了。
格式:
Mock.mock({ // 初始化对象,也是输出的对象; })
语法规范:
数据模板中的每一个属性由 3 部分构成:属性名、生成规则、属性值:// 属性名 name
// 生成规则 rule
// 属性值 value
'name|rule': value
属性名 和 生成规则 之间用竖线 | 分隔(千万不要带空格吖,不然,你的属性名可能会包含空格)。
生成规则 是可选的。
生成规则 有 7 种格式:
'name|min-max': value
'name|count': value
'name|min-max.dmin-dmax': value
'name|min-max.dcount': value
'name|count.dmin-dmax': value
'name|count.dcount': value
'name|+step': value
生成规则 的 含义 须要依赖 属性值的类型 才能肯定。
属性值 中能够含有 @占位符。
属性值 还指定了最终值的初始值和类型。
若是你想验证写出来的模拟数据是否正确,能够在“示例”页打开控制台,直接运行。
Mock.mock({ 'list|1-10':[ Random.id(), ] })
$vm0
指向某一组件实例,该实例必须打开控制台的Vue
Tab页,点击某一组件时才能获取到,不然,汇报$vm0未定义
。$vm0
指向哪一个组件,才能获取到该组件上的属性。Mock.js
拦截请求呢,如何得到请求时的数据呢?axios
请求数据呢,它和mutations
有何区别?Vue
项目中使用呢?