前言:当我们刷新页面的时侯,在状态仓库的数据会被重置,当我们不希望这些数据被重置时,可以通过给状态管理的插件添加插件方法实现。Vue 的状态管理有 Vuex 和 Pinia。下面分别是两种状态库的数据持久化的实现。
1. Vuex
在 store/index.js 里插入自定义的 persistPlugin 方法
import { createStore } from "vuex";
import user from "./user.js";
import persistPlugin from "./persistPlugin.js";
const store = createStore({
modules: {
user,
},
plugins: [persistPlugin],
});
export default store;
自定义 persistPlugin 方法,给浏览器监听刷新页面的操作,存入数据。在最开始获取数据
// persistPlugin.js
const KEY = "VUEX:STATE";
export default function (store) {
// 存
window.addEventListener("beforeunload", () => {
localStorage.setItem(KEY, JSON.stringify(store.state));
});
// 取
try {
const state = JSON.parse(localStorage.getItem(KEY));
if (state) {
store.replaceState(state);
}
} catch {
console.log("存储报错");
}
}
2. Pinia
在 main.js 中给 Pinia 插入自定义插件
import { createApp } from "vue";
import App from "./App.vue";
import { createPinia } from "pinia";
import persistPlugin from "./persistPlugin.js";
const pinia = createPinia();
pinia.use(persistPlugin);
const app = createApp(App);
app.use(pinia);
app.mount("#app");
自定义 persistPlugin 方法,同 Vuex 大致一样。
const KEY_PREFIX = "PINIA:STATE:";
export default function (context) {
const { store } = context;
// 存
window.addEventListener("beforeunload", () => {
localStorage.setItem(
`${KEY_PREFIX}${store.$id}`,
JSON.stringify(store.$state)
);
});
// 取
try {
const state = JSON.parse(localStorage.getItem(`${KEY_PREFIX}${store.$id}`));
if (state) {
store.$patch(state);
}
} catch {
console.log("存储报错");
}
}