Vue利用History记录上一页面的数据方法实例


Posted in Javascript onNovember 02, 2018

前言

本文主要介绍的是Vue利用History记录上一页面数据的相关内容,vue使用history后,能够使得url更加漂亮,也就是不再有‘#'的问题,下面话不多说了,来一起看看详细的介绍吧

UI

Vue利用History记录上一页面的数据方法实例

Vue利用History记录上一页面的数据方法实例

需求

从列表页的第二页进入详情页,返回时列表页仍然显示在第二页;

从列表页的第二页进入详情页,返回时列表页的筛选条件仍然存在。

<!--more-->

技术选择

  • 使用vue-router组件,通过this.$router.push({path: path, query: query});方式,将页码和选择条件作为参数存储在url中,这种方式在上面的UI设计中是可行的,但是当列表页中包含tab组件时(分页组件是公用的),会因为push的因素(因为push会打开新页面)导致一些问题(PS:也可能是本人技术能力的原因),未实现。
  • 使用History API(HTML5开始支持),通过history.replaceState方式,将页码作为参数存储在url中,将选择条件存储在history中(尚不清楚数据具体是存储在哪里);通过location.hash方式获取页码;通过history.state方式获取存储的选择条件。

具体实现--技术选择2

开关

为分页组件添加一个开关(openroute),因为需要灰度上线,万一有问题,要调整的页面也只有一个。代码如下:

<script>
 export default {
 props: {
 openroute: {
 type: Boolean,
 default: () => (true)
 }
 },
 }
</script>

分页组件中存储页码和选择条件&获取页码

<script>
 export default {
 methods: {
 fetchData(page) {
 //请求参数
 let params = this.params;
 //请求页码
 let newPage;
 //openroute处理
 if (this.openroute) {
 //为url添上#page
 if (page) {
 history.replaceState(params.data, document.title, "#" + page);
 } else {
 if (history.state) {
 if (!history.state.key && location.hash && location.hash.split("#") && location.hash.split("#")[1]) {
 if (JSON.stringify(history.state) !== JSON.stringify(params.data)) { //选择条件变更则请求第一页
  history.replaceState(params.data, document.title, "#1");
 } else {
  history.replaceState(params.data, document.title, "#" + location.hash.split("#")[1]);
 }
 } else {
 history.replaceState(params.data, document.title, "#1");
 }
 } else {
 if (location.hash && location.hash.split("#") && location.hash.split("#")[1]) {
 history.replaceState(params.data, document.title, "#" + location.hash.split("#")[1]);
 } else {
 history.replaceState(params.data, document.title, "#1");
 }
 }
 }
 //获取url后面的#page
 if (location.hash && location.hash.split("#") && location.hash.split("#")[1]) {
 newPage = Number(location.hash.split("#")[1]);
 } else {
 newPage = 1;
 }
 } else {
 newPage = page;
 }
 //请求数据,获得结果,传递给列表页面
 }
 }
 }
</script>

列表页面获取选择条件

目前可能是因为框架设计的问题,没法在请求数据之前通过Object.assign方式为替换初始变量,所以先这样处理(笨方法,各位大佬有解决办法麻烦指导下,谢谢):

<script>
 export default {
 data() {
 return {
 form: {
 aaa: (history.state && history.state.aaa) ? history.state.aaa : null,
 bbb: (history.state && history.state.bbb) ? history.state.bbb : null,
 ccc: (history.state && history.state.ccc) ? history.state.ccc : null
 },
 };
 }
 };
</script>

已解决,初始变量不需要动,可以通过以下方式实现:

created(){
 //获取缓存的数据
 if (history.state) {
 Object.assign(this.form, history.state)
 if (this.form.key) {
 delete this.form.key
 }
 }
},

这里记录下:之前以为created方法是在分页组件的watch监听之后执行的,后来发现被误导了(因为之前是通过Object.assign(true, this.form, history.state)方式实现数据赋值的,但是并没有成功)。下面做个小总结:

Object.assign(true, a, b);”和“Object.assign(a, b);”有什么区别?

结论:前者:改a不影响b;后者:改a影响b

分析(这篇文章有源码分析( <font color='red'>求解答:WebStorm中如何关联源码?</font>),很棒):

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery 子窗口操作父窗口的代码
Sep 21 Javascript
js获取height和width的方法说明
Jan 06 Javascript
js判断输入是否为数字的具体实例
Aug 03 Javascript
javascript通过className来获取元素的简单示例代码
Jan 10 Javascript
js判断字符长度及中英文数字等
Mar 19 Javascript
js实现简单折叠、展开菜单的方法
Aug 28 Javascript
js+html5实现canvas绘制网页时钟的方法
May 21 Javascript
js正则表达式验证表单【完整版】
Mar 06 Javascript
JavaScript数组的5种迭代方法
Sep 29 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
Jan 24 Javascript
Angular开发实践之服务端渲染
Mar 29 Javascript
JavaScript 预解析的4种实现方法解析
Sep 03 Javascript
vue如何根据网站路由判断页面主题色详解
Nov 02 #Javascript
小程序实现列表点赞功能
Nov 02 #Javascript
Vue中的vue-resource示例详解
Nov 02 #Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 #Javascript
React如何解决fetch跨域请求时session失效问题
Nov 02 #Javascript
element ui table 增加筛选的方法示例
Nov 02 #Javascript
Vue请求JSON Server服务器数据的实现方法
Nov 02 #Javascript
You might like
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
材料加工硕士生求职信
2013/10/10 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
企业宣传策划方案
2014/05/29 职场文书
协会周年庆活动方案
2014/08/26 职场文书
用人单位聘用意向书
2015/05/11 职场文书
检举信的写法
2019/04/10 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
浅谈Python项目的服务器部署
2021/04/25 Python
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
Hive常用日期格式转换语法
2022/06/25 数据库