Vue Router 嵌套路由與布局系統詳解:從新手到精通

在Vue單頁應用開發中,理解Vue Router的嵌套路由機制是構建現代管理后臺的關鍵。本文將通過實際案例,深入淺出地解釋Vue?Router如何實現布局與內容的分離,以及<router-view>的嵌套渲染原理。

什么是嵌套路由?

嵌套路由是Vue?Router的核心特性,它允許我們在一個組件內部渲染另一個路由組件。這種機制特別適合構建有固定布局的應用,如管理后臺系統。

基礎理解

<router-view>?= 組件渲染的占位符

router.js中組件每個 對應的component?=?要在這個占位符中渲染的具體組件

這是理解整個嵌套路由系統的基礎!

實際案例分析

讓我們通過一個真實的管理后臺項目來理解這個機制。

應用入口:App.vue

<!-- App.vue -->
<template><div id="app"><router-view />  <!-- 第一層 router-view --><theme-picker /></div>
</template>

這是整個應用的根組件,其中的<router-view>是第一層渲染器。

路由配置對比

情況1:獨立頁面(登錄頁)
{path: '/login',component: () => import('@/views/login'),hidden: true
}

渲染結果:

<div id="app"><!-- 直接渲染login組件,占據整個屏幕 --><div class="login-container"><form class="login-form"><!-- 登錄表單內容 --></form></div>
</div>
情況2:管理后臺頁面(個人中心)
{path: '/user',component: Layout,  // 關鍵:使用Layout布局組件hidden: true,redirect: 'noredirect',children: [{path: 'profile',component: () => import('@/views/system/user/profile/index'),name: 'Profile',meta: {title: '個人中心',icon: 'user'}}]
}

Layout?布局組件詳解

Layout?組件結構

<!-- layout/index.vue -->
<template><div class="app-wrapper"><!-- 側邊欄 --><sidebar v-if="!sidebar.hide" class="sidebar-container"/><div class="main-container"><!-- 頂部導航欄 --><div class="fixed-header"><navbar/><tags-view v-if="needTagsView"/></div><!-- 主內容區域 - 關鍵! --><app-main/><!-- 右側設置面板 --><right-panel><settings/></right-panel></div></div>
</template>

AppMain 組件:第二層?router-view

<!-- layout/components/AppMain.vue -->
<template><section class="app-main"><transition name="fade-transform" mode="out-in"><keep-alive :include="cachedViews"><!-- 第二層 router-view!子路由在這里渲染 --><router-view v-if="!$route.meta.link" :key="key" /></keep-alive></transition></section>
</template>

雙層渲染機制詳解

當用戶訪問?/user/profile?時:

第一步:父路由匹配

URL: /user/profile
匹配: path: '/user', component: Layout
結果: Layout組件渲染在App.vue的<router-view>中

第二步:子路由匹配

繼續匹配: path: 'profile', component: ProfileComponent
結果: ProfileComponent渲染在Layout內部AppMain的<router-view>中

完整的渲染鏈路

用戶訪問: /user/profile↓
App.vue <router-view>↓ 渲染 Layout 組件
Layout 組件 (完整管理后臺框架)
├── Sidebar (側邊欄)
├── Navbar (頂部導航)
├── TagsView (標簽頁)
└── AppMain└── <router-view>↓ 渲染子路由組件ProfileComponent (個人中心頁面)

最終DOM結構對比

使用Layout的頁面結構:

<div id="app"><!-- Layout組件渲染的完整管理后臺框架 --><div class="app-wrapper"><!-- 側邊欄導航 --><div class="sidebar-container"><el-menu>...</el-menu></div><div class="main-container"><!-- 頂部導航欄 --><div class="navbar"><hamburger/><breadcrumb/></div><!-- 多標簽頁 --><div class="tags-view"><router-link>首頁</router-link><router-link>個人中心</router-link></div><!-- 主內容區域 --><section class="app-main"><!-- 具體頁面內容在這里 --><div class="profile-container"><h1>個人中心</h1><form>...</form></div></section></div></div>
</div>

