• vue指定返回键的路由(点击浏览器的返回按钮/beforeRouterLeave) 吴小明


    有A、B、C三个页面,跳转顺序为A-->B-->C-->B-->A

    从A进入B,再从B进入C,从C返回到B,此时,点击浏览器的返回按钮,需要回到A,但是却到达了C

    这个过程的路由栈为A --> B --> C --> B,此时点击浏览器的返回按钮,铁定是返回C了

    解决办法:

    第一种方法:B中监听浏览器返回按钮

      mounted() {
        if (window.history && window.history.pushState) {
          history.pushState(null, null, document.URL)
          window.addEventListener('popstate', this.back)
        }
      },
      destroyed() {
        window.removeEventListener('popstate', this.back)
      },
      methods: {
        back() {
          this.$router.push({ name: 'A' })
        }
      }

    第二种方法:C中返回到B时,不要使用push,改用go(-1)或back()

    this.$router.go(-1)

    此时的路由栈为 A --> B,所以在B中点击浏览器的返回按钮,就会返回到A

    question:为什么不用replace?

      C中使用replace返回,本质上是用B替换了C页面,此时页面显示的是B,但是路由栈中路由停留在C。

      此时点击返回按钮需要点2次才能回到A。第一次点返回,是C到B,因为页面此时已经显示B,所以没有反应;第二次点返回,才是B到A

    第三种方法:beforeRouterLeave(有些情况下,必须要使用push跳转,第二种方法就不适用了)

      场景:从【 A列表】跳转至【B新增】,新增成功后跳转至【B列表】,此时就不能用go(-1)了

      data() {
        return {
          fromRouterName: '' // 定义一个全局变量,存储上一个URL(C)
        }
      },
      beforeRouteEnter(to, from, next) {
        next(vm => {
          vm.fromRouterName = from.name // 进入该页面时,记录上一个URL(C)----此钩子在created前执行,获取不到this,所以要使用vm
        })
      },
      beforeRouteLeave(to, from, next) {
        if (this.fromRouterName === 'C' && to.name === 'C') { // 如果是由C返回的,又进入到C这种情况,跳转至A
          next({ name: 'A' })
        } else {
          next() // 默认跳转
        }
      }
  • 相关阅读:
    ubuntu18 faster-rcnn
    osgViewer应用基础
    error C2086: “int WINGDIAPI”: 重定义
    test5
    test3
    test2
    Kinect关节数据
    MySQL乱码问题以及utf8mb4字符集
    mysql5.7执行sql语句报错:In aggregated query without GROUP BY, expression #1 of SELECT list contains nonagg
    yum安装软件报错:curl#6
  • 原文地址:https://www.cnblogs.com/wuqilang/p/15568150.html
Copyright © 2020-2023  润新知