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 相关文章推荐
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
Jul 26 Javascript
javascript attachEvent绑定多个事件执行顺序问题
Oct 20 Javascript
js/jquery获取文本框输入焦点的方法
Mar 04 Javascript
JS加载器如何动态加载外部js文件
May 26 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
Sep 01 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
Sep 28 Javascript
Bootstrap布局之栅格系统学习笔记
May 04 Javascript
微信小程序实现下载进度条的方法
Dec 08 Javascript
基于Vue渲染与插件的加载顺序的问题详解
Mar 05 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
Aug 22 Javascript
vue开发中遇到的问题总结
Apr 07 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
Aug 21 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中SimpleXML函数用法分析
2014/11/26 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
高级人员简历的自我评价分享
2013/11/03 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers