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 相关文章推荐
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
Nov 30 Javascript
js获取当前地址 JS获取当前URL的示例代码
Feb 26 Javascript
动态载入js提高网页打开速度的方法
Jul 04 Javascript
JavaScript中的数学运算介绍
Dec 29 Javascript
JS实现改变HTML上文字颜色和内容的方法
Dec 30 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 Javascript
JS设计模式之单例模式(一)
Sep 29 Javascript
Vue实现PopupWindow组件详解
Apr 28 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
Jun 10 jQuery
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
javascript实现时钟动画
Dec 03 Javascript
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
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
数字转英文
2006/12/06 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
Python的另外几种语言实现
2015/01/29 Python
Python常用知识点汇总
2016/05/08 Python
python实现彩票系统
2020/06/28 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
深入了解python列表(LIST)
2020/06/08 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
挪威手表购物网站:Klokker
2016/09/19 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
拓展培训心得体会
2014/01/04 职场文书
财务部岗位职责
2015/02/03 职场文书
召开会议通知范文
2015/04/15 职场文书
教师节领导致辞
2015/07/29 职场文书
python中的None与NULL用法说明
2021/05/25 Python