不使用Layout的頁面結構:

<div id="app"><!-- 直接渲染獨立頁面,占據全屏 --><div class="login-container"><div class="login-box"><h2>系統登錄</h2><form class="login-form"><input type="text" placeholder="用戶名"><input type="password" placeholder="密碼"><button>登錄</button></form></div></div>
</div>

為什么要這樣設計?

1.?布局復用

所有管理頁面共享相同的布局結構,避免重復代碼:

  • 側邊欄導航
  • 頂部面包屑
  • 多標簽頁功能
  • 用戶信息顯示

2.?關注點分離

  • Layout組件專注于布局結構
  • 具體頁面組件專注于業務邏輯
  • 各自獨立開發和維護

3.?用戶體驗

  • 頁面切換時保持布局穩定
  • 無布局閃爍問題
  • 統一的視覺體驗

路由配置最佳實踐

管理后臺頁面配置:

export const constantRoutes = [// 需要完整布局的路由{path: '',component: Layout,  // 使用Layoutredirect: 'index',children: [{path: 'index',component: () => import('@/views/index'),name: 'Index',meta: { title: '首頁', icon: 'dashboard', affix: true }}]},// 系統管理模塊{path: '/system',component: Layout,  // 使用Layoutmeta: { title: '系統管理', icon: 'system' },children: [{path: 'user',component: () => import('@/views/system/user/index'),meta: { title: '用戶管理' }},{path: 'role',component: () => import('@/views/system/role/index'),meta: { title: '角色管理' }}]}
]

獨立頁面配置:

export const constantRoutes = [// 不需要布局的獨立頁面{path: '/login',component: () => import('@/views/login'),  // 直接使用頁面組件hidden: true},{path: '/register',component: () => import('@/views/register'),hidden: true},{path: '/404',component: () => import('@/views/error/404'),hidden: true}
]

組件開發指南

Layout組件要點:

  1. 必須包含<router-view>:用于渲染子路由
  2. 保持布局穩定:避免因數據變化導致布局抖動
  3. 響應式設計:適配不同屏幕尺寸

頁面組件要點:

  1. 專注業務邏輯:不需要關心布局結構
  2. 保持獨立性:不依賴特定的布局環境
  3. 遵循約定:統一的組件命名和結構

常見問題與解決方案

問題1:子路由不顯示

原因:父組件沒有<router-view>

解決:確保Layout組件或父組件包含<router-view>

問題2:布局閃爍

原因:路由切換時組件重新掛載

解決:使用<keep-alive>緩存組件

<keep-alive :include="cachedViews"><router-view :key="key" />
</keep-alive>

問題3:面包屑不更新

原因:路由元信息配置不正確

解決:正確配置路由的meta信息

meta: {title: '頁面標題',breadcrumb: true,  // 顯示在面包屑中activeMenu: '/parent/path'  // 高亮父級菜單
}

高級應用

多級嵌套路由

