之前我写了一篇用ES6 Proxy方案解决数据同步的文章 页面刷新vuex数据消失问题解决方案.

今天和同事沟通这个vuex数据还原问题,我说我的方法很奇异。聊着聊着,同事咋不用  store.subscribe , 当时还有点觉得不可能,仔细再去看vuex官方文档。

这个还真的是可行,但当然也是存在不方便的地方的。

此方案现在已经应用我基于vue开发的音乐web app VBOX 上,欢迎大家给star.

基本方案和步骤如下

1. 简单的按照键复制对象

2. localStorage存储的封装

3. vuex插件编写

4. localStorage的数据还原和初始化 Vuex.Store

第一:简单的按照键复制对象

/**
* 数据简单复制
* @param {*} source
* @param {*} keys
*/
const copy = function (source, keys = []) {
if (!source) {
return source
}
let d = Object.create(null)
keys.forEach(k => { d[k] = source[k] })
return d
} export {
copy
}

第二:localStorage的简单封装

const ls = window.localStorage
// https://github.com/tsironis/lockr
export default {
getItem(key) {
try {
return JSON.parse(ls.getItem(key))
} catch (err) {
return null
}
},
setItem(key, val) {
ls.setItem(key, JSON.stringify(val))
},
clear() {
ls.clear()
},
keys() {
return ls.keys()
},
removeItem(key) {
ls.removeItem(key)
}
}

第三:vuex插件

主要是一个lsKey,存到localStorage的key,

另外一个是 mutation白名单,白名单内的触发不会触发数据同步

实际上这里是存在一定问题的,这里适用模块后的store

  (1) 无法快速有效便捷的定位什么时候该触发同步

  

import ls from '../utils/LStorage'
import { copy } from '../utils/utils' export const createLSPlugin = function (lsKey, mappings, whitelist = []) {
let k = lsKey || 'lsKey'
return store => {
store.subscribe((mutation, state) => {
if (whitelist.findIndex(m => m === mutation.type) < ) {
let cd = Object.create(null)
Object.keys(state).forEach(k => {
if (mappings[k]) {
cd[k] = copy(state[k], mappings[k])
}
})
ls.setItem(k, cd)
}
})
}
}

第四:初始化Vuex.Store

主要是从localStore里面还原数据合并到state里面,如果state没有分模块还是比较简单的。

import Vue from 'vue'
import Vuex from 'vuex' import playing from './playing'
import player from './player'
import searchHistory from './searchHistory' import { createLSPlugin } from '../plugin/syncls'
import ls from '../utils/LStorage' const LS_KEY = 'vbox' const lsData = ls.getItem(LS_KEY)
let mapping = {
playing: ['list', 'current'],
player: ['mode'],
searchHistory: ['list'] }
let mWhiteList = ['player/timeUpdate', 'player/setState']
if (lsData) {
let { playing: ls_playing, player: ls_player, searchHistory: ls_searchHistory } = lsData
Object.assign(playing, { state: ls_playing })
Object.assign(player, { state: ls_player })
Object.assign(searchHistory, { state: ls_searchHistory })
} Vue.use(Vuex)
const plugin = createLSPlugin(LS_KEY, mapping, mWhiteList)
const store = new Vuex.Store({
modules: {
playing,
player,
searchHistory
},
plugins: [plugin]
}) export default store

优点

1. 代码简单,对代码改动不大

2. 对原始的state没有额外干预

缺点

1. 触发存储条件不好控制

2. 存储限制实现会相对复杂

