Vue.js学习——Vuex和登陆拦截
什么是Vuex?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
类似于使用一种全局变量的方式来管理state。
使用Vuex实现登陆拦截
在main.js引用vuex,并定义一个store对象,把store对象提供给store选项,可以把store实例注入所有的子组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import Vue from 'vue';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
token: false
},
mutations: {
login(state) {
state.token = true
sessionStorage.setItem("isLogin", true);
},
logout(state) {
state.token = false
sessionStorage.setItem("isLogin", false);
}
}
})
new Vue({
el: '#app',
router,
store,
components: {App},
template: '<App/>'
})在路由配置的地方给需要增加路由拦截的页面增加一个属性requireAuth
1
2
3meta: {
requireAuth: true, // 添加该字段,表示进入这个路由是需要登录的
},在进行路由之前,先判断是否有这个需要验证权限的字段,如果有的话就验证store中state里面提供验证的字段的值,验证成功才执行next(),否则就跳转回登陆界面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18router.beforeEach((to, from, next) => {
if (to.meta.requireAuth) { // 判断该路由是否需要登录权限
if (store.state.token) { // 通过vuex state获取当前的token是否存在
next();
}
else if(sessionStorage.getItem('isLogin')){
next();
}
else {
next({
path: '/login',
})
}
}
else {
next();
}
})在登陆和登出的时候,使用store中定义的mutations方法修改state中的值。
1
this.$store.commit('login'); //改变token状态
vuex store的刷新问题
实际中遇到一个问题,点击刷新的时候重新回到登陆页面。
原因是因为刷新之后store被重新初始化了。
解决方法是把状态保存在localStorage或sessionStorage里面。
localStorage和sessionStorage
webstorage是本地存储,存储在客户端,包括localStorage和sessionStorage。
localStorage生命周期是永久,这意味着除非用户显式在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存,不参与和服务器的通信。
sessionStorage仅在当前会话下有效,关闭页面或浏览器后被清除。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存,不参与和服务器的通信。源生接口可以接受,亦可再次封装来对Object和Array有更好的支持。1
2
3
4localStorage.setItem("key","value");//以“key”为名称存储一个值“value”
localStorage.getItem("key");//获取名称为“key”的值
localStorage.removeItem("key");//删除名称为“key”的信息。
localStorage.clear();//清空localStorage中所有信息
localStorage和sessionStorage使用时使用相同的API
cookie
生命期为只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。 存放数据大小为4K左右 。有个数限制(各浏览器不同),一般不能超过20个。与服务器端通信:每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题。但Cookie需要程序员自己封装。