vue搭建一個樹形菜單項目

首先搭建項目需要先通過步驟搭建一個vue的項目,然后創建一個component文件,里面新建一個index.vue頁面來。

這是引入的element-ui組件庫里的組件,來實現我的路由,渲染的是我存儲的動態路由,所以需要先安裝并且引用。

npm install element-plus @element-plus/icons-vue

這是菜單管理的

<template><div class="sidebar-container"><!-- 折疊控制 --><div class="collapse-control" style="background-color:#293246" @click="toggleCollapse"><el-icon :size="20" :color="isCollapse ? '#fff' : '#ffd04b'"><component :is="isCollapse ? Expand : Fold" /></el-icon></div><!-- 導航菜單 --><div><el-menu router :default-active="$route.path" background-color="#293246" text-color="#fff" style="height: 100vh"active-text-color="#ffd04b" :collapse="isCollapse"><template v-for="menu in menuArray" :key="menu.path"><!-- 有子級的多層菜單項 --><el-sub-menu v-if="menu.children?.length" index="/layout"><template #title><span>{{ menu.meta.title }}</span></template><el-menu-item v-for="sub in menu.children" :key="'/layout' + sub.path" :index="'/layout' + sub.path"><span>{{ sub.title }}</span></el-menu-item></el-sub-menu><!-- 沒子級的單層菜單項 --><el-menu-item v-else :index="menu.path == '/home' ? menu.path : menu.path"><span>{{ menu.meta.title }}</span></el-menu-item></template></el-menu></div></div>
</template>
<script setup>
import { ref } from 'vue'
import { Expand, Fold } from '@element-plus/icons-vue'
const isCollapse = ref(false)
const toggleCollapse = () => {isCollapse.value = !isCollapse.value
}
const menuArray = ref([]);
render();//初始化渲染
function render() {try {const menuList = JSON.parse(sessionStorage.getItem('menuPath') || '[]');const menuName = JSON.parse(sessionStorage.getItem('menuName') || '[]');console.log(menuList, menuName);if (!Array.isArray(menuList) || !Array.isArray(menuName)) {throw new Error('存儲數據格式不正確');}const nameMap = new Map(menuName.map(item => [item.name, item]));menuArray.value = menuList.filter(item => item?.name && nameMap.has(item.name)).map(item => ({...item,...nameMap.get(item.name)}));console.log('安全篩選結果:', menuArray.value);} catch (error) {console.error('數據處理失敗:', error);// 可以在這里設置默認值或進行錯誤上報return [];}
}
</script>
<style scoped>
.sidebar-container {transition: width 0.3s;
}.collapse-control {padding: 15px;cursor: pointer;border-bottom: 1px solid #1f2d3d;
}.el-menu--collapse {width: 64px;
}.el-menu-vertical-demo:not(.el-menu--collapse) {width: 200px;
}
</style>

組件面包屑

<template><!-- <div style="margin-bottom: 20px;width: 100%;"><el-button size="small" @click="addTab(editableTabsValue)">添加標簽頁</el-button></div> --><el-tabs v-model="editableTabsValue" @tab-click="tabBread" type="card" @tab-remove="removeTab"><el-tab-pane v-for="item in editableTabs" :key="item.name" :label="item.title":name="item.name" :closable="item.name !== '/home'"><!-- 主頁面 --><el-main><router-view /></el-main></el-tab-pane></el-tabs>
</template><script setup>
import { ref, reactive, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';const route = useRoute();
const router = useRouter();const editableTabsValue = ref(route.path);
const editableTabs = reactive([{ title: '首頁', name: '/home' }
]);// 監聽路由變化,同步標簽頁
watch(() => route.path,(newPath) => {editableTabsValue.value = newPath;if (!editableTabs.some(tab => tab.name === newPath)) {const title = getTitleFromPath(newPath);editableTabs.push({ title, name: newPath });}},{ immediate: true }
);function getTitleFromPath(path) {const titleMap = {'/home': '首頁','/layout/user/list': '用戶列表','/layout/user/role': '角色列表',// 擴展其他路由...};return titleMap[path] || '新標簽';
}
// 點擊面包屑標簽跳轉路由
const tabBread = () => {console.log(editableTabsValue.value);router.push(editableTabsValue.value);
}
const removeTab = (targetName) => {const tabs = editableTabs;let activeName = editableTabsValue.value;if (activeName === targetName) {const currentIndex = tabs.findIndex(tab => tab.name === targetName);const nextTab = tabs[currentIndex + 1] || tabs[currentIndex - 1];activeName = nextTab?.name || '/home';router.push(activeName);}editableTabsValue.value = activeName;editableTabs.splice(0, editableTabs.length, ...tabs.filter(tab => tab.name !== targetName));
};
</script><style scoped>
/* 可以添加自定義樣式 */
.el-tabs {margin: 20px;
}
</style>

這部分代碼是用來布局菜單框架結構的,然后我們在路由部分引入這個文件的路由即可。

<!-- src/layouts/MainLayout.vue -->
<template><div class="app"><el-container style="height: 100vh;"><!-- 左側導航欄 --><el-aside width="200px"><aside-nav /></el-aside><div class="menu"><!-- 頂部菜單 --><MyHeader /></div></el-container></div>
</template><script>
import MyHeader from '@/Layout/topHeader.vue'
import AsideNav from '@/components/MenuItem.vue'export default {components: {MyHeader,AsideNav}
}
</script><style>
html,
body {padding: 0;margin: 0;
}.menu {width: 100%;
}
</style>

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

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

相關文章

【Python 算法】動態規劃

本博客筆記內容來源于靈神&#xff0c;視頻鏈接如下&#xff1a;https://www.bilibili.com/video/BV16Y411v7Y6?vd_source7414087e971fef9431117e44d8ba61a7&spm_id_from333.788.player.switch 01背包 計算了f[i1]&#xff0c;f[i]就沒用了&#xff0c;相當于每時每刻只有…

c#的反射和特性

在 C# 中&#xff0c;反射&#xff08;Reflection&#xff09;和特性&#xff08;Attributes&#xff09;是兩個強大的功能&#xff0c;它們在運行時提供元編程能力&#xff0c;廣泛用于框架開發、對象映射和動態行為擴展。以下是對它們的詳細介紹&#xff0c;包括定義、用法、…

云終端的作用,此刻在校園和醫院里具象化

數字化轉型已經成為各行各業交流的熱點話題&#xff0c;校園和醫院這兩個重要領域正經歷著深刻變革。云終端&#xff0c;正以實際應用成果展現其獨特作用&#xff0c;讓人們切實感受到它帶來的高效與便利。 傳統的教學中&#xff0c;學校機房的電腦設備更新換代成本高&#xf…

UniApp快速表單組件

環境&#xff1a;vue3 uni-app 依賴庫&#xff1a;uview-plus、dayjs 通過配置項快速構建 form 表單 使用 <script setup>import CustomCard from /components/custom-card.vue;import { ref } from vue;import CustomFormItem from /components/form/custom-form-it…

Android: Handler 的用法詳解

Android 中 Handler 的用法詳解 Handler 是 Android 中用于線程間通信的重要機制&#xff0c;主要用于在不同線程之間發送和處理消息。以下是 Handler 的全面用法指南&#xff1a; 一、Handler 的基本原理 Handler 基于消息隊列(MessageQueue)和循環器(Looper)工作&#xff…

UE5學習筆記 FPS游戲制作33 游戲保存

文章目錄 核心思想創建數據對象創建UIUI參數和方法打開UI存檔文件的位置可以保存的數據類型 核心思想 UE自己有保存游戲的功能&#xff0c;核心節點&#xff0c;類似于json操作&#xff0c;需要一個數據類的對象來進行保存和讀取 創建存檔 加載存檔 保存存檔 創建數據對象…

【藍橋杯】 枚舉和模擬練習題

系列文章目錄 藍橋杯例題 枚舉和模擬 文章目錄 系列文章目錄前言一、好數&#xff1a; 題目參考&#xff1a;核心思想&#xff1a;代碼實現&#xff1a; 二、藝術與籃球&#xff1a; 題目參考&#xff1a;核心思想&#xff1a;代碼實現: 總結 前言 今天距離藍橋杯還有13天&…

大數據技術之Scala:特性、應用與生態系統

摘要 Scala 作為一門融合面向對象編程與函數式編程范式的編程語言&#xff0c;在大數據領域展現出獨特優勢。本文深入探討 Scala 的核心特性&#xff0c;如函數式編程特性、類型系統以及與 Java 的兼容性等。同時&#xff0c;闡述其在大數據處理框架&#xff08;如 Apache Spa…

Linux信號——信號的產生(1)

注&#xff1a;信號vs信號量&#xff1a;兩者沒有任何關系&#xff01; 信號是什么&#xff1f; Linux系統提供的&#xff0c;讓用戶&#xff08;進程&#xff09;給其他進程發送異步信息的一種方式。 進程看待信號的方式&#xff1a; 1.信號在沒有發生的時候&#xff0c;進…

數據結構和算法——漢諾塔問題

前言 先講個故事&#xff0c;傳說古代印度有三根黃金柱&#xff0c;64個石盤&#xff0c;需要將石盤從第一根移動到第三根上&#xff0c;規定每次只能移動一片&#xff0c;并且小盤在放置時必須在大盤上。 當石盤移動完畢時&#xff0c;世界就會毀滅。 漢諾塔——遞歸 接下來…

2023年3月全國計算機等級考試真題(二級C語言)

&#x1f600; 第1題 下列敘述中錯誤的是 A. 向量是線性結構 B. 非空線性結構中只有一個結點沒有前件 C. 非空線性結構中只有一個結點沒有后件 D. 只有一個根結點和一個葉子結點的結構必定是線性結構 概念澄清 首先&#xff0c;我們需要明確幾個關鍵概念&#xf…

Kafka簡單的性能調優

Kafka 的性能調優是一個系統性工程&#xff0c;需要從生產者、消費者、Broker 配置以及集群架構等多個層面進行綜合調整。以下是一些關鍵的性能調優策略&#xff1a; 一、生產者性能優化 批量發送 batch.size&#xff1a;控制消息批量的最大字節數&#xff0c;默認值為 16KB。…

微前端 - 以無界為例

一、微前端核心概念 微前端是一種將單體前端應用拆分為多個獨立子應用的架構模式&#xff0c;每個子應用可獨立開發、部署和運行&#xff0c;具備以下特點&#xff1a; 技術棧無關性&#xff1a;允許主應用和子應用使用不同框架&#xff08;如 React Vue&#xff09;。獨立部…

企業級日志分析平臺: ELK 集群搭建指南

前言&#xff1a;在當今數字化時代&#xff0c;數據已經成為企業決策的核心驅動力。無論是日志分析、用戶行為追蹤&#xff0c;還是實時監控和異常檢測&#xff0c;高效的數據處理和可視化能力都至關重要。ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;作為全球…

1.2-WAF\CDN\OSS\反向代理\負載均衡

WAF&#xff1a;就是網站應用防火墻&#xff0c;有硬件類、軟件類、云WAF&#xff1b; 還有網站內置的WAF&#xff0c;內置的WAF就是直接嵌在代碼中的安全防護代碼 硬件類&#xff1a;Imperva、天清WAG 軟件&#xff1a;安全狗、D盾、云鎖 云&#xff1a;阿里云盾、騰訊云WA…

MybatisPlus(SpringBoot版)學習第四講:常用注解

目錄 1.TableName 1.1 問題 1.2 通過TableName解決問題 1.3 通過全局配置解決問題 2.TableId 2.1 問題 2.2 通過TableId解決問題 2.3 TableId的value屬性 2.4 TableId的type屬性 2.5 雪花算法 1.背景 2.數據庫分表 ①垂直分表 ②水平分表 1>主鍵自增 2>取…

第二屆計算機網絡和云計算國際會議(CNCC 2025)

重要信息 官網&#xff1a;www.iccncc.org 時間&#xff1a;2025年4月11-13日 地點&#xff1a;中國南昌 簡介 第二屆計算機網絡和云計算國際會議&#xff08;CNCC 2025&#xff09;將于2025年4月11-13日在中國南昌召開。圍繞“計算機網絡”與“云計算”展開研討&#xff…

【大模型基礎_毛玉仁】5.4 定位編輯法:ROME

目錄 5.4 定位編輯法&#xff1a;ROME5.4.1 知識存儲位置1&#xff09;因果跟蹤實驗2&#xff09;阻斷實驗 5.4.2 知識存儲機制5.4.3 精準知識編輯1&#xff09;確定鍵向量2&#xff09;優化值向量3&#xff09;插入知識 5.4 定位編輯法&#xff1a;ROME 定位編輯&#xff1a;…

橫掃SQL面試——連續性登錄問題

橫掃SQL面試 &#x1f4cc; 連續性登錄問題 在互聯網公司的SQL面試中&#xff0c;連續性問題堪稱“必考之王”。&#x1f4bb;&#x1f50d; 用戶連續登錄7天送優惠券&#x1f31f;&#xff0c;服務器連續報警3次觸發熔斷??&#xff0c;圖書館連續3天人流破百開啟限流?” …

Spring AI Alibaba 對話記憶使用

一、對話記憶 (ChatMemory)簡介 1、對話記憶介紹 ”大模型的對話記憶”這一概念&#xff0c;根植于人工智能與自然語言處理領域&#xff0c;特別是針對具有深度學習能力的大型語言模型而言&#xff0c;它指的是模型在與用戶進行交互式對話過程中&#xff0c;能夠追蹤、理解并利…