Vue Router中应对路由参数变动的策略(watch监听与导航守卫应用)

路由参数变动的探讨

在应用中利用路由参数,例如从路径 /user/foo 转向 /user/bar,原有的组件实例会被重用以提高效率,因为这两个路径共享同一组件。此机制虽提升了性能,但也意味着组件的生命周期钩子将不再触发,需要另寻他径监控此类变化。

监视路由参数变更策略
策略一:利用 Watcher 监听
  • 方法一:直接在 watch 中定义对 $route 的监听,当路由变化时,自动执行对应的函数打印出新旧路由信息。

watch: {
  $route(to, from) {
    console.log('新路由:', to);
    console.log('旧路由:', from);
  }
},
  • 方法二:采用更详细的配置,通过 handler 函数响应变更,并可设置 deep: true 进行深度监听

watch: {
  $route: {
    handler(to, from) {
      console.log('新路由:', to);
      console.log('旧路由:', from);
    },
    deep: true
  }
},
  • 方法三:绑定自定义方法处理路由变化,如 getPath

watch: {
  '$route': 'getPath'
},
methods: {
  getPath(to, from) {
    console.log('当前路由路径:', this.$route.path);
  }
},
实践案例
  • 案例1:仅在查询参数 id 变化时触发初始化数据加载。

watch: {
  '$route'(to, from) {
    if (to.query.id !== from.query.id) {
      this.id = to.query.id;
      this.init(); // 重新加载数据
    }
  }
},
  • 案例2:进入路由或路由参数变化时立即执行 init 方法。

watch: {
  '$route': {
    handler: 'init',
    immediate: true
  }
}

为了确保组件根据路由参数变化重新渲染,可为 <router-view> 添加唯一 key,如使用 $route.fullPath

<router-view :key="$route.fullPath"></router-view>
策略二:应用导航守卫
  • beforeRouteEnter:在组件渲染前调用,因此时组件实例未创建,需通过 next(vm => {}) 访问实例。

beforeRouteEnter(to, from, next) {
  console.log('进入前守卫触发');
  next(vm => {
    console.log('组件实例:', vm);
  });
},
  • beforeRouteUpdate:路由更新但组件复用时触发,可用于更新组件数据。

beforeRouteUpdate(to, from, next) {
  console.log('路由更新守卫触发');
  next();
},
  • beforeRouteLeave:离开当前路由前调用,可进行确认提示等操作。

beforeRouteLeave(to, from, next) {
  const isConfirmed = window.confirm('确定离开此页?');
  if (isConfirmed) {
    console.log('离开路由守卫确认离开');
    next();
  } else {
    next(false); // 阻止导航
  }
},

以上方法确保了路由参数变化时,无论是通过监听还是守卫机制,都能有效地响应并执行相应的逻辑处理。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值