页面刷新vuex数据消失问题解决方案 之 vuex中间件的更多相关文章

  1. 页面刷新vuex数据消失问题解决方案

    VBox持续进行中,哀家苦啊,有没有谁给个star. vuex是vue用于数据存储的,和redux充当同样的角色. 最近在VBox开发的时候遇到的问题,页面刷新或者关闭浏览器再次打开的时候数据归零.这 ...

  2. 使用sessionStorage解决vuex在页面刷新后数据被清除的问题

    https://www.jb51.net/article/138218.htm 1.原因 2.解决方法 localStorage没有时间期限,除非将它移除,sessionStorage即会话,当浏览器 ...

  3. vue:vue页面刷新vuex数据消失问题

    vuex中数据刷新页面消失问题:a页面请求的数据保存在vuex中,只要不刷新,那跳转到b页面里也可以用,但如果b页面刷新,那vuex里的数据就会消失,可以得解决方法:a页面用的数据a页面的生命周期函数 ...

  4. vue 使用localStorage解决vuex在页面刷新后数据被清除的问题

    通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...

  5. 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题

    通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...

  6. JS页面刷新保持数据不丢失

    转自:https://blog.csdn.net/qq_32439101/article/details/78134877 下面是 DOM Storage 的接口定义: interface Stora ...

  7. djano modles values+ajax实现无页面刷新更新数据

    做项目的过程中想通过不刷新页面的方式来进行页面数据刷新,开始使用http://www.cnblogs.com/ianduin/p/7761400.html方式将查询结果数据进行序列化.发现可以行,但是 ...

  8. django中form页面刷新后自动提交的解决方案

    如果一个页面包含了form,同时这个form中的提交按钮是type=submit的input的时候,你刷新该页面,就会有弹窗提示是否重新提交表单,这个特性不胜其烦,常见解决方法有两个: 第一种是前端的 ...

  9. [转]vue解决刷新页面vuex数据、params参数消失的问题

    一般项目都会有一些逻辑需要传递值给另一个页面,那么有的时候就会出现一个问题:用户刷新了页面,诶?数据没了,参数错误.那么今天经过总结,解决了这个问题.我在最新的项目中,通过了一下几种情况进行传值: 1 ...

随机推荐

  1. jar包冲突与inode

    包冲突 几乎上点规模的java系统就会遇到jar冲突,不负责任的讲排除依赖成了每次发布上线前必做的工作.虽然问题的本质都是jar冲突,但是表现上却有很多不同,从NoSuchMethodError,Cl ...

  2. UILabel 的使用

    直接上代码: /* UILabel 使用 */ UILabel *aLable = [[UILabel alloc] initWithFrame:self.window.bounds]; aLable ...

  3. 学习vi和vim编辑器(5):越过基础的藩篱

    本章将对之前学习的编辑命令如" c "." d "." y "等命令进行总结,并学习一些新的知识:其它进入vi的方法,利用缓冲区来存储拖曳或 ...

  4. 为Android Studio设置HTTP代理

    大陆的墙非常厚非常高.初次安装Android Studio下载SDK等必然失败,设置代理方法例如以下: 1. 到android studio安装文件夹,打开bin文件夹.编辑idea.properti ...

  5. flask框架-decorator装饰器

    调用包: from functools import wraps 装饰器其实就是一个函数:参数是一个函数,返回值是一个函数 1.装饰器使用是通过@符号,在函数的上面 2.装饰器中定义的函数,要使用*a ...

  6. 【SqlServer系列】聚合函数

    1   概述 本篇文章简要回顾SQL Server  聚合函数,MAX,MIN,SUM,AVG,SUM,CHECKSUM_EGG,COUNT,STDEV,STDEVP,VAR,VARP. 2   具体 ...

  7. DDD理论学习系列——案例及目录

    目录 DDD理论学习系列(1)-- 通用语言 DDD理论学习系列(2)-- 领域 DDD理论学习系列(3)-- 限界上下文 DDD理论学习系列(4)-- 领域模型 DDD理论学习系列(5)-- 统一建 ...

  8. lock锁速记

    1.Lock关键字主要实现锁互斥,确保一个线程A在请求此操作时不会被其线程B请求中断(假设A先请求并在没有未完成的操作情况下申请了此互斥锁).lock的参数必须是基于引用类型的对象,不要是基本类型像b ...

  9. C#设计模式之二十二访问者模式(Visitor Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获 ...

  10. 33 款主宰 2017 iOS 开发的开源库

    推荐一篇文章 改文章汇聚了现在主流的一些三方框架,很值得一看 https://mp.weixin.qq.com/s/ICodliohtzbmA-eLKRFT-Q