首先需要安装vuex-persist:
npm install vuex-persist
然后在你的store.js文件中引入:
javascript
import VuexPersistence from 'vuex-persist'
const vuexLocal = new VuexPersistence({
storage: window.localStorage // 可以换成其他存储方式,如sessionStorage、indexedDB等
})
export default new Vuex.Store({
state: {
...
},
mutations: {
...
},
actions: {
...
},
plugins: [vuexLocal.plugin] // 注册插件
})
在初始化VuexPersistence时,可以配置一些选项来满足你的需求:
javascript
const vuexLocal = new VuexPersistence({
storage: window.sessionStorage, // 存储方式,默认为localStorage
key: 'my-app', // 存储的key名,默认为vuex
reducer: state => ({ user: state.user }), // 只存储特定的state,默认为存储所有的state
filter: mutation => mutation.type === 'UPDATE_USER', // 只存储特定的mutation,默认为存储所有的mutation
modules: ['auth', 'cart'] // 存储指定的模块,默认为存储所有的模块
})
需要注意的是,如果你的state中有引用类型(如对象、数组等),需要在取出时进行深拷贝,否则会影响原有的state:
javascript
const vuexLocal = new VuexPersistence({
storage: window.localStorage,
reducer: state => ({ cart: state.cart }) // 只存储cart模块的state
})
export default new Vuex.Store({
state: {
cart: {
items: []
}
},
mutations: {
addItem(state, item) {
state.cart.items.push(item)
}
},
plugins: [vuexLocal.plugin],
getters: {
getCart(state) {
return JSON.parse(JSON.stringify(state.cart)) // 返回深拷贝的state
}
}
})
在上面的例子中,我们在getters中返回了深拷贝的state,这样在其他组件中使用getters.getCart()时就可以避免影响原有的state了。