【Vue Router】017-扩展 RouterLink*

1.17 扩展 RouterLink*

1.17.1 概述

RouterLink 组件提供了足够的 props 来满足大多数基本应用程序的需求,但它并未尝试涵盖所有可能的用例,在某些高级情况下,你可能会发现自己使用了 v-slot。在大多数中型到大型应用程序中,值得创建一个(如果不是多个)自定义 RouterLink 组件,以在整个应用程序中重用它们。例如导航菜单中的链接,处理外部链接,添加 inactive-class 等。

1.17.2 扩展 RouterLink

让我们扩展 RouterLink 来处理外部链接,并在 AppLink.vue 文件中添加一个自定义的 inactive-class

<template>
  <a v-if="isExternalLink" v-bind="$attrs" :href="to" target="_blank">
    <slot />
  </a>
  <router-link
    v-else
    v-bind="$props"
    custom
    v-slot="{ isActive, href, navigate }"
  >
    <a
      v-bind="$attrs"
      :href="href"
      @click="navigate"
      :class="isActive ? activeClass : inactiveClass"
    >
      <slot />
    </a>
  </router-link>
</template>

<script>
import { RouterLink } from 'vue-router'

export default {
  name: 'AppLink',

  props: {
    // 如果使用 TypeScript,请添加 @ts-ignore
    ...RouterLink.props,
    inactiveClass: String,
  },

  computed: {
    isExternalLink() {
      return typeof this.to === 'string' && this.to.startsWith('http')
    },
  },
}
</script>

如果你喜欢使用渲染函数或创建 computed 属性,你可以使用 Composition API 中的 useLink

import { RouterLink, useLink } from 'vue-router'

export default {
  name: 'AppLink',

  props: {
    // 如果使用 TypeScript,请添加 @ts-ignore
    ...RouterLink.props,
    inactiveClass: String,
  },

  setup(props) {
    // toRef 允许我们提取一个 prop 并保持它的响应
    // https://v3.vuejs.org/api/refs-api.html#toref
    const { navigate, href, route, isActive, isExactActive } = useLink(
      toRef(props, 'to')
    )

    // profit!

    return { isExternalLink }
  },
}

在实践中,你可能希望将你的 AppLink 组件用于应用程序的不同部分。例如,使用 Tailwind CSS,你可以用所有的类创建一个 NavLink.vue 组件:

<template>
  <AppLink
    v-bind="$attrs"
    class="inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 focus:outline-none transition duration-150 ease-in-out hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out"
    active-class="border-indigo-500 text-gray-900 focus:border-indigo-700"
    inactive-class="text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:text-gray-700 focus:border-gray-300"
  >
    <slot />
  </AppLink>
</template>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`vue-router` 是 Vue.js 应用中常用的路由管理库,它允许你方便地在单页面应用 (SPA) 中导航。在 Vue 3 中,`router-link` 组件是用于创建可点击的链接,当用户点击这些链接时,会根据路由规则跳转到相应的视图。 使用 `router-link` 的基本步骤如下: 1. 首先,在你的 Vue 项目中,确保已经安装了 `vue-router`,可以通过运行 `npm install vue-router` 或者 `yarn add vue-router` 来添加。 2. 在你的 Vue 组件中,引入 `RouterLink` 组件: ```html <template> <router-link :to="{ name: 'yourRouteName', params: { paramKey: 'paramValue' } }"> <!-- 这里是链接的文本或标签 --> <a>导航到路由</a> </router-link> </template> ``` - `:to` 属性用于设置链接的目标路由,可以是一个字符串(例如 `/user/:id`)或一个对象(如上面的例子所示,包含名称 `name` 和参数 `params`)。 - 如果你想传递动态参数,可以在 `params` 对象中指定,如 `:paramKey`。 3. 配置路由: 在 `src/router/index.js` 或 `src/router.ts` 中配置路由,包括定义路由名称、路径、组件等: ```js import { createRouter, createWebHistory } from 'vue-router'; import Home from '@/views/Home.vue'; import User from '@/views/User.vue'; const routes = [ { path: '/', name: 'Home', component: Home, }, { path: '/user/:id', name: 'User', // 使用 prop 传递动态参数给子组件 props: true, component: User, }, ]; const router = createRouter({ history: createWebHistory(), // 使用浏览器的历史记录 API routes, }); export default router; ``` 4. 在 `router-view` 组件中,Vue Router 会渲染匹配当前激活路由的组件: ```html <template> <div id="app"> <router-view></router-view> </div> </template> ``` 相关问题: 1. 如何在 `router-link` 中使用通配符匹配动态路径? 2. 如何处理 `router-link` 的点击事件以及重定向? 3. Vue Router 的 `keep-alive` 功能如何与 `router-link` 结合使用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值