05-Vue3路由配置

Vite2+Vue3+TypeScript+Element-plus脚手架搭建系列

✅01-初始化 Vite 项目
✅02-配置 Vite2 环境变量
✅03-Vite2 配置及说明
✅04-Vue3 使用 SCSS
✅05-Vue3 路由配置
✅06-TypeScript 配置及说明
✅07-Vue3 使用 axios
✅08-Vue3 axios 对象封装
✅09-ESLint 配置及说明
✅10-ESLint 与 Prettier 集成配置及说明
✅11-Mock.js 模拟接口数据
✅12-Vite2 引入 Element-Plus 框架
✅13-渐变+透明样式实现清爽登录页
✅14-Element-Plus 实现后台管理系统布局
✅15-Pinia 实现 store 状态管理
✅16-Vue3 动态路由权限控制


源码地址:GitHub / 码云


Vue3路由配置

🎯 目标

  • 实现嵌套路由,路由跳转时只重新渲染子路由指向的视图。
  • 实现访问 / (根路径)显示的是 /home (后台首页)。

😴 功课

实际生活中的应用界面,通常由多层嵌套的组件组合而成。例如后台管理系统 layout (布局)一般由 navbar、sidebar、content、footer 组成,布局示意图如下:
在这里插入图片描述
除了 content 外,其它三个区域的内容一般不会变动,在这种情况下,可以使用嵌套路由,将 content 设为嵌套路由中的子路由,即路由视图出口。这样每次路由变化只会重新渲染 content 。

下面是请求“后台首页”和“用户管理页”的示意图:
在这里插入图片描述
在这里插入图片描述

💡 改变 URL 的片段通常对应于特定的嵌套组件结构,URL 中的 /sys 片段根据业务需要也可以指定嵌套组件。

🍸 准备

调整文件&目录

src 目录下创建 router 文件夹,用来存放路由文件。

router 文件目录结构如下:

📁 src

----📁 router

--------📄 index.ts


/src/components 目录下创建 layout 文件夹,用来存放布局组件。

components 文件目录结构如下:

📁 src

----📁 components

--------📁 layout

------------📄 index.vue

--------📁 demos

------------📄 Env.vue

------------📄 Router.vue

💡 Env.vue 由 HelloWorld.vue 重命名。demos 目录下放的是学习过程中的组件。


src 目录下创建 views 文件夹,用来存放路由指向的视图文件,通俗的讲就是页面。

views 文件目录结构如下:

----📁 views

--------📁 sys

------------📄 User.vue

--------📄 Home.vue

--------📄 Login.vue

🌈 Coding

创建路由

router/index.ts 中创建路由对象,根路由添加 redirect 属性,将请求重定向到 /home,/home添加别名 alias,在地址栏显示 /。代码如下:

import { createRouter, createWebHashHistory } from 'vue-router'

// ↓定义路由
const routes = [
  // ↓layout父路由
  {
    // ↓路由地址
    path: '/',
    // ↓路由名称(唯一值),在路由跳转时能用到
    name: '',
    // ↓路由渲染组件
    component: () => import('@/components/layout/index.vue'),
    // ↓重定向
    redirect: { name: 'home' },
    // ↓子路由
    children: [
      // ↓首页
      {
        path: '/home',
        name: 'home',
        component: () => import('@/views/Home.vue')
      },
      // ↓用户管理
      {
        path: '/sys/user',
        name: 'sys-user',
        component: () => import('@/views/sys/User.vue')
      },
    ]
  },
  // ↓登录页
  {
    path: '/login',
    name: 'login',
    component: () => import('@/views/Login.vue')
  },
]

// ↓创建路由实例并传递routes
const router = createRouter({
  // ↓router内部提供了history模式的实现,使用hash模式
  history: createWebHashHistory(),
  routes,
})

export default router

💡 login 的布局和其它页面不相同,所以不要嵌套到 layout 路由中。

使用路由

main.ts 使用路由:

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

createApp(App).use(router).mount('#app')

总路由视图

App.vue 中添加 router-view ,同时删除其它页面内容:

<template>
  <!-- ↓总路由视图 -->
  <router-view></router-view>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "App",
});
</script>

Login 页面

Login 为嵌套页面,用来做对比,代码如下:

<template>
  <h2>Login Page</h2>
  <router-link to="/">Go to Home</router-link>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "Login",
});
</script>

Layout 路由视图

components/layout/index.vue 中加入 router-view 。代码如下:

<template>
  <h2 class="red">固定区域</h2>
  <!-- ↓layout路由视图 -->
  <router-view></router-view>
</template>

<script>
import '@/styles/index.scss'
import { defineComponent } from "vue";

export default defineComponent({
  name: "Layout",
});
</script>

“固定区域” 代表布局中的 navbar、sidebar、footer。

嵌套页面

路由配置中的视图页面是 Home.vue 和 User.vue。将 Env.vue 和 Router.vue 导入 Home.vue。Home.vue 代码如下:

<template>
  <Env />
  <Router />
</template>

<script lang="ts">
import { defineComponent } from "vue";
import Env from "@/components/demos/Env.vue";
import Router from "@/components/demos/Router.vue";

export default defineComponent({
  name: "Home",
  components: {
    Router,
    Env,
  },
});
</script>

User.vue 代码如下:

<template>
  <h2>User Page</h2>
  <router-link to="/">Go to Home</router-link>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "User",
});
</script>

Demo 组件

demo组件是 Env.vue 和 Router.vue。Env.vue 就是之前的 HelloWorld.vue 改了一点点:修改了name,去掉了 red 样式。Env.vue 不贴代码了。

Router.vue 用来测试路由跳转,代码如下:

<template>
  <!-- ↓路由demo -->
  <div>
    <h2>路由</h2>
    <!-- ↓匹配路由path进行跳转 -->
    <router-link to="/sys/user">Go to User</router-link> <br />
    <!-- ↓匹配路由name进行跳转 -->
    <router-link :to="{ name: 'login' }">Go to Login</router-link>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "Router",
});
</script>

🎭 结果

  • 浏览器访问 / 显示 /home 页面内容,但地址栏显示 /
    在这里插入图片描述
  • 在 /home 和 /sys/user 之间跳转,子组件重新渲染,layout 父组件不变。
    在这里插入图片描述
  • 访问 /login 跳出 layout 组件。
    在这里插入图片描述

本文为博主原创文章,任何个人、团体、机构转载和摘录,请注明出处。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code-bee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值