{path: '/nested',component: Layout,children: [{path: 'level1',component: ParentView,  // 中間層組件children: [{path: 'level2',component: () => import('@/views/nested/level2')}]}]
}

動態路由加載

// 基于權限動態添加路由
const asyncRoutes = [{path: '/admin',component: Layout,meta: { roles: ['admin'] },  // 權限控制children: [...]}
]// 權限驗證后動態添加
router.addRoutes(filterAsyncRoutes(asyncRoutes, roles))

總結

Vue Router的嵌套路由機制是構建現代Web應用的核心技術:

  1. 雙層<router-view>:實現布局與內容的完美分離
  2. 組件復用:Layout組件為所有管理頁面提供統一框架
  3. 靈活配置:通過路由配置控制頁面的渲染方式
  4. 用戶體驗:保持布局穩定,提供流暢的頁面切換

掌握這個機制,你就能構建出專業級的管理后臺系統。記住核心原理:<router-view>是占位符,component是要渲染的內容,嵌套路由就是這樣簡單而強大!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95917.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Grafana 與 InfluxDB 可視化深度集成(二)

四、案例實操&#xff1a;以服務器性能監控為例 4.1 模擬數據生成 為了更直觀地展示 Grafana 與 InfluxDB 的集成效果&#xff0c;我們通過 Python 腳本模擬生成服務器性能相關的時間序列數據。以下是一個簡單的 Python 腳本示例&#xff0c;用于生成 CPU 使用率和內存使用量…

.net印刷線路板進銷存PCB材料ERP財務軟件庫存貿易生產企業管理系統

# 印刷線路板進銷存PCB材料ERP財務軟件庫存貿易生產企業管理系統 # 開發背景 本軟件原為給蘇州某企業開發的pcb ERP管理軟件&#xff0c;后來在2021年深圳某pcb 板材公司買了我們的軟件然后在此基礎上按他行業的需求多次修改后的軟件&#xff0c;適合pcb板材行業使用。 # 功能…

基于飛算JavaAI的可視化數據分析集成系統項目實踐:從需求到落地的全流程解析

引言&#xff1a;為什么需要“可視化AI”的數據分析系統&#xff1f; 在數字化轉型浪潮中&#xff0c;企業/團隊每天產生海量數據&#xff08;如用戶行為日志、銷售記錄、設備傳感器數據等&#xff09;&#xff0c;但傳統數據分析存在三大痛點&#xff1a; 技術門檻高&#xff…

MqSQL中的《快照讀》和《當前讀》

目錄 1、MySQL讀取定義 1.1、鎖的分類 1.2、快照讀與當前讀 1.3、使用場景 1.4、區別 2、實現機制 2.1、實現原理 2.2、隔離級別和快照聯系 1、隔離級別 2、快照讀 2.3、快照何時生成 3、SQL場景實現 3.1、快照讀 3.2、當前讀 4、鎖的細節&#xff08;與當前讀相…

【Docker項目實戰】使用Docker部署Notepad輕量級記事本

【Docker項目實戰】使用Docker部署Notepad輕量級記事本一、 Notepad介紹1.1 Notepad簡介1.2 Notepad特點1.3 主要使用場景二、本次實踐規劃2.1 本地環境規劃2.2 本次實踐介紹三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本四、下載Note…

開疆智能ModbusTCP轉Ethernet網關連接FBOX串口服務器配置案例

本案例是串口服務器通過串口采集第三方設備數據轉成ModbusTCP的服務器后歐姆龍PLC通過Ethernet連接到網關&#xff0c;讀取采集到的數據。具體配置過程如下。配置過程&#xff1a;Fbox做從站FBox采集PLC數據&#xff0c;通過Modbus TCP Server/Modbus RTU Server協議配置地址映…

Vue中的數據渲染【4】

目錄1.頁面樣式綁定&#xff1a;1.概述&#xff1a; 2.綁定方式&#xff1a;1.通過類名綁定&#xff1a;1.通過動態類名綁定&#xff1a;&#xff08;&#xff1a;class&#xff09;2.通過類名數組綁定&#xff1a;3.通過類名對象進行綁定&#xff1a;2.內聯樣式綁定&#xff1…

LeeCode 39.組合總和

給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target &#xff0c;找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 &#xff0c;并以列表形式返回。你可以按 任意順序 返回這些組合。candidates 中的 同一個 數字可以 無限制重復被選取 。如果…

基于Python3.10.6與jieba庫的中文分詞模型接口在Windows Server 2022上的實現與部署教程

該教程詳細闡述了在Windows Server 2022上基于Python3.10.6與jieba庫實現并部署中文分詞模型接口的完整流程&#xff0c;涵蓋技術棧&#xff08;Python3.10.6、jieba、Flask、Waitress、Nginx、NSSM等&#xff09;與環境準備&#xff08;Python安裝、虛擬環境配置、依賴包安裝及…

java基礎(九)sql基礎及索引

一、NoSQL 和 SQL 數據庫的區別1. 基本概念SQL 數據庫&#xff08;關系型數據庫&#xff09; 代表產品&#xff1a;SQL Server, Oracle, MySQL (開源), PostgreSQL (開源)。 存儲方式&#xff1a;結構化數據&#xff0c;邏輯上以二維表&#xff08;行 & 列&#xff09;形式…

ffmpeg-調整視頻分辨率

ffmpeg -i input.mp4 -vf scale1280:720 output_1280x720.mp4-i input.mp4: 指定輸入視頻文件。-vf scale1280:720: 使用 scale 視頻濾鏡&#xff0c;將視頻寬度設置為 1280 像素&#xff0c;高度設置為 720 像素。output_1280x720.mp4: 指定輸出視頻文件。 16&#xff1a;9 常…

前端vue3+后端spring boot導出數據

有個項目需要提供數據導出功能。 該項目前端用vue3編寫&#xff0c;后端是spring boot 2&#xff0c;數據庫是mysql8。 工作流程是&#xff1a;1&#xff09;前端請求數據導出 2&#xff09;后端接到請求后&#xff0c;開啟一個數據導出線程&#xff0c;然后立刻返回信息到前端…

基于RK3588的微電網協調控制器:實現分布式能源的智能調控與優化運行

微電網協調控制器方案通過集成先進算法和實時數據技術&#xff0c;實現分布式能源的光伏、儲能、風電等設備的智能協調與優化運行?12。關鍵功能包括&#xff1a;?協同優化調度?&#xff1a;采用模型預測控制&#xff08;MPC&#xff09;動態調整光伏出力、儲能充放電策略和負…

機器學習——TF-IDF文本特征提取評估權重 + Jieba 庫進行分詞(以《紅樓夢》為例)

使用 Jieba 庫進行 TF-IDF 關鍵詞提取&#xff08;以《紅樓夢》為例&#xff09;在中文文本分析中&#xff0c;TF-IDF&#xff08;Term Frequency - Inverse Document Frequency&#xff09; 是最常用的關鍵詞提取方法之一。它通過評估詞在單個文檔中的出現頻率和在所有文檔中的…

一周學會Matplotlib3 Python 數據可視化-多子圖及布局實現

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

Spark執行計劃與UI分析

文章目錄1.Spark任務階段劃分1.1 job&#xff0c;stage與task1.2 job劃分1.3 stage和task劃分2.任務執行時機3.task內部數據存儲與流動4.根據sparkUI了解Spark執行計劃4.1查看job和stage4.2 查看DAG圖4.3查看task1.Spark任務階段劃分 1.1 job&#xff0c;stage與task 首先根據…

16-docker的容器監控方案-prometheus實戰篇

文章目錄一.前置知識1.監控與報警2.監控系統的設計3.監控系統的分類二、prometheus概述1.什么是prometheus2.prometheus的歷史3.為什么要學習prometheus4.prometheus的使用場景5.prometheus的宏觀架構圖6.prometheus軟件下載地址三、部署prometheus server監控軟件1.同步集群時…

集成電路學習:什么是Image Processing圖像處理

Image Processing,即圖像處理,是計算機視覺、人工智能、多媒體等領域的重要基礎。它利用計算機對圖像進行分析、加工和處理,以達到預期目的的技術。以下是對圖像處理的詳細解析: 一、定義與分類 定義: 圖像處理是指用計算機對圖像進行分析,以達到所需結果的技術,又稱…

基于Android的隨身小管家APP的設計與實現/基于SSM框架的財務管理系統/android Studio/java/原生開發

基于Android的隨身小管家APP的設計與實現/基于SSM框架/android Studio/java/原生開發

Web 開發 16

1 在 JavaScript&#xff08;包括 JSX&#xff09;中&#xff0c;函數體的寫法和返回值處理在 JavaScript&#xff08;包括 JSX&#xff09;中&#xff0c;函數體的寫法和返回值處理確實有一些簡潔的語法規則&#xff0c;尤其是在箭頭函數中。這些規則常常讓人混淆&#xff0c;…