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 相关文章推荐
摘自百度的图片轮换效果代码
Nov 19 Javascript
ajax 文件上传应用简单实现
Mar 03 Javascript
JavaScript对象、属性、事件手册集合方便查询
Jul 04 Javascript
原生js实现跨浏览器获取鼠标按键的值
Apr 08 Javascript
jquery实现多级下拉菜单的实例代码
Oct 02 Javascript
JS中的form.submit()不能提交表单的错误原因
Oct 08 Javascript
js格式化时间的简单实例
Nov 27 Javascript
原生JS改变透明度实现轮播效果
Mar 24 Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 Javascript
使用canvas实现一个vue弹幕组件功能
Nov 30 Javascript
使用Angular material主题定义自己的组件库的配色体系
Sep 04 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
Oct 23 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抓取页面与代码解析 推荐
2010/07/23 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
JavaScript 事件对象的实现
2009/07/13 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
Python 模拟登陆的两种实现方法
2017/08/10 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python实现单链表的方法示例
2019/09/03 Python
Python 存取npy格式数据实例
2020/07/01 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
文员岗位职责
2013/11/09 职场文书
公司领导推荐信
2013/11/12 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
擅自离岗检讨书
2014/09/12 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
带你学习MySQL执行计划
2021/05/31 MySQL
图神经网络GNN算法
2022/05/11 Python