解决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 相关文章推荐
使用onbeforeunload属性后的副作用
Mar 08 Javascript
jquery选择器、属性设置用法经验总结
Sep 08 Javascript
js简单的表格添加行和删除行操作示例
Mar 31 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
Aug 11 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
Aug 10 Javascript
jQuery插件扩展extend的简单实现原理
Jun 24 Javascript
js判断空对象的实例(超简单)
Jul 26 Javascript
node.js发送邮件email的方法详解
Jan 06 Javascript
ES6模块化的import和export用法方法总结
Aug 08 Javascript
详解如何在Vue项目中发送jsonp请求
Oct 25 Javascript
JS实现横向轮播图(初级版)
Jun 24 Javascript
浅谈vue 组件中的setInterval方法和window的不同
Jul 30 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
PHP实现的DES加密解密实例代码
2016/04/06 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
原始的js代码和jquery对比体会
2013/09/10 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
Python使用multiprocessing创建进程的方法
2015/06/04 Python
python模块smtplib学习
2018/05/22 Python
Python操作MySQL数据库的方法
2018/06/20 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
商场经理竞聘演讲稿
2014/01/01 职场文书
英文推荐信格式范文
2014/05/09 职场文书
假释思想汇报范文
2014/10/11 职场文书
销售助理岗位职责
2015/02/11 职场文书
风之谷观后感
2015/06/11 职场文书
承兑汇票延期证明
2015/06/23 职场文书
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby
python多次执行绘制条形图
2022/04/20 Python
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers