第一部分

SessionStorage

首先查看sessionStorage的地方在控制台的 Application > Storage > Session Storage这里:

根据sessionstorage的特性,做一下各个方法的封装

const ls = window.sessionStorage;
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(index) {
return ls.key(index);
},
removeItem(key) {
ls.removeItem(key);
}
}

封装代码解析:

首先将window.sessionStorage/localStorage赋值给简短的变量名ls

然后在js文件中直接export default抛出一个对象,对象内包含五个方法:
  getItem用来封装数据的获取,其参数是key名
  setItem用来封装设置数据,其参数是key名
    因为sessionStorage存储的数据只能是字符串,对于常用的对象和数组是存储不了的
    所以在getItem这里需要JSON.parse来将JSON 字符串转换(“格式化”)为对象、
    在setItem里需要JSON.stringify处理来将对象或者数组转换(“压缩”)为一个 JSON字符串
  keys里边封装了获取指定下标对应数据的key名,所以参数是index值
  removeItem负责移除某一个指定key的对应数据
  clear负责清楚当前所有的sessionStorage数据

材料准备好之后,在需要使用的地方引用

import ls from '../assets/js/ls.js'

然后就是使用了,

一、setItme:

ls.setItem('test', true);
ls.setItem('test2', '字符串');
let test3 = {
name: 'a',
sex: 'b',
age: 24
}
ls.setItem('test3', test3);

存入效果如图:

二、getItem应用

console.log(ls.getItem('test3'));

* 记得键名要加引号

 三、sessionStorage.key()方法

console.log(ls.keys(0));
console.log(ls.keys(2));
console.log(ls.keys(3));

控制台打印如下:

 四、removeItem

ls.removeItem('test2');

* 键名记得加引号.

可以看到,test2被移除了:

五、 clear

ls.clear()

这下所有的都被清除了:

soeasy,思考一个问题,为什么sessionstorage刷新页面不会清空数据呢

第二部分

接下来清楚了五个方法各自的用法,来说说我的项目逻辑

vuex的state中,定义这个状态:ActiveProgressEnum
这个是用户参加活动的进程值,只要按流程走,他会一直变化,但是若初始化进来时,他被我自己预先设定成一个不在后端定义范围内的另一个值,比如任性的100000.
vuex里边数据的一个特点时,刷新他就会回归初始化。所以,意味着用户进入页面或者刷新页面,这个值就会变成我自己设定的100000.那么第一个限制条件就完成了。

if(state.init.ActiveProgressEnum === 100000){
}

如前面所说,条件成立会有两种场景:用户进入页面 || 刷新页面。
所以这里还不完全能利用这个。此时我还需要一个状态join,让我区分用户不是在初始化状态。这样,如果这两个条件同时成立,那就能断定他是刷新了。
那么这个状态值需要在一开始没有,页面初始化后才存在,且页面刷新不丢失。
什么数据这么神通广大?!那就是sessionstorage设置的数据。
所以,要在判断条件内部添加一句,获取这个状态值join

let join = ls.getItem('RYHB_J');//Join缩写,用于判断用户是否是初次加载页面

并且根据业务需要获取一下关键信息

let newTeamID = ls.getItem('RYHB_T');//TeamID缩写,需要保留的重要信息

然后开始判断条件是否同时成立:
但是这里有一点,需要利用js的同步逻辑,这段判断的代码要提前放到最顶部,即初始化数据没有设定之前:

因为如果数据设定以后,每次初始化进入页面后,开始这段判断时,该值就已经存在,也会被检测到,场景就会被当作刷新的情况。

if (join && newTeamID && newTeamID > 0) {
// 条件成立:页面刷新的情况
ls.removeItem('RYHB_J');
window.location.href = 'https://.../index.html?TeamID=' + newTeamID;
}

还有值得注意的是:

ls.removeItem('RYHB_J');

作用:刷新没有清除session的数据,如果条件成立的话,是需要重定向页面,让页面重新按照之前的步骤再走一边流程的,这时应该清除或者重置一下,不然页面一进来数据还存在,这里条件就会成立,会变成死循环,展示上就是页面一直跳转一直刷新。

直接清除join这样条件就不成立了且还方便操作。

而在判断的下边,调用ajax获取数据,并把响应结果中的关键信息(本案例中的newTeamID)一并寄托给sessionStorage:

$axios.get(state.ownSet.dataUrl + 'JoinInActive')
.then((response) = > {
if (response && response.data && response.data.result === 1) {
let data = response.data.RetValue;
ls.setItem('RYHB_J', true);
ls.setItem('RYHB_T', data.TeamID);
} else {}
})
.
catch ((err) = > {});

这样当用户刷新的时候,会触发顶部的那段判断代码。但是初始化进入的时候不会触发,这就做了刷新的时候重新获取数据

完整的用于判断是否是刷新场景的代码

if (state.init.ActiveProgressEnum === 100000) {
let newTeamID = ls.getItem('RYHB_T'); //TeamID缩写,需要保留的重要信息
let join = ls.getItem('RYHB_J'); //Join缩写,用于判断用户是否是初次加载页面
if (join && newTeamID && newTeamID > 0) {
// 页面刷新的情况
// 刷新没有清除session的数据,这时应该清除或者重置一下,不然是死循环,直接清除这样方便操作。
ls.removeItem('RYHB_J');
window.location.href = 'https://.../index.html?TeamID=' + newTeamID;
}
}

