import Vue from 'vue'
import Vuex from 'vuex'
import user from './user'
Vue.use(Vuex)
const store = new Vuex.Store({
strict: process.env.NODE_ENV !== 'production', // 非生产环境下使用严格模式
modules: { user }
})
export default store
解读一下上面的代码:
export 的 store 里存储的 state 是 vue 给我们提供的单一状态树,store 这个唯一实例将作为我们项目中唯一的数据源, 请阅读State 单一状态树
store 内有个 user 模块(module)。在 user 模块中拥有自己的 state、mutation、action、getter,见1.4中的代码。
Vuex 是一个专为
Vue.js
应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex
可以帮助我们管理共享状态,并附带了更多的概念和框架,适合大中型应用,简单的应用建议就不要使用它了Mock.js 可以生成随机数据,拦截
Ajax
请求,让前端攻城师独立于后端进行开发。通过随机数据,模拟各种场景。不需要修改既有代码,就可以拦截Ajax
请求,返回模拟的响应数据。一、状态管理器 Vuex
1.1、安装
vuex
1.2、使用
vuex
的 文件和代码组织,新建文件夹store
1.3、各个
store
模块的统一入口/src/store/index.js
:解读一下上面的代码:
export
的store
里存储的state
是vue
给我们提供的单一状态树,store
这个唯一实例将作为我们项目中唯一的数据源, 请阅读State 单一状态树store
内有个user
模块(module)。在user
模块中拥有自己的state
、mutation
、action
、getter
,见1.4中的代码。1.4、user 模块
/src/store/user.js
:export default { state: { isLogin: sessionStorage.getItem('isLogin') || false, userInfo: JSON.parse(sessionStorage.getItem('userInfo')) || {} }, mutations: { [USER_SIGNIN] (state, userInfo) { sessionStorage.setItem('isLogin', true) sessionStorage.setItem('userInfo', JSON.stringify(userInfo)) Object.assign(state, {userInfo, isLogin: true}) }, [USER_SIGNOUT] (state) { sessionStorage.removeItem('userInfo') sessionStorage.removeItem('isLogin') Object.keys(state).forEach(k => Vue.delete(state, k)) } }, actions: { [USER_SIGNIN] ({commit}, user) { return axios.post('/api/index/login', user).then(res => { const { httpCode, msg, data } = res.data if (httpCode !== 1) { throw new Error(msg) }
} }
解读一下上面的代码
onSignIn
函数onSignIn
函数内部通过store.dispatch
方法触发store
里action
的USER_SIGNIN
方法。USER_SIGNIN
里的throw new Error(msg)
抛出的异常会被promise
的catch
方法捕捉到。二、路由
前面我们有两篇文章介绍过路由的基础知识《Vue 路由管理器(Vue Router)的动态路由匹配》 和 《Vue 路由管理器(Vue Router)的路由嵌套》,也有一篇路由的应用场景的介绍《Vue 实现同一系统中同时存在多种布局模式》
1.1、路由权限参数配置
我们在
/admin
路由的meta
对象中配置了Auth
,用以告诉 系统,这个路由需要登录状态才能访问1.2、路由的导航守护 --- 全局导航守卫
vue-router
给我们提供了一个全局的导航守护,router.beforeEach
,因此,在路由配置文件/src/router/index.js
中:上面的代码
isLogin
是从store
的user
模块中获取的,to.matched
的值是一个数组对象, 包含当前路由的所有嵌套路径片段的路由记录 。路由记录就是 routes 配置数组中的对象副本 (还有在 children 数组)。请阅读 路由对象属性1.3、路由的导航守卫 --- 独享导航守卫
不过,我们仍然可以直接通过在地址栏输入
http://youDomain.com/#/admin
,访问到/admin
这个路由path
,所以我们要在路由的导向导航守卫,即在配置上直接定义 beforeEnter 守卫:三、Mock 数据
通过上面的代码,我们已经实现了常见的用户登录场景管理。下面就要实现与后端的数据通信,但是我们的后端工程师工作比较饱和,我们不得不继续向前赶任务,于是我们就得利用 Mock.js。
mock
有“愚弄、欺骗”之意,在前端领域,mock
可以理解为我们前端开发人员制造的假数据。也就是说不是由后台真实制造,而是由我们其他一些方式模拟的数据,安装
新建
/src/mock/index.js
,添加一条userInfo
的mock
规则在入口
main.js
中引入mock
规则OK, 至此,我们的系统就使用了我们定义的
mock
数据。