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

    1. <script>
    2. export default {
    3. created() {
    4. if (localStorage.getItem('store')) {
    5. this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(localStorage.getItem('store'))))
    6. }
    7. // 监听页面刷新
    8. window.addEventListener('beforeunload', () => {
    9. localStorage.setItem('store', JSON.stringify(this.$store.state))
    10. })
    11. },
    12. }
    13. script>

          3-3 vuex配置文件index.js

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. Vue.use(Vuex)
    4. export default new Vuex.Store({
    5. state: {
    6. loginState: 0,
    7. },
    8. getters: {
    9. getLoginState(state) {
    10. return state.loginState
    11. },
    12. },
    13. mutations: {
    14. updateLoginState(state, statu) {
    15. state.loginState = statu
    16. },
    17. },
    18. actions: {
    19. update({ commit }, statu) {
    20. commit('updateLoginState', statu)
    21. },
    22. },
    23. })

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

    1. created() {
    2. localStorage.removeItem('store')
    3. },
    4. methods: {
    5. async onSubmit() {
    6. let opt = {
    7. url: 'users/login',
    8. method: 'post',
    9. data: {
    10. username: this.form.username,
    11. userPassword: this.form.userPassword,
    12. },
    13. }
    14. try {
    15. let res = await request(opt)
    16. console.log(res)
    17. if (res.code !== 200) {
    18. return this.$message.error(res.msg)
    19. }
    20. this.$message.success(res.msg)
    21. // 修改用户状态loginState = 1
    22. this.$store.dispatch('update', 1)
    23. // 保存state到localStorage
    24. localStorage.setItem('store', JSON.stringify(this.$store.state))
    25. this.$router.push('/home')
    26. } catch (error) {}
    27. }
    28. }

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

    1. methods: {
    2. logout() {
    3. this.$store.dispatch('update', 0)
    4. this.$router.push('/')
    5. },
    6. }

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

        4-1 安装资源

    		npm i vue-persistedstate -S

        4-2 在store/index.js配置

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. import { createVuexPersistedState } from 'vue-persistedstate'
    4. Vue.use(Vuex)
    5. export default new Vuex.Store({
    6. state: {
    7. loginState: 0,
    8. },
    9. getters: {
    10. getLoginState(state) {
    11. return state.loginState
    12. },
    13. },
    14. mutations: {
    15. updateLoginState(state, statu) {
    16. state.loginState = statu
    17. },
    18. },
    19. actions: {
    20. update({ commit }, statu) {
    21. commit('updateLoginState', statu)
    22. },
    23. },
    24. plugins: [
    25. createVuexPersistedState({
    26. // 默认值vuex
    27. key: 'userState',
    28. // 缓存的介质localStorage、sessionStorage
    29. storage: window.localStorage,
    30. // 白名单 要缓存的数据,刷新不会丢失,重新打开也不会丢失
    31. whiteList: ['loginState'],
    32. // 黑名单 不缓存的数据,刷新丢失
    33. blackList: [],
    34. }),
    35. ],
    36. })

        4-3、登录操作

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

        4-4、退出登录

    1. methods: {
    2. logout() {
    3. this.$store.dispatch('update', 0)
    4. this.$router.push('/')
    5. },
    6. }

  • 相关阅读:
    【C++学习笔记】C++20的jthread
    每日一个C库函数-#2-memmove()
    python调用32位的ControlCan.dll实现can报文的收发
    正则表达式 re模块
    qt之模态窗口
    R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析
    1797_GNU pdf阅读器evince
    秒杀微服务实现抢购代金券功能
    Git实战技巧-如何将暂存区的多个功能代码分成多次提交
    OpenResty入门之压测篇:压测工具界的 “悍马” wrk
  • 原文地址:https://blog.csdn.net/hanq2016/article/details/126137187