这样解决了刷新后页面空白的问题,重定向重新请求数据
但是如果为了解决部分数据丢失的问题,也可以直接将数据实现存在sessionstorage内,然后判断刷新的话直接提取数据即可。不用再重定向重新请求数据这么麻烦了

个人学习理解和总结,很多不足还请指正~

vue案例 - vuex+sessionstorage解决vue项目刷新后页面空白/数据丢失的更多相关文章

  1. react项目打包后路径找不到,项目打开后页面空白的问题

    使用 npm install -g create-react-app快速生成项目脚手架打包后出现资源找不到的路径问题: 解决办法:在package.json设置homepage

  2. vue项目刷新当前页面

    场景: 有时候我们在vue项目页面做了一些操作,需要刷新一下页面. 解决的办法及遇到的问题: this.$router.go(0).这种方法虽然代码很少,只有一行,但是体验很差.页面会一瞬间的白屏,体 ...

  3. (转)vue项目刷新当前页面

    场景: 有时候我们在vue项目页面做了一些操作,需要刷新一下页面. 解决的办法及遇到的问题: this.$router.go(0).这种方法虽然代码很少,只有一行,但是体验很差.页面会一瞬间的白屏,体 ...

  4. vue,vuex的后台管理项目架子structure-admin,后端服务nodejs

    之前写过一篇vue初始化项目,构建vuex的后台管理项目架子,这个structure-admin-web所拥有的功能 接下来,针对structure-admin-web的不足,进行了补充,开发了具有登 ...

  5. 【BUG】---ionic tab-demo项目在modal页跳转URL改变页面不刷新,手动刷新后显示空白

    问题描述: 项目是基于ionic tab的demo,在modal上访问其他页面,地址栏变化了,但是页面不动没刷新,自己手动刷新呢,还是空白,可是访问的页面时有内容的啊 错误: 我的路由配置 .stat ...

  6. 怎么用cookie解决选项卡问题刷新后怎么保持原来的选项?

    什么是cookie? Cookies虽然一般都以英文名呈现,但是它还是有一个可爱的中文名“小甜饼”.Cookies是指服务器暂存放在你的电脑里的txt格式的文本文件资料,主要用于网络服务器辨别电脑使用 ...

  7. 直击根源:微信小程序中web-view再次刷新后页面需要退两次

    背景 在上一章(直击根源:vue项目微信小程序页面跳转web-view不刷新)解决了vue在小程序回退不刷新的问题之后,会引出了一个刷新的页面需要点击返回两次才能返回上一个页面 问题描述 在A页面从B ...

  8. vue全家桶(Vue+Vue-router+Vuex+axios)(Vue+webpack项目实战系列之二)

    Vue有多优秀搭配全家桶做项目有多好之类的咱就不谈了,直奔主题. 一.Vue 系列一已经用vue-cli搭建了Vue项目,此处就不赘述了. 二.Vue-router Vue的路由,先献上文档(http ...

  9. vue项目打包之后页面空白解决办法

    之前项目遇到个情况,npm run build打包之后上传到服务器后,index.html打开一片空白,资源都加载了,但是就是不显示. 然后百度找了原因,修改了两处地方 一.修改 assetsPubl ...

随机推荐

  1. xpython在Windos下的安装及简单的文本打开、保存

    前几天写自动化部署脚本,用的是paramiko和shell相结合,paramiko可是实现ssh登录,文件及文件夹的上传下载,这些功能,然后一直想自己写个东西出来,于是就想把这些功能我把他放到图形化界 ...

  2. 访问器 & 修改器

    访问器 model /** * 定义一个访问器 当 Eloquent 尝试获取 title 的值时,将会自动调用此访问器(查詢時自動調用) * @author jackie <2019.02.1 ...

  3. System类学习笔记

    最近在学习源码的过程中发现:很多深层次的代码都用到了一个类System类,所以决定对System类一探究竟 本文先对System类进行了剖析,然后对System类做了总结 一.首先对该类的中的所有字段 ...

  4. getattribute

    属性访问拦截器  class Itcast(object): def __init__(self,subject1): self.subject1 = subject1 self.subject2 = ...

  5. 学习笔记之Python爬虫

    Python 爬虫介绍 | 菜鸟教程 http://www.runoob.com/w3cnote/python-spider-intro.html https://blog.csdn.net/sina ...

  6. Qt中三种解析xml的方式

    在下面的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种方式的代码.虽然,这个代码时通过调用Qt的函数实现的,但是,很多开源的C++解析xml的库,甚至很多其他语言解析xml的库,都和下面 ...

  7. winCVS 使用的一个小要点

    对于版本管理软件CVS,可以在Linux中使用命令来管理. 但是 在windows 界面下,也可以使用 winCVS 工具来管理. 现在 讲一下 如何 在 winCVS 登陆 CVS 帐号 和 密码: ...

  8. python中定义的颜色

    平时学习工作中,我们经常会接触到一些大佬写的Python实用工具,运行起来总会显示出五颜六色的背景,相关的定义在matplotlib模块中,为方便使用,这里给大家展示一下在这个模块中都定义了哪些选颜色 ...

  9. bower install的时候报错

    安装错误提示:C:\Scott>bower install bootstrap bower not-cached git://github.com/twbs/bootstrap.git#* bo ...

  10. django之 使用py文件操作django项目中的表

    要想在一个另外的py文件中操作django,可以使用如下的代码 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE",' ...