问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

vue中通过history api拦截浏览器的前进后退按钮事件

发布网友 发布时间:2022-09-07 13:46

我来回答

1个回答

热心网友 时间:2024-11-25 10:05

现在vueRouter的模式基本都是history模式,它的实现是基于原生事件popstate来实现的。
先看看MDN文档对这个api的解释:

也就是说我们点击浏览器的前进、后退按钮或者在js中执行history.back() history.forward() 就会触发popstate事件。

那这个apivueRouterhistory模式有什么关系呢?
我们知道vue项目其实是个单页应用,大致结构如下:

所以我们在项目中各种跳转切换页面,都不会去请求html资源,都是在一个html中完成dom切换,也就是更换route-view标签里面的内容,但是我们却可以通过浏览器的前进后退按钮进行页面切换,实现的关键就是去监听popstate事件,根据相关信息去更换route-view标签里面的内容。

到这里需要再介绍一个apihistory.pushstate
同样看一下MDN文档的介绍:

这个api会往浏览器的历史栈添加一个状态,举个不太切当的例子:
比如现在在A页面,然后从A页面跳转到B页面,然后在B页面执行history.pushState() ,此时点击浏览器的后退按钮不会返回A页面,而还是在B页面。

两个apiMDN文档,推荐看一遍哦:
popstate
history.pushState

所以vueRouterhistory模式简单来说就是监听popstate事件,去执行切换显示dom的事件;然后当路由切换时,执行了history.pushState() ,然后手动触发一遍切换显示dom的事件。

现在回到标题,在vue中如何拦截浏览器的前进后退按钮呢?最近刚好遇到一个需求,需要此功能来实现:
有一个列表组件list

列表页有很多数据,每条数据只展示基础信息,然后点击每条item,要展示每条item的详情,跳转到详情页。
这种需求非常常见,也有很多种办法实现,比如动态路由,但是如果是动态路由,那么返回列表页的时候,列表页就会刷新,在没有keep-alive的情况。交互不太友好,我一般都是通过组件切换去实现:

列表通过v-show显示隐藏,详情组件通过v-if来触发初始化。但这样写又有一个问题,当显示详情页的时候,通过浏览器的后退按钮是回不到列表页的,因为他们在同个组件同个路由中,只能通用自己写的返回按钮来实现,为了考虑用户习惯的行为,就要实现在详情组件中点击后退按钮时能返回到列表页。

结合上面所说,在进入详情组件的时候,把这个行为当成进入一个新页面,所以就要往浏览器会话的历史堆栈中添加一个状态:

history.state储存了当前浏览器会话的信息,包括前进是什么状态,后退是什么状态,上面例子中我往里面添加了一个idhistory.pushState有三个参数,第一个参数就是state,第二个参数可以忽略,第三个参数url可选,vueRouter的切换就是通过第三个参数来指定,如果不传第三个参数,当前url就不会改变。

当执行了上面的goDetail方法后,就会显示详情组件。假如列表页的路由的 /list,从 /home路由跳转过来的,那当显示详情页的时候,点击浏览器的后退按钮,因为已经执行了history.pushState,所以不会返回到/home路由,还是在/list路由。
那么怎么实现当在详情组件的时候,点击后退按钮隐藏详情组件,显示列表呢?
这时候就需要监听popstate事件了,我在history.pushState的时候,往state中添加了一个标识,keyid,通过判断是否有这个标识来切换组件:

当显示详情组件的时候,点击后退按钮,触发了popstate事件,history.state回到未执行history.pushState的状态,也就是history.state没有id这个标识,所以会隐藏掉详情组件;此时,再点击浏览器的前进按钮,history.state就会返回到执行了history.pushState的状态,有id这个标识,就会显示详情组件。
这样就显示了通过浏览器的前进后退来控制同个路由下组件的切换。

本文基于在一个组件中切换列表与某条数据的详情需求来说,对于涉及到的两个history api还有很多理解不足的地方,如果你有更好的见解,请指教。

我是鸭子,祝你幸福。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 Vue 页面跳转提示和回退问题 [vue-router4快速入门] 1.页面跳转的两种方式 用于做麻绳的成分主要来自于植物的a韧皮部的形成层c木质部的水 广东做麻绳用的是什么麻来做的? 古代人是怎么知道制作麻绳,用木头制作桌椅的方法? 画夹怎么用啊? solidworks怎么画夹子 悍马人(HMR),的产品有哪些类? HMR(悍马人),请知情者介绍详情! 电子元件hmr是什么 刑事拘留公司会查到吗 被拘留过找工作会查出来吗 为什么拘留过哪个公司都能查到 北京著名景点有那些 工商银行储蓄卡年费 tcl空调u品系列为什么下架 空调35U中字母U代表什么 已被封禁怎么办? 我的被永久封号了,怎么办? 微信的朋友圈和微信群被永久封号了,怎么办呢? 给起个带金,带水的网名,部首也行,要求意境积极向上,最好有古风... 好曰子歌词 哪里可以下载气压传动机械手CAD图纸。论文用 苹果6怎么解除200M流量限制,苹果6如何解除200M流量限制 苹果微信手写怎么设置 苹果手机微信手写输入怎么设置 百度网盘怎么退出登录 百度网盘退出登录在哪 男人说女人像河蚌是什么意思? 网络钓蚌指的是 威博电热水器很垃圾,热水器上还贴着“内胆保用5年”,用了不到3年就漏 ... 威博电热水器为什么一加热水箱里就有叮当的声音、热水器才买3个月 威博电热水器内胆漏水怎么办厂家还不管杂牌 东京金融人死了还不了会有什么后果 华山景区上山有索道吗 华山索道是那个国家产品 华山东锋有索道吗? 华为智能门锁如何设置临时密码 孕妇吃什么降血糖?原来孕妇越饿血糖越高!涨知识了! 怀孕13周 血糖偏高 怎么办才能降血糖