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 相关文章推荐
理解Javascript_05_原型继承原理
Oct 13 Javascript
一个JS的日期格式化算法示例
Jul 31 Javascript
javascript 获取函数形参个数
Jul 31 Javascript
JavaScript中的some()方法使用详解
Jun 09 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
Oct 25 Javascript
JS获取数组最大值、最小值及长度的方法
Nov 24 Javascript
jQuery中的100个技巧汇总
Dec 15 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
Feb 10 Javascript
ajax请求+vue.js渲染+页面加载的示例
Feb 11 Javascript
使用js实现一个简单的滚动条过程解析
Sep 10 Javascript
js实现双人五子棋小游戏
May 28 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下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
token 机制和实现方式
2020/12/15 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
Django实现表单验证
2018/09/08 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
python 命名规范知识点汇总
2020/02/14 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
公司员工的自我评价范例
2013/11/01 职场文书
行政助理的职责
2013/11/14 职场文书
村安全生产责任书
2014/08/25 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
2014年团队工作总结
2014/11/24 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
门店店长岗位职责
2015/04/14 职场文书
推广普通话主题班会
2015/08/17 职场文书
合理化建议书范文
2015/09/14 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
经销商会议开幕词
2016/03/04 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫
vue修饰符.capture和.self的区别
2022/04/22 Vue.js