vue-router路由

 

vue-router

 

官网:https://router.vuejs.org/zh/installation.html

 

参考网址:https://www.cnblogs.com/SamWeb/p/6610733.html

 

导航守卫

https://router.vuejs.org/zh/guide/advanced/navigation-guards.html

 

全局的守卫和钩子

router.beforeEach 注册一个全局前置守卫

router.beforeResolve 注册一个全局解析守卫。这和 router.beforeEach 类似,因为它在每次导航时都会触发,不同的是,解析守卫刚好会在导航被确认之前、所有组件内守卫和异步路由组件被解析之后调用。

router.afterEach可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身

路由独享守卫

在路由配置上定义 beforeEnter 守卫, 只在进入路由时触发,不会在 paramsquery 或 hash 改变时触发。例如,从 /users/2 进入到 /users/3 或者从 /users/2#info 进入到 /users/2#projects。它们只有在 从一个不同的 路由导航时,才会被触发。

组件内的守卫

  • beforeRouteEnter
  • beforeRouteUpdate
  • beforeRouteLeave
const UserDetails = {
  template: `...`,
  beforeRouteEnter(to, from) {
    // 在渲染该组件的对应路由被验证前调用
    // 不能获取组件实例 `this` !
    // 因为当守卫执行时,组件实例还没被创建!
  },
  beforeRouteUpdate(to, from) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 `/users/:id`,在 `/users/1` 和 `/users/2` 之间跳转的时候,
    // 由于会渲染同样的 `UserDetails` 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 因为在这种情况发生的时候,组件已经挂载好了,导航守卫可以访问组件实例 `this`
  },
  beforeRouteLeave(to, from) {
    // 在导航离开渲染该组件的对应路由时调用
    // 与 `beforeRouteUpdate` 一样,它可以访问组件实例 `this`
  },
}

beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。

不过,你可以通过传一个回调给 next 来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数:

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通过 `vm` 访问组件实例
  })
}

注意 beforeRouteEnter 是支持给 next 传递回调的唯一守卫。对于 beforeRouteUpdate 和 beforeRouteLeave 来说,this 已经可用了,所以不支持 传递回调,因为没有必要了:

 

完整的导航解析流程

  1. 导航被触发。
  2. 在失活的组件里调用 beforeRouteLeave 守卫。
  3. 调用全局的 beforeEach 守卫。
  4. 在重用的组件里调用 beforeRouteUpdate 守卫(2.2+)。
  5. 在路由配置里调用 beforeEnter
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter
  8. 调用全局的 beforeResolve 守卫(2.5+)。
  9. 导航被确认。
  10. 调用全局的 afterEach 钩子。
  11. 触发 DOM 更新。
  12. 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

 

vue3获取当前路由的几种方式

其中第五种方法最简单

第一种

import { defineComponent,ref} from 'vue';
import { useRouter } from 'vue-router';
 
const router=useRouter
//通过实例化useRouter的router对象中,含有多个属性,其中就包含了当前路由地址,
 
console.log('router',router.currentRoute.value.fullPath);

 

第二种

import { getCurrentInstance } from 'vue';
 
const { proxy }: any = getCurrentInstance();
console.log(proxy.$router.currentRoute.value.fullPath);

通过getCurrentInstance 获取当前的组件实例,从而通过其获取router,然后获得当前路由地址

 

第三种

import {  toRaw} from 'vue';
import { useRouter } from 'vue-router';
 
let router = useRouter()
console.log(toRaw(router).currentRoute.value.fullPath);
 

通过toRaw返回其原始对象,即将实例化的router转化为useRouter

 

第四种

import { watch } from 'vue';
import { useRouter } from 'vue-router';
 
   let router = useRouter()
   watch(router,(newValue, oldValue) => {
        console.log(newValue.currentRoute.value.fullPath);},
      { immediate: true }
    );

这一种写法比较麻烦,但是逻辑比较简单,通过监听获取最新的router对象,进而获取路由地址,而且在第一次的时候,就要执行监听

 

第五种

import {  ref } from 'vue';
import { useRoute } from 'vue-router';
 
let path=ref("")
const route=useRoute()
 
path.value=route.path
 

这一种最为简单,推荐这种

posted @ 2018-08-20 18:26  泠风lj  阅读(181)  评论(0编辑  收藏  举报