Vuex状态持久化方法

1、Vuex
    1-1 一个状态管理的插件,可以解决不同组件之间的数据共享和数据持久化,解决组件之间同一状态的共享问题.
    1-2 Vuex优势:相比sessionStorage,存储数据更安全,sessionStorage可以在控制台被看到.
    1-3 Vuex劣势:在刷新页面后,vuex会重新更新state,所以存储的数据会丢失.


2、实际问题
    2-1 在vue项目中,使用Vuex做状态管理时,调试页面时,刷新后state上的数据消失了,该如何解决?
    2-2 消失的原因:因为store的数据是保存在运行内存中,当页面刷新时,页面会重新加载vue实例,store里面的数据就会被重新赋值
    2-3 解决思路:将state中的数据放在浏览器sessionStorage和localStorage

3、解决办法一:存储到localStorage/sessionStorage
    3-1 通过监听页面的刷新操作,即beforeunload前存入本地localStorage,页面加载时再从本地localStorage读取信息
    3-2 在App.vue中加入下面代码,以localStorage为例:
 

<div id="app">
    <router-view />
  </div>
</template>
<script>
export default {
  created() {
    if (localStorage.getItem('store')) {
      this.$store.replaceState(Object.assign({}, this.$store.state, 
      JSON.parse(localStorage.getItem('store'))))
    }
    // 监听页面刷新
    window.addEventListener('beforeunload', () => {
      localStorage.setItem('store', JSON.stringify(this.$store.state))
    })
  },
}

 3-3 vuex配置文件index.js

import Vue from 'vue'
		import Vuex from 'vuex'
		Vue.use(Vuex)
		export default new Vuex.Store({
			state: {
				loginState: 0,
			},
			getters: {
				getLoginState(state) {
					return state.loginState
				},
			},
			mutations: {
				updateLoginState(state, statu) {
					state.loginState = statu
				},
			},
			actions: {
				update({ commit }, statu) {
					commit('updateLoginState', statu)
				},
	          },
		   })
      

3-4、在登录界面Login.vue


created() {
			localStorage.removeItem('store')
		},
		methods: {
			async onSubmit() {
				let opt = {
					url: 'users/login',
					method: 'post',
					data: {
						username: this.form.username,
						userPassword: this.form.userPassword,
					},
				}
				try {
					let res = await request(opt)
					console.log(res)
					if (res.code !== 200) {
						return this.$message.error(res.msg)
					}
					this.$message.success(res.msg)
					// 修改用户状态loginState = 1
                    this.$store.dispatch('update', 1)
					// 保存state到localStorage
					localStorage.setItem('store', JSON.stringify(this.$store.state))
					this.$router.push('/home')
				} catch (error) {}
			}
		}
      

3-5、退出登录,修改loginState = 0

methods: {
			logout() {
				this.$store.dispatch('update', 0)
				this.$router.push('/')
			},
          }

4、解决办法二:使用vue-persistedstate插件

    4-1 安装资源

        npm i vue-persistedstate -S

4-2 在store/index.js配置

import Vue from 'vue'
		import Vuex from 'vuex'
		import { createVuexPersistedState } from 'vue-persistedstate'
		Vue.use(Vuex)
		export default new Vuex.Store({
			state: {
				loginState: 0,
			},
			getters: {
				getLoginState(state) {
					return state.loginState
				},
			},
			mutations: {
				updateLoginState(state, statu) {
					state.loginState = statu
				},
			},
			actions: {
				update({ commit }, statu) {
					commit('updateLoginState', statu)
				},
			},
			plugins: [
				createVuexPersistedState({
					// 默认值vuex
					key: 'userState',
					// 缓存的介质localStorage、sessionStorage
					storage: window.localStorage,
					// 白名单 要缓存的数据,刷新不会丢失,重新打开也不会丢失
					whiteList: ['loginState'],
					// 黑名单 不缓存的数据,刷新丢失
					blackList: [],
				}),
			],
		})

 4-3、登录操作

		try {
			let res = await request(opt)
			console.log(res)
			if (res.code !== 200) {
				return this.$message.error(res.msg)
      }
      this.$message.success(res.msg)
      this.$store.dispatch('update', 1)
      this.$router.push('/home')
		} catch (error) {}

 4-4、退出登录

		methods: {
			logout() {
				this.$store.dispatch('update', 0)
				this.$router.push('/')
			},
		}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值