解决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 相关文章推荐
基于Web标准的UI组件 — 树状菜单(2)
Sep 18 Javascript
JQuery Tab选项卡效果代码改进版
Apr 01 Javascript
jQuery取得select选择的文本与值的示例
Dec 09 Javascript
超棒的响应式布局jQuery插件Freetile.js
Nov 17 Javascript
开启BootStrap学习之旅
May 04 Javascript
轻松理解JavaScript闭包
Mar 14 Javascript
jQuery鼠标悬停内容动画切换效果
Apr 27 jQuery
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
jQuery each和js forEach用法比较
Feb 27 jQuery
详解超简单的react服务器渲染(ssr)入坑指南
Feb 28 Javascript
javascript中的this作用域详解
Jul 15 Javascript
javascript实现摄像头拍照预览
Sep 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
thinkPHP实现表单自动验证
2014/12/24 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
简单的php购物车代码
2020/06/05 PHP
javascript 打印页面代码
2009/03/24 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Python中文编码知识点
2019/02/18 Python
详解python解压压缩包的五种方法
2019/07/05 Python
pytorch的batch normalize使用详解
2020/01/15 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
一组SQL面试题
2016/02/15 面试题
南京青奥会口号
2014/06/12 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
Python基础之元编程知识总结
2021/05/23 Python