解决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 相关文章推荐
niceTitle 基于jquery的超链接提示插件
May 31 Javascript
基于jquery的页面划词搜索JS
Sep 14 Javascript
JS如何判断移动端访问设备并解析对应CSS
Nov 27 Javascript
Javascript节点关系实例分析
May 15 Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 Javascript
vue监听滚动事件实现滚动监听
Apr 11 Javascript
vue中如何实现变量和字符串拼接
Jun 19 Javascript
让Vue也可以使用Redux的方法
May 23 Javascript
微信小程序开发之tabbar图标和颜色的实现
Oct 17 Javascript
Vue 实现输入框新增搜索历史记录功能
Oct 15 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中使用sockets:从新闻组中获取文章
2006/10/09 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php 变量未定义等错误的解决方法
2011/01/12 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
网页自动跳转代码收集
2009/09/27 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python检测网络延迟的代码
2018/05/15 Python
python实现猜数字小游戏
2020/03/24 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
python3将变量输入的简单实例
2020/08/19 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
自考生自我鉴定范文
2013/10/01 职场文书
导游的职业规划书范文
2013/12/27 职场文书
教师岗位职责范本
2013/12/29 职场文书
铁路个人事迹材料
2014/01/30 职场文书
2014年财政所工作总结
2014/11/22 职场文书
2014年行政人事工作总结
2014/12/09 职场文书