目录标题

  • vue登陆功能的实现
  • 实现步骤
  • Vuex存储登陆角色信息以及页面刷新数据重置、退出功能问题
  • 需求
  • 问题
  • 解决
  • 代码
  • 总结


vue登陆功能的实现

实现步骤

1、在router.js中 为首页以及登陆页加上元数据 例如

{
	path: '/login',
	component: () => {...},
	meta: {
		allowRequire: true //自定义参数 意思为允许访问
	}
}

//在最后使用全局守卫导航
router.beforeEach((to,from,next) => {
	if(!to.meta.allowRequire){//不允许游客身份访问
		if(localStorage.getItem('USER_SESSION')){//如果本地有user_session,代表登陆,放行
			next();
		}else{//没有就去登陆页面
			next({path: '/login'});
		}
	}else{//允许访问的页面不进行拦截
		next();
	}
})

Vuex存储登陆角色信息以及页面刷新数据重置、退出功能问题

需求

今天在写页面登陆功能,需要实现登陆跳转首页后用户信息显示功能。

问题

① 登陆成功后页面刷新,vuex中存储的信息被重新初始化,导致信息丢失。
② 通过localStorage.setItem()方法存储登陆信息,在用户退出后首页还是显示着用户信息。

解决

代码

//vuex中数据初始化写法
state: {
	//使用json.parse是因为localStorage存放的值只能是String类型
    userInfo: JSON.parse(localStorage.getItem('USER_SESSION')) || {},
    isLogin:  false
  },

//组件中的代码
	<el-menu-item v-if="!$store.state.isLogin" ...>
       登陆/注册
    </el-menu-item>
    <el-submenu v-else ...>
      //...
        <el-avatar :src="$store.state.userInfo.userAvatar"></el-avatar>
      //...
    </el-submenu>

解释:
userInfo这么写是因为
①在没有localStorage没有存放以USER_SESSION为键的数据时,被初始化为{},即空对象。
②localStorage存储的键值对在没有手动清除的情况下是不会消失的,所以会一直保存在浏览器中,当新开页面访问首页时,localStorage中的对象赋值给userInfo初始化。解决了第一个问题
isLogin:
①这个变量存在的意义在于 当未登陆状态时 userInfo为{}空对象 作为组件中判断是否登陆的条件过于麻烦

第二个问题是由于我退出功能写的是退出后删除了localStorage中的键值对信息,但是是通过路由跳转的首页,路由跳转和页面刷新、< a >标签是不一样的。vue是单页面应用,路由跳转不改变vuex中的数据内容,但是页面刷新以及a标签的跳转是一个道理,相当于打开了一个新页面,此时vuex中存放的数据会重新初始化!

总结

所以在登陆的时候 需要用localStorage.setItem()设置键值对,类似token作用,然后更新vuex-state中的userInfo内容,isLogin改为true。
在退出时,使用localStorage.removeItem()删除键值对,对userInfo重新赋值为{},isLogin为false。