Vue Router 刷新、离开页面自定义弹框

博客介绍了Vue Router刷新、离开页面时自定义弹框的方法。使用Vue - Router导航,可利用组件内的守卫实现自定义弹框;未使用Vue - Router导航,可借助window的beforeunload事件触发浏览器默认弹框。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue Router 刷新、离开页面自定义弹框

1. 使用Vue-Router导航时可以使用组件内的守卫【可自定义弹框】
2. 没有使用Vue-Router导航时可以使用window的beforeunload事件【浏览器默认弹框】
/**
 * 组件守卫 在刷新/离开页面统一弹框 
 */
import { Modal } from "ant-design-vue";

function confirm(modalOptions) {
  Modal.confirm(Object.assign({ centered: true }, modalOptions));
}

export const ROUTER_MIXIN = {
  methods: {
    updateRouteOk() {},
    updateRouteCancle() {},
    leaveRouteOk() {},
    leaveRouteCancle() {}
  },
  mounted() {
    window.addEventListener("beforeunload", function(e) {
      e = e || window.event;
      // 兼容IE8和Firefox 4之前的版本
      if (e) {
        e.returnValue = false;
      }
      // Chrome, Safari, Firefox 4+, Opera 12+ , IE 9+
      return true;
    });
  },
  destroyed() {
    window.removeEventListener("beforeunload", function(e) {
      e = e || window.event;
      // 兼容IE8和Firefox 4之前的版本
      if (e) {
        e.returnValue = false;
      }
      // Chrome, Safari, Firefox 4+, Opera 12+ , IE 9+
      return true;
    });
  },
  //   props: {
  //     updateRouteOk: {
  //       type: [Function],
  //       require: false
  //     },
  //     updateRouteCancle: {
  //       type: [Function],
  //       require: false
  //     },
  //     leaveRouteOk: {
  //       type: [Function],
  //       require: false
  //     },
  //     leaveRouteCancle: {
  //       type: [Function],
  //       require: false
  //     }
  //   },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
    let vm = this;
    confirm({
      title: "刷新页面",
      content: () => (
        <div>
          <span style="color:red;">确定要刷新该页面吗?</span>
        </div>
      ),
      cancelText: "取消",
      okText: "刷新",
      okType: "danger",
      onOk() {
        vm.updateRouteOk();
        next();
      },
      onCancel() {
        vm.updateRouteCancle();
        next(false);
      }
    });
  },
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
    let vm = this;
    confirm({
      title: "离开页面",
      content: () => (
        <div>
          <span style="color:red;">确定要离开该页面吗?</span>
        </div>
      ),
      cancelText: "取消",
      okText: "离开",
      okType: "danger",
      onOk() {
        vm.leaveRouteOk();
        next();
      },
      onCancel() {
        vm.leaveRouteCancle();
        next(false);
      }
    });
  }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值