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 innerHTML,outerHTML所引起的问题
Jun 04 Javascript
快速排序 php与javascript的不同之处
Feb 22 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
js实现浏览器倒计时跳转页面效果
Aug 12 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
Mar 14 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 Javascript
你应该知道的几类npm依赖包管理详解
Oct 06 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
Dec 18 Javascript
jQuery中常用动画效果函数知识点整理
Aug 19 jQuery
微信小程序上线发布流程图文详解
May 06 Javascript
浅谈Vue的响应式原理
May 30 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
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
JavaScript 注册事件代码
2011/01/27 Javascript
json数据的列循环示例
2013/09/06 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
Python实现字典依据value排序
2016/02/24 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
python实现excel读写数据
2021/03/02 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
JDO的含义
2012/11/17 面试题
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
优秀员工自荐信范文
2013/10/05 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
话题作文之诚信
2019/11/28 职场文书
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python