vue-router组件内的导航守卫

【示例】:
用户进入user组件之前取路由值执行alert
用户改变query参数,触发alert(等价于watch $route)
在这里插入图片描述

<script>
    export default {
        name: "User",
      mounted:function(){
          console.log('mounted')
      },
      // watch: {
      //   // 如果路由有变化,会再次执行该方法
      //   '$route': 'fetchData'
      // },
      methods:{
        fetchData:function () {
          alert('change!')
        },
        userAlert:function (name) {
          alert(`查看${name}的用户界面`)
        }
      },
      beforeRouteEnter(to,from,next) {
        console.log('User.vue:before route enter invoked');
        next(vm=>{
          vm.userAlert(to.params.name);//导航之前获取路由数据并执行方法
        });
      },
      beforeRouteUpdate(to,from,next) {//此处有this,等效于watch,每次路由参数更新触发
        console.log('User.vue:before route update invoked');
        // alert('changed')
        this.fetchData();
        next();
      },
      beforeRouteLeave(to,from,next) {
        console.log('User.vue:before route leave invoked');
        next();
      },
    }
</script>

beforeRouteEnter用来在导航之前获取路由里的params/query,并作出处理,如据此向获取数据等。这里只是给它alter出来。注意:此刻还没有this,要使用回调函数
beforeRouteUpdate用于监控组件内路由变化时,比如params或query的改变,并据其做出一些响应,等价于watch(代码里的备注内容)。已经有this了,因为之前挂载过了,现在只是更新,直接执行this.XXX();
beforeRouteLeave离开该组件时,如果是一个很大表单,用于当填写信息,不小心按了其他键要离开该组件时,给用户一个提醒判断,要不要离开。不离开不执行next(),给应用提供一些安全性。比如:

      beforeRouteLeave(to,from,next) {
       console.log('User.vue:before route leave invoked');
       const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
       if (answer) {
         next()
       } else {
         next(false)//important!不可以什么都不写,什么都不写会发生地址栏路由改变界面不变
       }
     },

效果如下:
在这里插入图片描述
想到其他用处会再补充

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值