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困惑—包装集 DOM节点
Oct 16 Javascript
return false,对阻止事件默认动作的一些测试代码
Nov 17 Javascript
ajax请求get与post的区别总结
Nov 04 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
Jan 13 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
Feb 11 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
Apr 27 Javascript
jQuery原型属性和原型方法详解
Jul 07 Javascript
JavaScript设计模式开发中组合模式的使用教程
May 18 Javascript
轮播图组件js代码
Aug 08 Javascript
JS基于面向对象实现的选项卡效果示例
Dec 20 Javascript
JS判断数组那点事
Oct 10 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
PHP memcache扩展的三种安装方法
2009/04/26 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
js树形控件脚本代码
2008/07/24 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
JS常用知识点整理
2017/01/21 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
Django多数据库的实现过程详解
2019/08/01 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
如何查找网页漏洞
2016/06/22 面试题
材料会计岗位职责
2014/03/06 职场文书
法人委托书范本
2014/09/15 职场文书
公司周年庆典标语
2014/10/07 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
使用python绘制分组对比柱状图
2022/04/21 Python
nginx 添加http_stub_status_module模块
2022/05/25 Servers