解决vue router组件状态刷新消失的问题


Posted in Javascript onAugust 01, 2018

场景:vue-router实现的单页应用,登录页调用登录接口后,服务器返回用户信息,然后通过router.push({name: 'index', params: res.data})跳转到主页,并在主页显示数据。但是当刷新页面时,由于并不是通过登录接口进入主页,router中没有‘params: res.data'信息,主页无法获取到登录信息。

解决方案:

1、session&服务器渲染

传统的方案是,登录页和主页是单独的两个页面,登录成功后服务器生成用户信息对应的session,然后渲染主页数据,并通过响应头将sessionid传给浏览器并生成相应的cookie文件。这样下次请求页面时,浏览器会在http header带上相应的cookie,然后服务器根据cookie中的sessionid判断用户是否登录,再显示用户数据。

如果项目采用前后端分离思想,服务器只提供接口,不进行服务器渲染,那么这种办法是行不通了。

2、$route.query

我们可以在路由跳转的时候带上登录请求的参数:

router.push({name:'index', query:{username: 'xxx', password: 'xxxxxx'}})
...
this.$ajax({
 url: 'xxx',
 method: 'post',
 data: {
 username: this.$route.query.username,
 password: this.$route.query.password
 }
})

这样登录参数会被保存在url中,像这样:“ http://xxx.xxx.xxx/index?username=xxx&password=xxxxxx ”,然后在created钩子中调用登录接口来返回数据。

即使密码进行了加密,将用户名密码这类敏感信息放在url中肯定也是不合理。

3、cookie

另一个办法是把登录参数存入cookie,然后在created钩子中获取cookie中存的信息,再调用登录接口。将用户名密码存入cookie中同样不合理,改进版是登录成功后服务器返回一个token,在有效期内通过token获取用户数据。

cookie存取数据比较麻烦,因为cookie是一个字符串,保存的键值对以 "=" 链接,需要额外写操作cookie的方法。

function setCookie (name, value, exdays) {
 let date = new Date()
 date.setTime(date.getTime() + (exdays * 24 * 60 * 60 * 1000))
 let expires = 'expires=' + date.toGMTString()
 document.cookie = name + '=' + value + '; ' + expires
}
function getCookie (name) {
 name = name + '='
 let cookieArr = document.cookie.split(';')
 for (let i = 0; i < cookieArr.length; i++) {
 let cookie = cookieArr[i].trim()
 if (cookie.indexOf(name) === 0) {
  return cookie.slice(name.length)
 }
 }
 return ''
}

4、HTML5 Web存储

提到Web存储,潜意识肯定觉得很多浏览器都不支持,其实IE8及以上都支持localStorage和sessionStorage了。Vue项目最低支持IE9,所以可以放心的使用Web存储。

localStorage存储数据没有时间限制,不主动删除就不会失效。而sessionStorage是在页面或者浏览器关闭时就会失效,适合本场景应用。

我们可以把token信息存在sessionStorage中,然后每次刷新页面通过token请求数据;但是既然能够把token存储到本地,为什么不直接把常用的数据直接保存到本地呢?利用本地数据,可以减少客户端网络请求,还可以降低服务器负担。

由于sessionStorage中保存的值是字符串,直接赋值非字符串类型会先调用其toString()方法。例如执行sessionStorage.user = user,保存的值却是[object Object]。我们可以通过JSON.stringify()将需要保存的对象转为JSON字符串再保存到sessionStorage,然后在需要使用时通过JSON.parse()将字符串转回对象。

let user = {
 name: 'admin',
 address: 'xxx',
 email: 'xx@xx.xx'
}
// sessionStorage.user = user // [object Object]
sessionStorage.user = JSON.stringify(user)
...
let data = JSON.parse(sessionStorage.user)

总结

以上所述是小编给大家介绍的解决vue router组件状态刷新消失的问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
extjs4 treepanel动态改变行高度示例
Dec 17 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
一个不错的字符串转码解码函数(自写)
Jul 31 Javascript
BootStrap的JS插件之轮播效果案例详解
May 16 Javascript
vue.js绑定class和style样式(6)
Dec 09 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
Apr 25 Javascript
JS实现的缓冲运动效果示例
Apr 30 Javascript
浅析vue-router原理
Oct 19 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
Nov 05 Javascript
JavaScript判断对象和数组的两种方法
May 31 Javascript
一文搞懂redux在react中的初步用法
Jun 09 Javascript
Promise.all中对于reject的处理方法
Aug 01 #Javascript
详解es6超好用的语法糖Decorator
Aug 01 #Javascript
Vue Router去掉url中默认的锚点#
Aug 01 #Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 #Javascript
node.js遍历目录的方法示例
Aug 01 #Javascript
深入浅出理解JavaScript闭包的功能与用法
Aug 01 #Javascript
Angular路由ui-router配置详解
Aug 01 #Javascript
You might like
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
Python简单实现控制电脑的方法
2018/01/22 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
python实现雨滴下落到地面效果
2018/06/21 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
python通过实例讲解反射机制
2019/10/17 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
小学生国庆节演讲稿
2014/09/05 职场文书
硕士学位论文评语
2014/12/31 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
学前班教学反思
2016/02/24 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技