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获取选中radio对应的值(一句代码)
Jun 03 Javascript
jquery的选择器的使用技巧之如何选择input框
Sep 22 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
Oct 09 Javascript
Node.js中使用jQuery的做法
Aug 17 Javascript
jQuery的事件预绑定
Dec 05 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
Dec 30 Javascript
JavaScript日期对象(Date)基本用法示例
Jan 18 Javascript
React 高阶组件入门介绍
Jan 11 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
Feb 27 Javascript
vue中倒计时组件的实例代码
Jul 06 Javascript
vue路由插件之vue-route
Jun 13 Javascript
使用vue中的混入mixin优化表单验证插件问题
Jul 02 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验证码类代码分享(已封装成类)
2011/07/17 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
php轻松实现文件上传功能
2016/03/03 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
详解微信UnionID作用
2019/05/15 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
delegate与普通函数的区别
2014/01/22 面试题
水产养殖学应届生求职信
2013/09/29 职场文书
家长对学生的评语
2014/04/18 职场文书
个人担保书格式范文
2014/05/12 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python