问题 : 在vue项目中,刷新页面之后,之前的登录信息, 打开的所有菜单,都消失, 如何实现刷新之后页面仍然是刷新之前的状态
解决 : 使用vuex状态管理, 搭配 , webstorage本地存储. 将vuex里面的数据同步更新到 localStorage/sessionStorage里存储
以登录信息为例:
- 每次登录成功, 将用户名存进webstorage(根据具体需求去选择localStorage/sessionStorage)
- 每次页面刷新后, 在页面的挂载(mounted)后, 都先尝试从webstorage去获取用户名
* 若能获取到,则代表已登录过, 将用户名从webstorage取出赋给vuex中的变量, 渲染回页面 (那样F5刷新后,用户看到的页面还是刷新前的)
* 若不能获取到(得到undefined) ,则代表没有登录过, 则取空值赋给vuex (页面则没有登录信息) - 退出登录 : 将vuex中保存的用户名设为空, 同时需要手动清除webstorage中储存的数据
1.vuex (index.js)中代码:
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex)
//创建存储对象Store,并导出
export default new Vuex.Store({
//state负责:保存共享数据,供各个组件使用
state: {
uname:""
},
//mutations:专门负责: 写函数, 来修改state中的变量
//注意:不能放异步,不能做ajax请求
//第一个参数, 接到state,通过state.操作state里的变量
//第二个参数,接到外部传递进来的数据
mutations: {
setUname(state,uname){
state.uname=uname;
}
},
//actions:专门负责:发送异步ajax请求,从服务器端获取数据
//context代表整个vuex对象
//另外只能有一个参数,但要接可能不止一个值,所以可以以一个对象的形式接多组值
actions: {
login(context,user){
(async function(){
var result=await axios.get("user/login",{params:user});
var code=result.data.code;
if(code==200){
//将登录成功后的获取到的用户名,传递给mutations中的setUname方法中的参数uname
context.commit("setUname",(result.data.data[0]).uname)
}
})()
}
},
modules: {
}
})
2.登录组件 (MyLogin.vue)中代码:
//引入Vuex提供的一个工具函数{mapActions}
import {mapActions} from 'vuex'
export default {
data(){
return{
uname:"",
upwd:""
}
},
//注意:::methods里自己方法 和 从Vuex拿过来的方法不能重名,重名会发生替换
methods:{
mylogin(){
//调用,从vuex的actions里面提供的,login函数
//并传递了一个对象(登录的用户命名和密码), 给user
this.login({loginUname:this.uname,loginUpwd:this.upwd}).then(()=>{
if(confirm("是否记住登录密码")){
localStorage.setItem("uname",this.uname)
}else{
sessionStorage.setItem("uname",this.uname)
}
})
},
//mapActions会将你想要的所有函数,以一个对象的形式给你
//想要直接使用的话,需要用"..."打散
...mapActions(["login"]),
/* ...mapActions(["login","logout","registor"])
* 去vuex的actions中取出名为"login","logout","registor"的函数放到此地
* 取出来后,就相当于这里,有login(),logout(),registor()函数
* login(user){ this.$store.dispatch("login",user)},
* logout(){ ... },
* register(){ ... }
*/
}
}
3.验证登录以及退出登录的组件 (MyHeader.vue)中代码:
//引入Vuex提供的2个工具函数
import {mapState,mapMutations} from 'vuex'
export default {
computed:{
//从vuex中state中拿到的变量,放在应用组件的计算属性中
//相当于:this.$store.state.uname
...mapState(["uname"])
},
methods:{
logout(){
//调用从vuex中Mutations中拿到的setUname方法,将state里的uname清除
//相当于:setUname(uname){ this.$store.commit("setName",uanme) }
this.setUname("");
//清除浏览器缓存
sessionStorage.clear();
localStorage.clear();
},
...mapMutations(["setUname"]),
},
mounted(){
//组件挂载后,尝试从浏览器存储中获取数据
var uname=sessionStorage.getItem("uname")||localStorage.getItem("uname");
//如果能获取到,则代表登录过,直接将获取的值赋给vuex中的变量;若没有获取到就取空值,则没有登录
this.setUname(uname||"")
}
}
版权声明:本文为weixin_46317118原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。