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.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
Jan 15 Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 Javascript
JavaScript实现添加、查找、删除元素
Jul 02 Javascript
jQuery获取剪贴板内容的方法
Jun 16 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
Jun 17 Javascript
livereload工具实现前端可视化开发【推荐】
Dec 23 Javascript
js 性能优化之快速响应的用户界面
Feb 15 Javascript
基于JavaScript实现多级菜单效果
Jul 25 Javascript
vue中使用localstorage来存储页面信息
Nov 04 Javascript
jQuery实现ajax回调函数带入参数的方法示例
Jun 26 jQuery
javascript实现动态时钟的启动和停止
Jul 29 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
Nov 26 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
Yii配置文件用法详解
2014/12/04 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
js 图片轮播(5张图片)
2008/12/30 Javascript
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
window.location.hash 属性使用说明
2010/03/20 Javascript
js中的string.format函数代码
2020/08/11 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
Prototype框架详解
2015/11/25 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
Python中运行并行任务技巧
2015/02/26 Python
Python socket编程实例详解
2015/05/27 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
说出数据连接池的工作机制是什么?
2013/04/19 面试题
C语言基础笔试题
2013/04/27 面试题
DataList 能否分页,请问如何实现?
2015/05/03 面试题
目标管理责任书
2014/04/15 职场文书
我的理想演讲稿
2014/04/30 职场文书
无传销社区工作方案
2014/05/13 职场文书
篮球社团活动总结
2014/06/27 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
公司表扬信格式
2015/05/04 职场文书
MSSQL基本语法操作
2022/04/11 SQL Server
JavaScript设计模式之原型模式详情
2022/06/21 Javascript
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android