vue+elementUI實(shí)現(xiàn)動態(tài)面包屑
本文實(shí)例為大家分享了vue+elementUI實(shí)現(xiàn)動態(tài)面包屑的具體代碼,供大家參考,具體內(nèi)容如下
引言
后臺管理系統(tǒng)中,經(jīng)常會出現(xiàn)需要面包屑的情況,但是又不想每個頁面都實(shí)現(xiàn)一個,這樣不方便維護(hù),因此封裝了面包屑組件,方便在頁面使用
封裝組件
<!-- Breadcrumb/index.vue --> ? ? <template> ? <div> ? ? <el-breadcrumb class="breadcrumb" separator="/"> ? ? ? <transition-group name="breadcrumb"> ? ? ? ? <el-breadcrumb-item v-for="(item, index) in breadList" :key="item.path"> ? ? ? ? ? <span ? ? ? ? ? ? v-if=" ? ? ? ? ? ? ? item.redirect === $route.path || index == breadList.length - 1 ? ? ? ? ? ? " ? ? ? ? ? > ? ? ? ? ? ? {{ item.meta.title }} ? ? ? ? ? </span> ? ? ? ? ? <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> ? ? ? ? </el-breadcrumb-item> ? ? ? </transition-group> ? ? </el-breadcrumb> ? </div> </template> <script lang="ts"> import Vue from 'vue'; export default Vue.extend({ ? data () { ? ? return { ? ? ? // 路由集合 ? ? ? breadList: [] as any[] ? ? }; ? }, ? methods: { ? ? // 判斷是否包含首頁路由 ? ? isDashboard (route: { name: string }) { ? ? ? const name = route && route.name; ? ? ? if (!name) { ? ? ? ? return false; ? ? ? } ? ? ? return route.name === 'Dashboard'; ? ? }, ? ? // 面包屑跳轉(zhuǎn) ? ? handleLink (item: { redirect: any; path: any }) { ? ? ? const { redirect, path } = item; ? ? ? redirect ? this.$router.push(redirect) : this.$router.push(path); ? ? }, ? ? // 判斷當(dāng)前面包屑 ? ? init () { ? ? ? this.breadList = []; ? ? ? this.$route.matched.forEach((item) => { ? ? ? ? if (item.meta.title) { ? ? ? ? ? this.breadList.push(item); ? ? ? ? } ? ? ? }); ? ? ? if (!this.isDashboard(this.breadList[0])) { ? ? ? ? this.breadList.unshift({ ? ? ? ? ? path: '/dashboard/index', ? ? ? ? ? meta: { title: '首頁' } ? ? ? ? }); ? ? ? } ? ? } ? }, ? created () { ? ? this.init(); ? }, ? // 當(dāng)組件放在總布局組件中,需要監(jiān)聽路由變化 ? watch: { ? ? $route () { ? ? ? this.init(); ? ? } ? } }); </script> <style lang="less" scoped> .breadcrumb-enter-active, .breadcrumb-leave-active { ? transition: all 0.5s; } .breadcrumb-enter, .breadcrumb-leave-active { ? opacity: 0; ? transform: translateX(20px); } .breadcrumb-move { ? transition: all 0.5s; } .breadcrumb-leave-active { ? position: absolute; } </style>
頁面使用
<template> ? <div> ? ? <my-breadcrumb></my-breadcrumb> ? ? four ? </div> </template> <script lang="ts"> import Vue from 'vue'; import MyBreadcrumb from '@/components/Breadcrumb/index.vue'; export default Vue.extend({ ? components: { ? ? MyBreadcrumb ? } }); </script> <style scoped> </style>
路由文件參考
// router/index.ts import Vue from 'vue'; import VueRouter from 'vue-router'; import Login from '@/views/login/index.vue'; import Layout from '@/layout/index.vue'; Vue.use(VueRouter); /** ?* hidden 表示是否需要在側(cè)邊導(dǎo)航欄出現(xiàn) ,true表示不需要 ?* isFirst 表示是否只有一級權(quán)限,只出現(xiàn)在只有一個子集,沒有其他孫子集 ?* 當(dāng)權(quán)限擁有多個子集或者孫子集,一級權(quán)限需要加上 meta ?* 二級權(quán)限擁有子集,也必須有 meta ?*/ // 基礎(chǔ)路由 export const constantRoutes = [ ? { ? ? path: '/redirect', ? ? component: Layout, ? ? hidden: true, ? ? children: [ ? ? ? { ? ? ? ? path: '/redirect/:path(.*)', ? ? ? ? component: () => import('@/views/redirect/index.vue') ? ? ? } ? ? ] ? }, ? { ? ? path: '/', ? ? redirect: '/dashboard', ? ? hidden: true ? }, ? { ? ? path: '/login', ? ? name: 'Login', ? ? component: Login, ? ? hidden: true ? }, ? { ? ? path: '/dashboard', ? ? component: Layout, ? ? redirect: '/dashboard/index', ? ? isFirst: true, ? ? children: [ ? ? ? { ? ? ? ? path: 'index', ? ? ? ? name: 'Dashboard', ? ? ? ? component: () => import('@/views/dashboard/index.vue'), ? ? ? ? meta: { ? ? ? ? ? title: '首頁', ? ? ? ? ? icon: 'el-icon-location' ? ? ? ? } ? ? ? } ? ? ] ? } ]; // 動態(tài)路由 export const asyncRoutes = [ ? { ? ? path: '/form', ? ? component: Layout, ? ? redirect: '/form/index', ? ? isFirst: true, ? ? children: [ ? ? ? { ? ? ? ? path: 'index', ? ? ? ? name: 'Form', ? ? ? ? component: () => import('@/views/form/index.vue'), ? ? ? ? meta: { ? ? ? ? ? title: '表單', ? ? ? ? ? role: 'form', ? ? ? ? ? icon: 'el-icon-location' ? ? ? ? } ? ? ? } ? ? ] ? }, ? { ? ? path: '/editor', ? ? component: Layout, ? ? redirect: '/editor/index', ? ? meta: { ? ? ? role: 'editors', ? ? ? title: '總富文本', ? ? ? icon: 'el-icon-location' ? ? }, ? ? children: [ ? ? ? { ? ? ? ? path: 'index', ? ? ? ? name: 'Editor', ? ? ? ? component: () => import('@/views/editor/index.vue'), ? ? ? ? meta: { ? ? ? ? ? title: '富文本', ? ? ? ? ? role: 'editor', ? ? ? ? ? icon: 'el-icon-location' ? ? ? ? } ? ? ? }, ? ? ? { ? ? ? ? path: 'two', ? ? ? ? name: 'Two', ? ? ? ? redirect: '/editor/two/three', ? ? ? ? component: () => import('@/views/editor/two.vue'), ? ? ? ? meta: { ? ? ? ? ? title: '二級導(dǎo)航', ? ? ? ? ? role: 'two', ? ? ? ? ? icon: 'el-icon-location' ? ? ? ? }, ? ? ? ? children: [ ? ? ? ? ? { ? ? ? ? ? ? path: 'three', ? ? ? ? ? ? name: 'Three', ? ? ? ? ? ? component: () => import('@/views/editor/three.vue'), ? ? ? ? ? ? meta: { ? ? ? ? ? ? ? title: '三級導(dǎo)航', ? ? ? ? ? ? ? role: 'three', ? ? ? ? ? ? ? icon: 'el-icon-location' ? ? ? ? ? ? } ? ? ? ? ? }, ? ? ? ? ? { ? ? ? ? ? ? path: 'four', ? ? ? ? ? ? name: 'Four', ? ? ? ? ? ? component: () => import('@/views/editor/four.vue'), ? ? ? ? ? ? meta: { ? ? ? ? ? ? ? title: '三級導(dǎo)航2', ? ? ? ? ? ? ? role: 'four', ? ? ? ? ? ? ? icon: 'el-icon-location' ? ? ? ? ? ? } ? ? ? ? ? } ? ? ? ? ] ? ? ? } ? ? ] ? }, ? { ? ? path: '/tree', ? ? component: Layout, ? ? redirect: '/tree/index', ? ? isFirst: true, ? ? children: [ ? ? ? { ? ? ? ? path: 'index', ? ? ? ? name: 'Tree', ? ? ? ? component: () => import('@/views/tree/index.vue'), ? ? ? ? meta: { ? ? ? ? ? title: '樹狀圖', ? ? ? ? ? role: 'tree', ? ? ? ? ? icon: 'el-icon-location' ? ? ? ? } ? ? ? } ? ? ] ? }, ? { ? ? path: '/excel', ? ? component: Layout, ? ? redirect: '/excel/index', ? ? isFirst: true, ? ? children: [ ? ? ? { ? ? ? ? path: 'index', ? ? ? ? name: 'Excel', ? ? ? ? component: () => import('@/views/excel/index.vue'), ? ? ? ? meta: { ? ? ? ? ? title: '導(dǎo)入導(dǎo)出', ? ? ? ? ? role: 'excel', ? ? ? ? ? icon: 'el-icon-location' ? ? ? ? } ? ? ? } ? ? ] ? } ]; // 出錯跳轉(zhuǎn)的路由 export const error = [ ? // 404 ? { ? ? path: '/404', ? ? component: () => import('@/views/error/index.vue'), ? ? hidden: true ? }, ? { ? ? path: '*', ? ? redirect: '/404', ? ? hidden: true ? } ]; const createRouter = () => ? new VueRouter({ ? ? scrollBehavior: () => ({ ? ? ? x: 0, ? ? ? y: 0 ? ? }), ? ? routes: constantRoutes ? }); const router = createRouter(); // 刷新路由 export function resetRouter () { ? const newRouter = createRouter(); ? (router as any).matcher = (newRouter as any).matcher; } export default router;
參考網(wǎng)上資料進(jìn)行封裝修改,具體需求可根據(jù)項(xiàng)目修改
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue+elementUI動態(tài)生成面包屑導(dǎo)航教程
- vue+elementUI組件遞歸實(shí)現(xiàn)可折疊動態(tài)渲染多級側(cè)邊欄導(dǎo)航
- Springboot項(xiàng)目中運(yùn)用vue+ElementUI+echarts前后端交互實(shí)現(xiàn)動態(tài)圓環(huán)圖(推薦)
- Vue+ElementUI實(shí)現(xiàn)從后臺動態(tài)填充下拉框的示例代碼
- vue+elementui實(shí)現(xiàn)動態(tài)控制表格列的顯示和隱藏
- vue+elementui實(shí)現(xiàn)動態(tài)添加行/可編輯的table
- 如何解決element-ui動態(tài)加載級聯(lián)選擇器默認(rèn)選中問題
相關(guān)文章
Vue使用v-viewer插件實(shí)現(xiàn)圖片預(yù)覽和縮放和旋轉(zhuǎn)等功能(推薦)
v-viewer是一個基于viewerjs封裝的vue圖片預(yù)覽組件,有預(yù)覽縮放拉伸旋轉(zhuǎn)切換拖拽等功能,支持配置化,這篇文章主要介紹了Vue使用v-viewer插件實(shí)現(xiàn)圖片預(yù)覽和縮放和旋轉(zhuǎn)等功能,需要的朋友可以參考下2023-02-02Vue項(xiàng)目引用百度地圖并實(shí)現(xiàn)搜索定位等功能(案例分析)
這篇文章主要介紹了Vue項(xiàng)目引用百度地圖并實(shí)現(xiàn)搜索定位等功能(案例分析),本篇文章為案例分析,技術(shù)點(diǎn)較多,所以篇幅較長,認(rèn)真閱覽的你一定會學(xué)到很多知識,需要的朋友可以參考下2022-09-09詳解Vue如何實(shí)現(xiàn)響應(yīng)式布局
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)響應(yīng)式布局的兩種方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下2023-12-12vue-cli-service serve報(bào)錯error:0308010C:digital enve
這篇文章主要介紹了vue-cli-service serve報(bào)錯error:0308010C:digital envelope routines::unsupported的解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06vue router 跳轉(zhuǎn)時打開新頁面的示例方法
這篇文章主要介紹了vue router 跳轉(zhuǎn)時打開新頁面的示例方法,本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07vue自定義加載指令v-loading占位圖指令v-showimg
這篇文章主要為大家介紹了vue自定義加載指令和v-loading占位圖指令v-showimg的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08vue3接口數(shù)據(jù)賦值對象,渲染報(bào)錯問題及解決
這篇文章主要介紹了vue3接口數(shù)據(jù)賦值對象,渲染報(bào)錯問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09