Vue3-路由

5次阅读
没有评论

共计 4050 个字符,预计需要花费 11 分钟才能阅读完成。

vue-router 的版本

vue-router 目前只有 3.x 的版本和 4.x 的版本:

  • vue-router 3.x 只能结合 vue2 进行使用
  • vue-router 4.x 只能结合 vue3 进行使用

vue-router 4.x 基本使用

在项目中安装 vue-router

在 vue3 的项目中,只能使用 vue-router 4.x

npm install vue-router@4 -S

定义路由组件

在项目 view 文件夹中自定义组件,将来要使用 vue-router 来控制它们的展示与切换

声明路由链接和占位符

使用 <router-link> 标签来声明路由链接,并使用 router-view 标签来声明路由占位符

<template>
    <h1>App 根组件</h1>
    <!-- 声明路由链接 -->
    <router-link to="/home">首页</router-link>&nbsp;
    <router-link to="/movie">电影</router-link>&nbsp;
    <router-link to="/about">关于</router-link>

    <!-- 声明路由占位符 -->
    <router-view></router-view>
</template>

创建路由模块

在项目中创建 router.js 路由模块,在其中按照以下 4 个步骤创建并得到路由的实例对象

1. 从 vue-router 中按需导入两个方法

// createRouter 方法用于创建路由的实例对象
// createWebHashHistory 用于指定路由的工作模式(hash 模式)
import { createRouter, createWebHashHistory } from 'vue-router'

2. 导入需要使用路由控制的组件

3. 创建路由实例对象

const router = createRouter({
    // 通过 history 属性指定路由的工作模式
    history: createWebHashHistory(),
    // 通过 routes 数组,指定路由规则
    routes: [
        // path 是 hash 地址,component 是要展示的组件
        { path: '/home', component: Home },
        { path: '/movie', component: Movie },
        { path: '/about', component: About },
    ]
})

4. 向外共享路由实例对象

const router = createRouter({
    // 通过 history 属性指定路由的工作模式
    history: createWebHashHistory(),
    // 通过 routes 数组,指定路由规则
    routes: [
        // path 是 hash 地址,component 是要展示的组件
        { path: '/home', component: Home },
        { path: '/movie', component: Movie },
        { path: '/about', component: About },
    ]
})

// 向外共享路由实例对象
export default router

5. 在 main.js 中导入并挂载路由模块

import { createApp } from 'vue'
import App from './App.vue'
import './index.css'

// 导入路由模块
import router from './router.js'
const app = createApp(App)

// 挂载路由模块
app.use(router)

app.mount('#app')

导入并挂载路由模块

路由高级用法

路由重定向

const router = createRouter({
    history: createWebHashHistory(),
    routes: [
        // 其中 path 表示要被重定向的 “原地址”,redirect 表示将要被重定向到的 “新地址”
        { path: '/', redirect: '/home' },
        { path: '/home', component: Home },
        { path: '/movie', component: Movie },
        { path: '/about', component: About }
    ]
})

路由高亮

使用默认的高亮 class 类

被激活的路由链接,默认会应用一个叫做 router-link-active 的类名。开发者可以使用此类名选择器,为激活的路由链接设置高亮的样式:

/* 在 index.css 全局样式表中,设置 router-link-active 的样式 */
.router-link-active {
    background-color: red;
    color: white;
    font-weight: bold;
}

自定义路由高亮的 clss 类

在 main.js 文件创建路由的实例对象时,可以基于 linkActiveClass 属性,自定义路由链接被激活时所应用的类名:

const router = createRouter({
    history: createWebHashHistory(),
    // 指定被激活的路由链接,会应用到 router-active 这个类名,默认的 router-link-active 类名会被覆盖掉
    linkActiveClass: 'router-active',
    routes: [
        { path: '/', redirect: '/home' },
        { path: '/home', component: Home },
        { path: '/movie', component: Movie },
        { path: '/about', component: About }
    ]
})

嵌套路由

1. 声明子路由链接和子路由占位符

<template>
    <h3>MyAbout 组件</h3>
    <!-- 在关于页面中,声明两个子路由链接 -->
    <router-link to="/about/tab1">tab1</router-link>
    <router-link to="/about/tab2">tab2</router-link>

    <!-- 在关于页面中,声明 tab1 和 tab2 的路由占位符 -->
    <router-view></router-view>
</template>

2. 在父路由规则中,通过 children 属性嵌套声明子路由规则

router.js 路由模块中,导入需要的组件,并使用children 属性声明子路由规则

const router = createRouter({
    history: createWebHashHistory(),
    linkActiveClass: 'router-active',
    routes: [
        { path: '/', redirect: '/home' },
        { path: '/home', component: Home },
        { path: '/movie', component: Movie },
        // about 页面的路由规则(父级路由规则)
        { path: '/about', component: About,
          // 通过 children 属性嵌套子路由规则
          children: [
              // 访问 /about/tab 时,展示 Tab 组件
              { path: 'tab1', component: Tab1 },
              { path: 'tab2', component: Tab2 }
         ] }
    ]
})

子路由规则的 path 不要以 / 开头

动态路由匹配

动态路由指的是:把 Hash 地址中可变的部分定义为参数项,从而提高路由规则的复用性。在 vue-router 中使用英文的冒号 (:) 来定义路由的参数项:

{ path: '/movie/:id', compomemt: Movie }

$route.params 参数对象

通过动态路由匹配的方式渲染出来的组件中,可以使用 $route.params 对象访问到动态匹配的参数项

$route.params.id

使用 props 接收路由参数

为了简化路由参数的获取形式,vue-router 允许在路由规则中开启 props 传参:

// 在定义路由规则时,声明 props: true 选项,
// 即可在 Movie 组件中,以 props 的形式接收到路由规则匹配到的参数项
{ path: '/movie/:id', component: Movie, prpos: true }

<template>
    <!-- 直接使用 props 中接收的路由参数 -->
    <h3>MyMovie 组件 --- {{ id }}</h3>
</template>

<script>
export default {
    // 使用 props 接收路由规则中匹配到的参数项
    props: ['id']
}
</script>

vue-router 编程式导航 API

this.$router.push('hash 地址')

this.$router.go(数值 n)

命名路由

通过 name 属性为路由规则定义名称的方式,叫做命名路由:

{
    path: '/movie/:id',
    // 使用 name 属性为当前的路由规则定义一个 “名称”
    name: 'mov',
    component: Movie,
    props: true
}

命名路由的 name 值不能重复,必须保证唯一性

使用命名路由实现声明式导航

<router-link> 标签动态绑定 to 属性的值,并通过 name 属性指定要跳转到的路由规则。期间还可以用 params 属性指定跳转期间要携带的路由参数:

<router-link :to="{ name: 'mov', params: { id: 3 } }">go to Movie</router-link>

使用命名路由实现编程式导航

this.$router.push({ name: 'mov', params: { id: 3 } })

总结

在 vue 中配置路由

  • createRouter、app.use(router)

使用用路由嵌套

  • 通过 children 属性进行路由嵌套、子路由的 hash 地址不要以 / 开头

动态路由匹配

  • 使用 冒号 声明参数项、this.$route.paramsprops: true

使用编程式导航

  • this.$router.pushthis.$router.go(-1)

使用全局导航守卫

  • 路由实例.beforeEach((to, from, next) => { })

正文完
 0
qiaofugui.cn
版权声明:本站原创文章,由 qiaofugui.cn 于2024-05-21发表,共计4050字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码