Vue Router (命名视图)

前言:

命名视图(Named Views) ​ 允许你在同一个路由下渲染多个组件

常见使用场景:

场景 说明
布局系统 比如在布局中同时展示 headersidebarmain content
多区域页面 一个页面包含顶部导航、侧边栏、主内容区、底部等,每个区域都是独立的组件
复杂 UI 结构 不同区域需要加载不同组件,比如左侧菜单 + 右侧内容 + 顶部用户信息栏

1、基本使用

例如创建一个布局,有 sidebar (侧导航) 和 main (主内容) 两个视图。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default

复制代码
<router-view class="view left-sidebar" name="LeftSidebar" />
<router-view class="view main-content" />
<router-view class="view right-sidebar" name="RightSidebar" />

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/',
      components: {
        default: Home,
        // LeftSidebar: LeftSidebar 的缩写
        LeftSidebar,
        // 它们与 `<router-view>` 上的 `name` 属性匹配
        RightSidebar,
      },
    },
  ],
})

一个路由,多个视图,components对象来定义,name对应 <router-view name="xxx">

2、命名视图嵌套

  • 嵌套路由 :路由之间有父子关系,子路由渲染到父路由的 <router-view>中。

  • 命名视图 :一个 <router-view>通过 name区分,可以渲染不同的组件。

  • 嵌套命名视图 :在 嵌套路由结构中,使用多个命名 <router-view name="xxx">,并在路由配置中为这些视图指定不同的组件

src/

├── views/

│ ├── AdminLayout.vue <-- 父布局,含多个命名 router-view

│ ├── AdminHeader.vue

│ ├── AdminSidebar.vue

│ ├── AdminMain.vue

│ ├── UserList.vue

│ ├── UserForm.vue

│ ├── UserDetail.vue

├── router/

│ └── index.js

父级布局:

复制代码
<template>
  <div class="admin-layout">
    <!-- 命名视图:Header -->
    <router-view name="header"></router-view>

    <div style="display: flex;">
      <!-- 命名视图:Sidebar -->
      <router-view name="sidebar"></router-view>

      <!-- 默认视图:Main(也可以命名为 main) -->
      <router-view></router-view>
    </div>
  </div>
</template>

路由配置:

复制代码
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'

import AdminLayout from '@/views/AdminLayout.vue'
import AdminHeader from '@/views/AdminHeader.vue'
import AdminSidebar from '@/views/AdminSidebar.vue'
import AdminMain from '@/views/AdminMain.vue'
import UserList from '@/views/UserList.vue'
import UserForm from '@/views/UserForm.vue'

const routes = [
  {
    path: '/admin',
    component: AdminLayout,  // 父布局组件
    children: [
      {
        path: '',
        components: {  // 注意:这里是 components(多个命名视图)
          header: AdminHeader,
          sidebar: AdminSidebar,
          default: AdminMain  // 默认视图
        }
      },
      {
        path: 'users',
        components: {
          header: AdminHeader,     // 复用
          sidebar: AdminSidebar,   // 复用
          default: UserList        // 主内容区显示用户列表
        }
      },
      {
        path: 'users/new',
        components: {
          header: AdminHeader,
          sidebar: AdminSidebar,
          default: UserForm       // 显示新建用户表单
        }
      }
    ]
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

3、componentcomponents有什么区别?

属性 说明
component 只能指定 单个组件,用于普通路由
components 可以指定 多个命名组件 ,用于命名视图(注意有 s
相关推荐
海石4 分钟前
去到比北方更北的地方—2025年终总结
前端·ai编程·年终总结
一个懒人懒人11 分钟前
Promise async/await与fetch的概念
前端·javascript·html
Mintopia17 分钟前
Web 安全与反编译源码下的权限设计:构筑前后端一致的防护体系
前端·安全
输出输入19 分钟前
前端核心技术
开发语言·前端
Mintopia24 分钟前
Web 安全与反编译源码下的权限设计:构建前后端一体的信任防线
前端·安全·编译原理
林深现海44 分钟前
Jetson Orin nano/nx刷机后无法打开chrome/firefox浏览器
前端·chrome·firefox
EchoEcho1 小时前
深入理解 Vue.js 渲染机制:从声明式到虚拟 DOM 的完整实现
vue.js
黄诂多1 小时前
APP原生与H5互调Bridge技术原理及基础使用
前端
前端市界1 小时前
用 React 手搓一个 3D 翻页书籍组件,呼吸海浪式翻页,交互体验带感!
前端·架构·github
文艺理科生1 小时前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构