【vue-router源码】十二、useRoute、useRouter、useLink源码分析

前言

【vue-router源码】系列文章将带你从0开始了解 vue-router 的具体实现。该系列文章源码参考 vue-router v4.0.15
源码地址: github.com/vuejs/router
阅读该文章的前提是你最好了解 vue-router 的基本使用,如果你没有使用过的话,可通过 vue-router官网 学习下。

该篇文章将分析 useRoute useRouter useLink 的实现。

使用

<script lant="ts" setup>
import { useRouter, useRoute } from 'vue-router'
// router为创建的router实例
const router = useRouter()
// currentRoute当前路由
const currentRoute = useRoute()
</script>

使用 useLink 可以自定义我们自己的 RouterLink ,如下面自定的 MyRouterLink ,如果是外部链接,我们需要让它新打开一个页面。 ¨G1G MyRouterLink 使用: ¨G2G ¨K9K ¨G3G useRouter useRoute 都是使用 inject 来进行获取对应值。对应值都是在 install 过程中注入的。 ¨G4G ¨K10K ¨G5G 在进行路由跳转时,一些特殊情况下是不能跳转的,这些情况包括: <ol> <li>按住了window (MAC的 commond )键、 alt 键、 ctrl 键、 shift 键中的任一键</li> <li>调用过 e.preventDefault() </li> <li>右键</li> <li> target='_blank'`

function guardEvent(e: MouseEvent) {
  // don't redirect with control keys
  if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return
  // don't redirect when preventDefault called
  if (e.defaultPrevented) return
  // don't redirect on right click
  if (e.button !== undefined && e.button !== 0) return
  // don't redirect if `target="_blank"`
  // @ts-expect-error getAttribute does exist
  if (e.currentTarget && e.currentTarget.getAttribute) {
    // @ts-expect-error getAttribute exists
    const target = e.currentTarget.getAttribute('target')
    if (/\b_blank\b/i.test(target)) return