vuex 刷新数据消失处理 调用实例

修改应用数据不刷新问题

 
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
 
export default new Vuex.Store({
     state: {
        obj: {
            a:1,
        }, 
        arr: [0,1,2]
    },
    mutations: {
        SET_STATE_DATA(state){
            // state.obj.b= '233'; // 错误 页面不会更新 
            // JSON.parse(JSON.stringify(state.obj) //不推荐此方法触发更新 显得很LOWB
            Vue.set(state.obj,'b','233') // 正确的方法
 
            // state.arr[0] = 233; // 错误 页面不会更新
            // state.arr.push() //不推荐此方法触发更新
            Vue.set(state.arr,0,233) // 正确的方法
        }
    },
    actions: {
        
    }
})

vuex 调用vue实例

	const that = this
    this.$store.dispatch('getAddress', that)
  

async getAddress({ commit, state }, that) {
        const url = `position/${state.latitude},${state.longitude}`
        const { data: res } = await that.$http.get(url)
        if (res.code === 0) {
            commit(RECEIVE_ADDRESS, { address: res.data })
        }
    }

1.vuex组件 vuex-persistedstate
参考:添加链接描述

npm install vuex-persistedstate --save
import createPersistedState from 'vuex-persistedstate'
export default new Vuex.Store({
  state,
  mutations,
  getters,
  plugins: [createPersistedState()]
})

在我们的localstorage中就会看到有一个vuex的key,值为{“showLogin”:false,“navIndex”:true,“token”:“64c9bbf8541b47af8d891b20247ae6a3”,“nickName”:“百宝箱”,“updataCart”:false,“showLoading”:false}的字符串的JSON数据

每次我们更新vuex的状态,localstorage中的vuex也会随之改变

createPersistedState([options])
使用给定的选项创建插件的新实例。可以提供以下选项来配置您的特定需求的插件:

key :存储持久状态的键。(默认:vuex)

paths :部分持续状态的任何路径的数组。如果没有路径给出,完整的状态是持久的。(默认:[])

reducer :一个函数,将被调用来减少基于给定的路径持久化的状态。默认包含这些值。

subscriber :一个被调用来设置突变订阅的函数。默认为store => handler => store.subscribe(handler)

storage :而不是(或与)getState和setState。默认为localStorage。

getState :将被调用以重新水化先前持久状态的函数。默认使用storage。

setState :将被调用来保持给定状态的函数。默认使用storage。

filter :将被调用来过滤将setState最终触发存储的任何突变的函数。默认为() => true

自定义存储
如果在本地存储中存储Vuex存储的状态并不理想。人们可以轻松地实现功能使用cookie(或任何其他你可以想到的);

import { Store } from 'vuex'
import createPersistedState from 'vuex-persistedstate'
import * as Cookies from 'js-cookie'

const store = new Store({
  // ...
  plugins: [
    createPersistedState({
      storage: {
        getItem: key => Cookies.get(key),
        setItem: (key, value) => Cookies.set(key, value, { expires: 3, secure: true }),
        removeItem: key => Cookies.remove(key)
      }
    })
  ]
})

实际上,可以传递任何遵循存储协议(getItem,setItem,removeItem等)的对象:

// 用sessionStorage替换localStorage
createPersistedState({ storage: window.sessionStorage })

转载:https://developer.aliyun.com/article/620010

  1. app.vue
   if (sessionStorage.getItem("store")) {
      this.$store.replaceState(
        Object.assign({}, JSON.parse(sessionStorage.getItem("store")||'{}'))
      );
       sessionStorage.removeItem("store")
    }

    window.addEventListener("beforeunload", () => {
      sessionStorage.setItem("store", JSON.stringify(this.$store.state));
    });

3.将每一次state的数据保存起来
转载:https://cloud.tencent.com/developer/article/1397383

const storeMaker = (state) => {
    // 初始化
    Object.keys(state).map((key) => {
        // 判断类型获取本地存储数据
        if (typeof state[key] === 'object') {
            if (sessionStorage.getItem(key) && JSON.parse(sessionStorage.getItem(key))) {
                state[key] = JSON.parse(sessionStorage.getItem(key))
            }
        } else if (typeof state[key] === 'number') {
            if (sessionStorage.getItem(key) && parseInt(sessionStorage.getItem(key))) {
                state[key] = parseInt(sessionStorage.getItem(key))
            }
        } else {
            if (sessionStorage.getItem(key)) {
                state[key] = sessionStorage.getItem(key)
            }
        }
    })

    // 重写set处理
    return new Proxy(state, {
        set: function(target, key, value) {
            let temp = value
            if (typeof temp === 'object') {
                temp = JSON.stringify(temp)
            }

            sessionStorage.setItem(key, temp)
            return Reflect.set(target, key, value)
        }
    })
}

export default new Vuex.Store({
    state: storeMaker({
        userLevel: ''
    }),
    mutations: {
        SET_USERLEVEL(state, userLevel) {
            state.userLevel = userLevel
        }
    },
    modules: {
    }
})

4.个人认为 第二种和第三种结合,效果更佳,因为一些登录凭证放在 本地存储里是不安全的的 因此放在内存中最好,但是刷新导致内存初始化,因此在刷新时 需要本地缓存过去一下 再删除

5.还可以在 mutations action 等方法里处理缓存数据 过滤/增加缓存数据 如果操作了就缓存 没有操作就就是默认值

const mutations = { //触发状态
  //取出缓存数据
  setCacheData(state) {
    for (var name of cacheNameList) {
      var data = sessionStorage.getItem(name) || localStorage.getItem(name);
      if (data) {
        var dataObj = JSON.parse(data);
        state[name] = dataObj;
      }
    }
  },
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web修理工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值