Vue3實現(xiàn)動態(tài)面包屑的代碼示例
前言
在進行項目開發(fā)的過程中,我們一般會使用面包屑的功能,這個功能還是比較常見的,那么他的實現(xiàn)思路是什么呢?
面包屑的介紹和實現(xiàn)思路????
首先我們先來了解一下面包屑功能,這個功能其實就是根據(jù)路由的地址,來動態(tài)的生成導航菜單,今后在路由發(fā)生變化的時候,這個導航菜單也會動態(tài)的發(fā)生變化,就像下面展示的這樣:
那么像這樣的功能我們該如何實現(xiàn)呢?
- 對于這個面包屑來說,他的靜態(tài)版本我們可以直接在element-plus上面直接復制粘貼即可,這個不做過多的贅述
- 我們要實現(xiàn)的版本是動態(tài)的進行渲染,那么這個就需要我們獲取相應路由的數(shù)據(jù)結構(比如說數(shù)組),該如何獲取相應的路由數(shù)據(jù)呢?
因此完成面包屑組件的關鍵就是在于獲取相應路由數(shù)據(jù)上面,這就是典型的數(shù)據(jù)驅動
獲取路由數(shù)據(jù)????
我們要實現(xiàn)這個功能就需要用到route.matched
,代碼如下
//首先實例化獲取當前路由 const route=useRoute() //然后調用route.matched
對route.matched的理解
首先我們來看官方給出的解釋:
官方解釋: 與給定路由地址匹配的標準化的路由記錄數(shù)組。
個人理解:我個人的理解就是從根據(jù)你訪問的路由,然后向上找,找到當前路由的根路由然后返回一個數(shù)組,這個數(shù)組包含的就是你當前訪問的路由加上根路由,可能這么說你還是不是很理解,那么我就舉一個例子:
const router=[{ ?path: "/user", ?component: Layout ?children: [ ? {path: "/user/manage", component:Manage }, ? {path: "/user/info/:id", component:userInfo ? }, ? {path: "/user/import", ?component:import }, ], }]
這里不做路由的細節(jié)展示,只是為了說明一個例子,如果我們訪問/user/manage
這個地址的時候,此時如果我們使用route.matched
打印結果會得到如下結果:
[ { path: '/user', component: Layout,children:[...所有的子路由] }, { path: '/user/manage', component: Manage } ]
這樣我們就能根據(jù)獲取的數(shù)組來進行面包屑的渲染了。
開始完成動態(tài)面包屑????
在進行完前期的鋪墊之后,我們就可以開始完成動態(tài)的面包屑了
封裝面包屑組件:
我們查看element-plus
官網的相關信息之后,發(fā)現(xiàn)要實現(xiàn)面包屑的功能需要使用這兩個組件
el-breadcrumb
用來包裹所有子項el-breadcrumb-item
這是每個子項
廢話不多說直接展示源碼:
首先是布局部分
<template> ?<div> ? ?<el-breadcrumb class="breadcrumb" separator="/"> ? ? ?<transition-group name="breadcrumb"> ? ? ? ?<el-breadcrumb-item ? ? ? ? ?v-for="(item, index) in breadcrumbData" ? ? ? ? ?:key="item.path" ? ? ? ?> ? ? ? ? ?<!-- 不可以點擊項 --> ? ? ? ? ?<span ? ? ? ? ? ?v-if="index === breadcrumbData.length - 1" ? ? ? ? ? ?class="no-redirect" ? ? ? ? ? ?>{{ item.meta.title }}</span ? ? ? ? ?> ? ? ? ? ?<!-- 可以點擊項 --> ? ? ? ? ?<a v-else class="redirect" @click.prevent="onLinkClick(item)">{{ ? ? ? ? ? item.meta.title ? ? ? ? }}</a> ? ? ? ?</el-breadcrumb-item> ? ? ?</transition-group> ? ?</el-breadcrumb> ?</div> </template>
第一部分的代碼就是根據(jù)獲取的路由數(shù)據(jù)進行面包屑的渲染,使用了v-for
來進行el-breadcrumb-item
的渲染,我們在這里規(guī)定了數(shù)組的最后一項是不可被點擊的,并且給它指定了樣式,然后其他項就可以被點擊,并且綁定了點擊事件,將渲染的item
傳遞過去,我們重點來講解一下js這部分的代碼。
js部分的代碼:
<script setup> import { ref, watch } from "vue"; import { useRoute, useRouter } from "vue-router"; import { useStore } from "vuex"; const route = useRoute(); const router = useRouter(); // 生成數(shù)組數(shù)據(jù) const breadcrumbData = ref([]); const getBreadcrumbData = () => { ?console.log(route.matched); ?breadcrumbData.value = route.matched.filter((item) => { ? ?return item.meta && item.meta.title; }); }; // 監(jiān)聽路由發(fā)生改變時觸發(fā) watch( ?route, () => { ? ?getBreadcrumbData(); }, { ? ?immediate: true, } ); // 處理點擊事件 const onLinkClick = (item) => { ?router.push(item.path); }; // 如果將來需要進行主題替換,所以這里獲取下動態(tài)樣式 const store = useStore(); // eslint-disable-next-line const linkHoverColor = ref(store.getters.globalCss.breadCrumbColor); </script>
- 首先我們先定義了一個數(shù)組,這個數(shù)組用來保存要渲染的面包屑數(shù)據(jù)項
- 接著我們定義了一個函數(shù),這個函數(shù)是為了獲取當前的路由項和在與給定路由匹配的根路由和這個路由,然后過濾一下數(shù)據(jù)項,根據(jù)數(shù)據(jù)項中是否有
title和meta對象
來過濾數(shù)據(jù),最終返回一個數(shù)組,里面就是面包屑要展示的數(shù)據(jù),其實和側邊欄數(shù)據(jù)是對應的 - 我們這里還是用了watch來監(jiān)測route的數(shù)據(jù)的變化,每當數(shù)據(jù)發(fā)生變化時候就調用
getBreadcrumbData
這個方法,重新給數(shù)組賦值 - 緊接著我定義了一個點擊事件,每當用戶點擊之后相應的子項的時候,我們就會跳轉到相應的頁面。
- 我們這里還是使用vuex,這個是為了之后項目可能會使用全局更換顏色(換膚功能),所以這里使用了全局的數(shù)據(jù)共享,根據(jù)
Vue3
新增的特性,我們可以在css中使用這個變量,當vuex中的數(shù)據(jù)改變,那么樣式就會進行相應改變。
動畫樣式的完成
.breadcrumb-enter-active, .breadcrumb-leave-active { ?transition: all 0.5s; } ? .breadcrumb-enter-from, .breadcrumb-leave-active { ?opacity: 0; ?transform: translateX(20px); } ? .breadcrumb-leave-active { ?position: absolute; }
基本的樣式的完成:
.breadcrumb { ?display: flex; ?font-size: 14px; ?line-height: 50px; ?margin-left: 8px; ?.no-redirect { ? ?color: #97a8be; ? ?cursor: text; } ?.redirect { ? ?color: #666; ? ?font-weight: 600; } ?.redirect:hover { ? ?// 將來需要進行主題替換,所以這里不去寫死樣式,這個是vue3的新增特性 ? ?color: v-bind(linkHoverColor); } }
到這一步我們的面包屑功能就算完成了,具體的演示我在一開始就進行了,大家可以參考我的代碼進行實現(xiàn)。
總結????
面包屑這個東西我在很早之前實現(xiàn)過,不過那個時候還是學vue2的時候,再加上時間間隔的比較長,因此有些生疏了,今天在來實現(xiàn)一下,鞏固一下原有的知識,做一個總結。
以上就是Vue3實現(xiàn)動態(tài)面包屑的代碼示例的詳細內容,更多關于Vue3 動態(tài)面包屑的資料請關注腳本之家其它相關文章!
相關文章
從0到1搭建element后臺框架優(yōu)化篇(打包優(yōu)化)
這篇文章主要介紹了從0到1搭建element后臺框架優(yōu)化篇(打包優(yōu)化),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05