vue 阻止页面跳转 , 询问是否离开页面 , 确定后离开, 禁用浏览器返回功能

项目中遇到如下需求

  1. 数据录入页面 , 用户没有保存数据的时候, 发生路由跳转, 浏览器返回 时加以阻止 , 并给出提示 , 询问未保存, 是否离开页面
  2. 点击保存以后 , 可以返回 , 自动跳转 , 进入下一个页面不加限制

实现过程 : 两个方面入手 , 

  1. 浏览器返回功能 , 需要处理,
  2. 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以后有问题再修改吧

posted @   JGG靖哥哥  阅读(7767)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示