vuex状态持久化_Vuex数据状态持久化

vuex可以进行全局的状态管理,但刷新后刷新后数据会消失,这是我们不愿意看到的。怎么解决呢,我们可以结合本地存储做到数据状态持久化,也可以通过插件vuex-persistedstate。

1.手动利用HTML5的本地存储

方法

1、vuex的state在localStorage或sessionStorage中取值;

2、在mutations中,定义的方法里对vuex的状态操作的同时对存储也做对应的操作。

这样state就会和存储一起存在并且与vuex同步

2.利用vuex-persistedstate插件

插件的原理其实也是结合了存储方式,只是统一的配置就不需要手动每次都写存储方法。

使用方法

安装

npm install vuex-persistedstate --save

引入及配置:在store下的index.js中

import createPersistedState from "vuex-persistedstate"

conststore =newVuex.Store({

// ...

plugins: [createPersistedState()]

})

默认存储到localStorage

想要存储到sessionStorage,配置如下

import createPersistedState from "vuex-persistedstate"

conststore = newVuex.Store({

// ...

plugins: [createPersistedState({

storage:window.sessionStorage

})]

})

默认持久化所有state

指定需要持久化的state,配置如下

import createPersistedState from "vuex-persistedstate"

conststore = newVuex.Store({

// ...

plugins: [createPersistedState({

storage:window.sessionStorage,

reducer(val)  {

return {

// 只储存state中的assessmentData

assessmentData: val.assessmentData

}

}

})]

})

vuex引用多个插件的写法

譬如:vuex提示的插件和持久化的插件一起使用,配置如下

import createPersistedState from "vuex-persistedstate"

import createLogger from 'vuex/dist/logger'

// 判断环境 vuex提示生产环境中不使用

constdebug = process.env.NODE_ENV !== 'production'

constcreatePersisted = createPersistedState({

storage:window.sessionStorage

})

exportdefaultnewVuex.Store({

// ...

plugins: debug ? [createLogger(), createPersisted] : [createPersisted]

})

plugins要是一个一维数组不然会解析错误

在 Vue.js 应用中,使用 Vuex 实现状态持久化是确保应用状态在页面刷新或重新打开时不会丢失的重要手段。Vuex 本身不支持持久化存储,因此需要借助插件来实现。最常用的方式是使用 `vuex-persistedstate` 插件,该插件可以将 Vuex状态持久化到 `localStorage` 或 `sessionStorage` 中 [^2]。 ### 安装和配置 `vuex-persistedstate` 首先,需要安装 `vuex-persistedstate` 插件: ```bash npm install vuex-persistedstate ``` 然后,在 Vuex 的配置文件中引入该插件并进行配置。例如,在 Vue 2 中的配置如下: ```javascript import Vue from 'vue' import Vuex from 'vuex' import createPersistedState from 'vuex-persistedstate' Vue.use(Vuex) const store = new Vuex.Store({ plugins: [createPersistedState()], state: { count: 0, user: { name: '', token: '' } }, mutations: { increment(state) { state.count++ }, setUser(state, user) { state.user = user } }, actions: { login({ commit }, user) { commit('setUser', user) } }, getters: { getCount: state => state.count, getUser: state => state.user } }) export default store ``` 对于 Vue 3 的项目,配置方式类似,但需要注意使用 `createStore` 来创建 store: ```javascript import { createStore } from 'vuex' import createPersistedState from 'vuex-persistedstate' const store = createStore({ plugins: [createPersistedState()], state: { count: 0, user: { name: '', token: '' } }, mutations: { increment(state) { state.count++ }, setUser(state, user) { state.user = user } }, actions: { login({ commit }, user) { commit('setUser', user) } }, getters: { getCount: state => state.count, getUser: state => state.user } }) export default store ``` ### 配置选项 `vuex-persistedstate` 插件提供了丰富的配置选项,可以灵活控制持久化行为。例如: - **storage**:指定使用 `localStorage` 还是 `sessionStorage`。默认使用 `localStorage`。 - **key**:自定义存储的键名,默认为 `vuex`。 - **reducer**:自定义需要持久化状态部分,避免整个 state 被存储。 - **filter**:定义哪些 mutation 触发时需要更新持久化存储。 - **getItem** / **setItem** / **removeItem**:自定义存储和读取逻辑。 示例配置如下: ```javascript createPersistedState({ key: 'my-app-store', storage: window.sessionStorage, reducer: (state) => ({ user: state.user }) }) ``` ### 手动实现状态持久化 如果不使用插件,也可以手动实现状态持久化。通过在应用初始化时从 `localStorage` 或 `sessionStorage` 中读取状态,并在状态发生变化时将状态保存到存储中。 例如,在 Vuex 的 `store` 初始化时读取状态: ```javascript const savedState = JSON.parse(localStorage.getItem('vuex')) const store = new Vuex.Store({ state: { count: savedState ? savedState.count : 0, user: savedState ? savedState.user : { name: '', token: '' } }, mutations: { increment(state) { state.count++ localStorage.setItem('vuex', JSON.stringify(state)) }, setUser(state, user) { state.user = user localStorage.setItem('vuex', JSON.stringify(state)) } } }) ``` 这种方式虽然简单,但维护成本较高,推荐使用 `vuex-persistedstate` 插件来简化开发流程。 --- ### 总结 在 Vue.js 应用中,通过 `vuex-persistedstate` 插件可以轻松实现 Vuex 状态持久化。该插件支持 `localStorage` 和 `sessionStorage`,并且提供了灵活的配置选项,能够满足大多数应用场景的需求。如果需要更细粒度的控制,也可以手动实现状态持久化,但这会增加代码复杂度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值