在实际的 vue 项目中,当我们的应用遇到多个组件之间的共享问题时,通常会用到 Vuex(一个状态管理的插件,可以解决不同组件之间的数据共享和数据持久化),解决组件之间同一状态的共享问题。
因子:
- Vuex 优势:相比 sessionStorage,存储数据更安全,sessionStorage 可以在控制台被看到。
- Vuex 劣势:在刷新页面后,vuex 会重新更新 state,所以,存储的数据会丢失。
言而总之:
实际问题:在 vue 项目中,使用 Vuex 做状态管理时,调试页面时,刷新后 state 上的数据消失了,该如何解决?
解决思路:将 state 中的数据放在浏览器 sessionStorage 和 localStorage
解决办法:
- 存储到 localStorage
通过监听页面的刷新操作,即 beforeunload 前存入本地 localStorage, 页面加载时再从本地 localStorage 读取信息
在 App.vue 中加入下面代码
created(){
// 在页面刷新时将 vuex 里的信息保存到 localStorage 里
window.addEventListener("beforeunload",()=>{localStorage.setItem("messageStore",JSON.stringify(this.$store.state))
})
// 在页面加载时读取 localStorage 里的状态信息
localStorage.getItem("messageStore") && this.$store.replaceState(Object.assign(this.$store.state,JSON.parse(localStorage.getItem("messageStore"))));
}
- 使用 vuex-persistedstate 插件
安装插件:npm install vuex-persistedstate –save
配置:
在 store 的 index.js 中,手动引入插件并配置
import createPersistedState from "vuex-persistedstate"
const store = new Vuex.Store({
// ...
plugins: [createPersistedState()]
})
该插件默认持久化所有 state,当然也可以指定需要持久化的 state:
import createPersistedState from "vuex-persistedstate"
const store = new Vuex.Store({
// ...
plugins: [createPersistedState({
storage: window.sessionStorage,
reducer(data) {
return {
// 设置只储存 state 中的 myData
myData: data.myData
}
}
})]