解决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 相关文章推荐
JavaScript控制两个列表框listbox左右交换数据的方法
Mar 18 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
Mar 25 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 Javascript
js实现可旋转的立方体模型
Oct 16 Javascript
js实现增加数字显示的环形进度条效果
Feb 05 Javascript
webpack开发跨域问题解决办法
Aug 03 Javascript
深入理解React高阶组件
Sep 28 Javascript
微信小程序实现图片懒加载的示例代码
Dec 13 Javascript
微信小程序如何获取群聊的openGid以及名称详解
Jul 17 Javascript
基于JS实现操作成功之后自动跳转页面
Sep 25 Javascript
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
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
一个用于网络的工具函数库
2006/10/09 PHP
PHP学习之整理字符串
2011/04/17 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
基于JQuery的日期联动实现代码
2011/02/24 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
Python中优化NumPy包使用性能的教程
2015/04/23 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
python中使用while循环的实例
2019/08/05 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
岗位职责范本
2013/11/23 职场文书
自我评价如何写好?
2014/01/05 职场文书
交通安全教育制度
2014/02/02 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
使用pytorch实现线性回归
2021/04/11 Python
Django实现聊天机器人
2021/05/31 Python