Vuex/Pinia实现数据持久化存储另一种解决方案:vuex页面刷新数据丢失问题
方案一
配合本地storage或cookies,在更新数据时同时将数据保存在本地,state在初始化时先从本地缓存读怪初始值。如登录时保存token:
export default new Vuex.Store({
state: {
token: window.sessionStorage.getItem('token') //初始或页面刷新后从本地读取
},
mutations: {
saveToken(state, data) {
state.token = data
window.sessionStorage.setItem('token', data) // 同时保存在sessionStorage
}
}
})
方案二
对于vuex可使用第三方插件,如vuex-persistedstate实现
方案三
方案一不足之处,当需再存一个用户登录信息时,如userInfo,则需在state里添加userInfo,相当于复制一个state里的token和mutations里的saveToken(),即
export default new Vuex.Store({
state: {
token: window.sessionStorage.getItem('token'), //初始或页面刷新后从本地读取
userInfo: window.sessionStorage.getItem('userInfo')
},
mutations: {
saveToken(state, data) {
state.token = data
window.sessionStorage.setItem('token', data) // 同时保存在sessionStorage
},
saveUserInfo(state, data) {
state.userInfo = data
window.sessionStorage.setItem('userInfo', data)
}
}
})
当需要存储更多数据,可在浏览器刷新前将整个state保留起来,刷新完页面加载完成后再将本地值设回给state。可以App.vue中添加如下代码:
export default {
created() {
this.getStore()
},
methods: {
beforeunload() {
//当浏览器刷新或关闭时将state存到本地,可根据实际需求使用sessionStorage或localStorae或者是cookies
window.sessionStorage.setItem('store', JSON.stringify(this.$store.state))
},
getStore() {
//初始进来时如果存在store,则设置state的值
const store = window.sessionStorage.getItem('store')
if (store) {
this.$store.replaceState(
Object.assign(
this.$store.state,
JSON.parse(store)
)
)
}
//读取后这里可以将store从本地存储中删除
window.sessionStorage.remove('store')
}
},
mounted() {
//当浏览器刷新或关闭时触发
window.addEventListener("beforeunload", this.beforeunload)
},
beforeDestroy() {
window.removeEventListener("beforeunload", this.beforeunload)
}
}
如使用的是Vue3或者是Pinia存储时,都可以使用同样的原理进行存储,只是写法上有差异