vue 阻止页面跳转 , 询问是否离开页面 , 确定后离开, 禁用浏览器返回功能
项目中遇到如下需求
- 数据录入页面 , 用户没有保存数据的时候, 发生路由跳转, 浏览器返回 时加以阻止 , 并给出提示 , 询问未保存, 是否离开页面
- 点击保存以后 , 可以返回 , 自动跳转 , 进入下一个页面不加限制
实现过程 : 两个方面入手 ,
- 浏览器返回功能 , 需要处理,
- vue-router 需要处理
实现方法(两者结合)
浏览器返回处理方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // mounted()的时候我们调用原生js , 操作一下history< br >< br >history.pushState(null, null, document.URL); // 主要是在不刷新浏览器的情况下,创建新的浏览记录并插入浏览记录队列中。 这步非常重要 , 不然的话当我们点击返回按钮 , 虽然页面阻止了跳转 , 但是url地址栏却发生了变化 window.onpopstate = function (event) { // alert("location: " + document.location + ", state: " + JSON.stringify(event.state)); history.pushState(null, null, document.URL);< br >//使用element that .$confirm("离开页面 , bom将不做保存, 请确认已经保存", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }) .then(() => { that.deleteFile();//业务功能 , 可以忽略 that.$router.push({ name: "跳转到页面的name", params: { status: true } });//此处手动增加了状态 , 主要为了监听路由跳转的时候判断是否进行跳转 , 看下面代码 }) .catch(() => { // alert("window") return false; }); }; |
vue-router的处理方式
// vue路由的钩子函数 , 可以放在mouted的同级
beforeRouteLeave(to, from, next) { console.log(to); console.log(from); if (to.params.status) {//就是上面的状态 如果是true , 则不询问是否保存, 当然这个方法比较笨, 大家可以使用更优雅的方式 next(); } else { this.$confirm("离开页面 , bom将不做保存, 请确认已经保存", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }) .then(() => { this.deleteFile();//业务功能请忽略 next(); }) .catch(() => { // alert("router") }); } },
基本上就实现了 , 没有经过测试 , 具体的bug以后有问题再修改吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现