beforeRouteUpdate导航守卫使用注意

前言

在使用 vue-router 的组件内的守卫 beforeRouteUpdate (2.2 新增)时,需要注意组件内守卫获取路由参数的时机。
beforeRouteUpdate 当组件内子路由发生变化时,会出发该导航守卫。

环境

  • vue 2.5.2
  • element-ui: 2.6.1

效果

当路由更新之后,可以从 this.$route 中获取到 params 中的参数。
在这里插入图片描述

代码

index.vue

<template>
  <section>
    <el-button size="mini" @click="toA">A组件</el-button>
    <el-button type="primary" size="mini" @click="toB">B组件</el-button>
    <router-view />
  </section>
</template>

<script>
export default {
  beforeRouteUpdate (to, from, next) {
    console.log('路由更新之前:从to获取参数', to.params, '从this.$route获取参数', this.$route.params)
    next()
    console.log('路由更新之后:从to获取参数', to.params, '从this.$route获取参数', this.$route.params)
  },
  methods: {
    toA () {
      this.$router.push({
        path: '/index/a/wj'
      })
    },
    toB () {
      this.$router.push({
        path: '/index/b',
        query: {
          name: 'jj'
        }
      })
    }
  }
}
</script>

a.vue

<template>
  <section>
    组件A
  </section>
</template>

b.vue

<template>
  <section>
    组件B
  </section>
</template>

router

export default new Router({
  routes: [
    {
      path: '/index',
      name: 'index',
      component: Index,
      children: [
        {
          path: 'a/:name',
          name: 'a',
          component: A
        },
        {
          path: 'b',
          name: 'b',
          component: B
        }
      ]
    },
  ]
})

总结

当使用 beforeRouteUpdate 导航守卫时,应该等 next() 函数执行后,再获取 paramsquery 中的参数。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Vue3 中,路由导航守卫使用方式与 Vue2 有些不同。 首先,在创建 Vue Router 实例时,需要使用 `createRouter` 方法而非 `new VueRouter` 方法。 ```js import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ history: createWebHistory(), routes: [...] }) ``` 接下来,在路由配置中,使用 `beforeRouteEnter`、`beforeRouteUpdate` 和 `beforeRouteLeave` 代替 Vue2 中的 `beforeRouteEnter`、`beforeRouteUpdate` 和 `beforeRouteLeave` 钩子函数。 ```js const routes = [ { path: '/', name: 'Home', component: Home, beforeRouteEnter(to, from, next) { // 在进入路由前执行 next() }, beforeRouteUpdate(to, from, next) { // 在路由更新前执行 next() }, beforeRouteLeave(to, from, next) { // 在离开路由前执行 next() } }, // ... ] ``` 需要注意的是,在 Vue3 中,`beforeRouteEnter` 钩子函数不能直接访问组件实例(`this`),需要使用回调函数来访问。 ```js beforeRouteEnter(to, from, next) { next(vm => { // 在进入路由后执行,可以访问组件实例 console.log(vm) }) } ``` 另外,`beforeRouteUpdate` 钩子函数只有在路由参数发生变化时才会触发。 完整示例: ```js import { createRouter, createWebHistory } from 'vue-router' const Home = { /* ... */ } const About = { /* ... */ } const router = createRouter({ history: createWebHistory(), routes: [ { path: '/', name: 'Home', component: Home, beforeRouteEnter(to, from, next) { console.log('beforeRouteEnter') next() }, beforeRouteUpdate(to, from, next) { console.log('beforeRouteUpdate') next() }, beforeRouteLeave(to, from, next) { console.log('beforeRouteLeave') next() } }, { path: '/about', name: 'About', component: About } ] }) export default router ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值