国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

這篇具有很好參考價(jià)值的文章主要介紹了vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、前言:

二、網(wǎng)站頁(yè)面分析

三、開(kāi)發(fā)步驟

(一)、安裝element

(二)、安裝使用svg插件

(三)、編寫(xiě)主界面框架代碼

?(四)、編寫(xiě)菜單欄

?(五)、新建頁(yè)面及路由

(六)、定制頁(yè)面標(biāo)簽欄

第一步:

第二步:

(七)、修改封裝菜單欄

(八)、添加面包屑

四、結(jié)尾


一、前言:

先上圖,項(xiàng)目模板成品截圖:

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

開(kāi)源的vue管理后臺(tái)模板很多,如需快速開(kāi)發(fā)一個(gè)后臺(tái)管理可搜索“vue管理后臺(tái)模板”查找,本文旨在熟悉vue開(kāi)發(fā)過(guò)程實(shí)踐,適合vue剛?cè)腴T(mén)的小伙伴閱讀和動(dòng)手實(shí)踐,內(nèi)容偏長(zhǎng),只想要代碼的同學(xué)可直接點(diǎn)擊 源代碼。通過(guò)本章博客你可以學(xué)到:

(1)、element UI組件庫(kù)的使用。

(2)、如何自定義組件。

(3)、路由的熟練使用。

(4)、vue項(xiàng)目開(kāi)發(fā)思想的提升。

(5)、……

本項(xiàng)目在上一章節(jié)集成項(xiàng)目基礎(chǔ)上開(kāi)發(fā),可先點(diǎn)擊下方鏈接閱讀。(如閱讀本章無(wú)障礙請(qǐng)忽略)

vue系列(二)——vue3基礎(chǔ)項(xiàng)目(集成框架)搭建_蕭蕭風(fēng)的博客-CSDN博客目錄一、新建項(xiàng)目二、集成路由三、安裝配置axios(網(wǎng)絡(luò)請(qǐng)求庫(kù))四、使用vuex(暫無(wú))五、結(jié)尾打開(kāi)編輯器新建項(xiàng)目,填寫(xiě)項(xiàng)目名稱(chēng),點(diǎn)擊創(chuàng)建,之后等待項(xiàng)目加載完成就可以了。我的Hbuilder X 版本是3.4.14新建的項(xiàng)目目錄下面是vue項(xiàng)目加載頁(yè)面的形式,單頁(yè)渲染,所有的內(nèi)容展示都是在index.html頁(yè)面上進(jìn)行渲染,而App.vue是index.html里面最外層的組件容器、包含全局的js代碼css樣式。所有的頁(yè)面的渲染是在App.vue容器里面進(jìn)行文件main.js:入口js文件,所有全局文件的引https://blog.csdn.net/xxfen_/article/details/125327388?spm=1001.2014.3001.5501

二、網(wǎng)站頁(yè)面分析

網(wǎng)站由登錄頁(yè)、主界面、內(nèi)容頁(yè)組成。

主界面整體模塊是由:

(1)、導(dǎo)航欄;

(2)、左測(cè)導(dǎo)航菜單欄;

(3)、頁(yè)面標(biāo)簽卡欄;

(4)、內(nèi)容欄(展示頁(yè)面)。

組成。

菜單欄的點(diǎn)擊切換改變的只是內(nèi)容欄的內(nèi)容,由此得出:

登錄頁(yè)和主界面是一級(jí)路由,內(nèi)容頁(yè)是主界面下的嵌套路由。

三、開(kāi)發(fā)步驟

(一)、安裝element

官網(wǎng):?一個(gè) Vue 3 UI 框架 | Element Plus。

首先安裝國(guó)內(nèi)npm鏡像,這樣下載資源包速度會(huì)更快

npm install cnpm -g --registry=https://registry.npmmirror.com

然后,安裝element

npm install element-plus --save

?引入項(xiàng)目,在main.js文件中加入以下代碼

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
app.use(ElementPlus)

測(cè)試一下引入是否成功,在home.vue中加入按鈕組件

<el-button type="primary">Primary</el-button>

?vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?運(yùn)行項(xiàng)目:npm run dev

運(yùn)行效果如下,說(shuō)明引入成功:

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

(二)、安裝使用svg插件

  • ?安裝:

npm i vite-plugin-svg-icons -D

  • ?在src下新建存放svg目錄:

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

  • 在components目錄下新建組件:SvgIcon.vue
<template>
  <svg aria-hidden="true">
    <use :xlink:href="symbolId" />
  </svg>
</template>

<script>
  import { defineComponent, computed } from 'vue';

  export default defineComponent({
    name: 'SvgIcon',
    props: {
      prefix: {
        type: String,
        default: 'icon',
      },
      name: {
        type: String,
        required: true,
      },
    },
    setup(props) {
      const symbolId = computed(() => `#${props.prefix}-${props.name}`);
      return { symbolId };
    },
  });
</script>
  • ?在vite.config.js中配置:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
  	vue(),
	createSvgIconsPlugin({
	        // 指定需要緩存的圖標(biāo)文件夾
	        iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')],
	        // 指定symbolId格式
	        symbolId: '[name]',
	      })
  ]
})
  • 在main.js中引入,添加代碼:

//導(dǎo)入Svg圖片插件,可以在頁(yè)面上顯示Svg圖片
import 'virtual:svg-icons-register'
import SvgIcon from "./components/SvgIcon.vue";
app.component('SvgIcon',SvgIcon)

  • ?到了這里,運(yùn)行項(xiàng)目出現(xiàn)報(bào)錯(cuò):沒(méi)有找到fast-glob。就需要安裝fast-glob。

npm i fast-glob

  • ?測(cè)試使用

打開(kāi)Icon 圖標(biāo) | Element Plus

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?點(diǎn)擊圖標(biāo)復(fù)制svg內(nèi)容

在新建的svg目錄下新建svg文件,名稱(chēng)格式:icon-“圖標(biāo)名稱(chēng)”,粘貼內(nèi)容保存

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?在頁(yè)面中使用:

<SvgIcon name="aim" class="icon-svg" />

(三)、編寫(xiě)主界面框架代碼

  • 先搭建一個(gè)整體框架,home.vue 代碼
<template v-slot:default>
	<div :class="['content',isCollapse?'menu--fold':'menu--unfold']">
		<!-- 側(cè)邊菜單欄 -->
		<div class="menuLeft">
			<div class="menu-nav-header">
				<span>{{isCollapse?'控制臺(tái)':'管理控制臺(tái)'}}</span>
			</div>
             <!--todo 菜單欄組件 -->
		</div>
		<!-- 右邊內(nèi)容 -->
		<div class="content-main">
			<div class="navTop horizontalView">
				<div class="nav_tools horizontalView">
					<SvgIcon :name="isCollapse?'expand':'fold'" class="icon-svg" @click="isCollapse=!isCollapse" />
				</div>
			</div>
			<!-- todo 內(nèi)容組件 -->
		</div>
	</div>
</template>

<script>
export default {
		components: {

		},
		data: function() {
			return {
				isCollapse: false
				
			}
		}
}
</script>

<style>
	@import url('../assets/css/home.css');
</style>

  • ?編寫(xiě)css樣式

?vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?通用的放在base.css中,頁(yè)面獨(dú)有的放在home.css

  • base.css代碼:
.content {
	width: 100%;
	height: 100%;
	font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微軟雅黑", Arial, sans-serif;
}

/* 水平布局 居中*/
.horizontalView {
	position: relative;
	flex-direction: row;
	display: flex;
	align-items: center;
}

/* 垂直布局居中 */
.verticalView {
	position: relative;
	flex-direction: column;
	display: flex;
	align-items: center;
}

/* 居中 */
.center {
	position: absolute;
	top: 50%;
	left: 50%;
	font-size: 28px;
	transform: translate(-50%, -50%);
}

.w100 {
	width: 100%;
}

.h100 {
	height: 100%;
}
.icon-svg {
	width: 1.4rem;
	height: 1.4rem;
	fill: currentColor;
	overflow: hidden;
}
  • home.css代碼:
/* -------側(cè)邊欄 折疊 */
.menu--fold .menuLeft {
	width: 64px;
}

.menu--fold .content-main {
	margin-left: 64px;
}

/* --------------------- */

/* ---------側(cè)邊欄 展開(kāi) */
.menu--unfold .menuLeft {
	width: 230px;
}

.menu--unfold .content-main {
	margin-left: 230px;
}

/* ------------- */

.navTop {
	position: relative;
	width: 100%;
	height: 50px;
	z-index: 100;
	box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
	box-sizing: border-box;
	background: white;
}

.nav_tools {
	height: 100%;
}

.nav_tools .icon-svg {
	margin-left: 10px;
	color: #5b5b5b;
}

.menuLeft {
	position: fixed;
	top: 0;
	left: 0;
	bottom: 0;
	z-index: 1020;
	overflow: hidden;
	background-color: #263238;
}

.content-main {
	position: relative;
	background: #f1f4f5;
	height: 100%;

}
.menu-nav-header {
	color: white;
	height: 50px;
	line-height: 50px;
	text-align: center;
	font-size: 20px;
	font-weight: bold;
	/* background-color: #9fbea7; */
	background-color: #566f7e;
}

/* 動(dòng)畫(huà) */
.nav_tools,
.menuLeft,
.content-main {
	transition: inline-block 0.3s, left 0.3s, width 0.3s, margin-left 0.3s, font-size 0.3s;
}





  • ?base.css放在app.vue

@import url("./assets/css/base.css");

  • 看看頁(yè)面效果:

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

  • 點(diǎn)擊上邊折疊按鈕

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?(四)、編寫(xiě)菜單欄

請(qǐng)先去了解組件使用文檔:Menu 菜單 | Element Plus

復(fù)制實(shí)例代碼自定義內(nèi)容屬性及樣式,關(guān)閉組件提供的折疊動(dòng)畫(huà),自定義動(dòng)畫(huà)樣式

  • 在home.vue中加入修改菜單組件代碼
<!--todo 菜單欄組件 -->
			<el-menu active-text-color="#fff" background-color="#263238" class="el-menu-vertical-demo"
				:collapse-transition="false" default-active="2" text-color="#96a4ab " @open="handleOpen"
				@close="handleClose" :collapse="isCollapse">
				<el-menu-item index="1">
					<SvgIcon name="home" class="icon-svg" />
					<span slot="">&nbsp;&nbsp;首頁(yè)</span>
				</el-menu-item>
				<el-sub-menu index="2">
					<template #title>
						<SvgIcon name="img" class="icon-svg" />
						<span>&nbsp;&nbsp;圖片管理</span>
					</template>
					<el-menu-item index="1-1">
						<SvgIcon name="img" class="icon-svg" />
						<span>&nbsp;&nbsp;圖片1</span>
					</el-menu-item>
					<el-menu-item index="1-2">
						<SvgIcon name="img" class="icon-svg" />
						<span>&nbsp;&nbsp;圖片2</span>
					</el-menu-item>
					<el-sub-menu index="1-4">
						<template #title>
							<SvgIcon name="img" class="icon-svg" />
							<span>&nbsp;&nbsp;圖片3</span>
						</template>
						<el-menu-item index="1-4-1">
							<SvgIcon name="img" class="icon-svg" />
							<span>&nbsp;&nbsp;圖片三級(jí)子菜單</span>
						</el-menu-item>
					</el-sub-menu>
				</el-sub-menu>
				<el-sub-menu index="3">
					<template #title>
						<SvgIcon name="collection" class="icon-svg" />
						<span>&nbsp;&nbsp;收藏管理</span>
					</template>
					<el-menu-item index="3">
						<SvgIcon name="collection" class="icon-svg" />
						<span class="icon-text">&nbsp;&nbsp;收藏</span>
					</el-menu-item>
				</el-sub-menu>

				<el-menu-item index="4">
					<SvgIcon name="about" class="icon-svg" />
					<span>&nbsp;&nbsp;設(shè)置</span>
				</el-menu-item>

			</el-menu>
  • home.css 中加入修改樣式代碼
/* 修改菜單欄樣式樣式 */

.menuLeft .el-menu {
	border-right: none;
}

.el-menu-vertical-demo:not(.el-menu--collapse) {
	border-right: none;
	width: 230px;
}

.el-menu .icon-text {
	margin-left: 10px;
}

  • 頁(yè)面效果:

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?菜單欄編寫(xiě)到這還沒(méi)完呢,上面這種寫(xiě)法是每次添加、修改或刪除菜單都要在頁(yè)面中找到位置再修改有點(diǎn)繁瑣,在頁(yè)面代碼多了或菜單項(xiàng)好多時(shí)去編輯修改更是麻煩的一比,所以等后面再來(lái)優(yōu)化代碼,把菜單封裝成菜單數(shù)據(jù)集合,然后再在頁(yè)面中for循環(huán)展示。

?(五)、新建頁(yè)面及路由

  • ?新建頁(yè)面:

index.vue,img1.vue,collect.vue,set.vue 。并在頁(yè)面內(nèi)加上頁(yè)面標(biāo)識(shí)文字。

  • 配置路由:

router目錄下index.js代碼:

// import Vue from 'vue'   //引入Vue
import {
	createRouter,
	createWebHashHistory
} from 'vue-router' //引入vue-router
// Vue.use(Router)  //Vue全局使用Router

import home from '../views/home.vue'
import login from '../views/login.vue'
import index from '../views/index.vue'
import collect from '../views/collect.vue'
import set from '../views/set.vue'
import img1 from '../views/img1.vue'

const routes = [{
		path: '',
		redirect: "home"
	}, {
		path: '/',
		redirect: "home"
	},
	{
		path: '/login',
		name: 'login',
		component: login,
		meta: {
			title: '登錄'
		}
	},
	{
		path: '/home',
		name: 'home',
		component: home,
        /* 子路由 */
		children: [{
				path: '/',
				redirect: "index"
			},{
				path: '',
				redirect: "index"
			}, {
				path: '/index',
				name: 'index',
				component: index,
				meta: {
					title: '首頁(yè)',
				}
			},
			{
				path: '/collect',
				name: 'collect',
				component: collect,
				meta: {
					title: '收藏',
					isTab: true
				}
			},
			{
				path: '/img1',
				name: 'img1',
				component: img1,
				meta: {
					title: '圖片1',
					isTab: true
				}
			},
			{
				path: '/set',
				name: 'set',
				component: set,
				meta: {
					title: '設(shè)置',
					isTab: true
				}
			}
		]
	}
];

// 導(dǎo)航守衛(wèi)
// 使用 router.beforeEach 注冊(cè)一個(gè)全局前置守衛(wèi),判斷用戶(hù)是否登陸
/* router.beforeEach((to, from, next) => {
	if (to.path === '/login') {
		next();
	} else {
		let token = localStorage.getItem('Authorization');

		if (token === null || token === '') {
			next('/login');
		} else {
			next();
		}
	}
}); */
const router = createRouter({
	history: createWebHashHistory(),
	routes
})
export default router;
  • ?在home.vue中加入路由組件測(cè)試一下路由跳轉(zhuǎn):

<router-view />

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

  • ?在菜單項(xiàng)中加入跳轉(zhuǎn)路由代碼

在“首頁(yè)”菜單項(xiàng)加上點(diǎn)擊跳轉(zhuǎn)路由代碼:@click="$router.push({ name: 'index' })"

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

同理,在其它菜單項(xiàng)上加入相應(yīng)代碼。

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

  • ?測(cè)試效果

點(diǎn)擊“設(shè)置”

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?點(diǎn)擊“收藏”

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?ok,路由配置成功!

(六)、定制頁(yè)面標(biāo)簽欄

二步走:

(1)、監(jiān)聽(tīng)路由的切換,存儲(chǔ)跳轉(zhuǎn)的路由的name(或path)集合,并存儲(chǔ)當(dāng)前的路由name。

(2)、使用 el-tabs標(biāo)簽頁(yè)組件Tabs 標(biāo)簽頁(yè) | Element Plus,自定義樣式,編寫(xiě)內(nèi)容組件。

第一步:

  • 監(jiān)聽(tīng)路由變化,watch與data同層:
watch: {
			$route: {
				handler(to, from) {
					if (to.path != from.path) {
						// 處理路由
						this.routeHandle(to);
					}
				}
			}
		},
  • 算了,直接放js全部代碼吧:
<script>

	export default {
		components: {

		},
		data: function() {
			return {
				isCollapse: false,
				mainTabs: [],
				mainTabsActiveName: '',
				menuActiveName: '',
				menus: []
			}
		},
		created() {
			let that = this;
			that.routeHandle(that.$route);
		},
		// 監(jiān)聽(tīng)路由變化
		watch: {
			$route: {
				handler(to, from) {
					if (to.path != from.path) {
						// 處理路由
						this.routeHandle(to);
					}
				}
			}
		},
		methods: {
			resetDocumentClientHeight: function() {
				this.documentClientHeight = document.documentElement['clientHeight'];
				window.onresize = () => {
					this.documentClientHeight = document.documentElement['clientHeight'];
					this.loadSiteContentViewHeight();
				};
			},
			loadSiteContentViewHeight: function() {
				let height = this.documentClientHeight - 52; //減去導(dǎo)航欄高度50 
				console.log(this.$route.meta.isTab)
				if (this.$route.meta.isTab) {
					height -= 70; //減去tab欄高度40,減去上下邊距30
					/* this.siteContentViewHeight = {
						'min-height': height + 'px'
					}; */
					this.siteContentViewHeight = height;
				} else {
					height -= 30;
					//給內(nèi)容區(qū)設(shè)置高度
					this.siteContentViewHeight = height;
				}

			},
			routeHandle: function(route) {
				//每次切換頁(yè)面,重新計(jì)算頁(yè)面高度和內(nèi)容區(qū)高度
				this.resetDocumentClientHeight();
				this.loadSiteContentViewHeight();
				if (route.meta.isTab) {
					// tab選中, 不存在先添加
					var tab = this.mainTabs.filter(item => item.name === route.name)[0];
					if (!tab) {
						if (route.meta.isDynamic) {
							route = this.dynamicMenuRoutes.filter(item => item.name === route.name)[0];
							if (!route) {
								return console.error('未能找到可用標(biāo)簽頁(yè)!');
							}
						}
						tab = {
							menuId: route.meta.menuId || route.name,
							name: route.name,
							title: route.meta.title,
							iframeUrl: route.meta.iframeUrl || '',
							params: route.params,
							query: route.query
						};
						this.mainTabs = this.mainTabs.concat(tab);
					}
					this.menuActiveName = tab.menuId + '';
					this.mainTabsActiveName = tab.name;
				}
			},
			mounted: function() {
				let that = this;
				that.resetDocumentClientHeight();
				that.loadSiteContentViewHeight();
			}
		}
	}
</script>

第二步:

  • 編寫(xiě)組件
<!-- todo 內(nèi)容組件 -->
			<el-tabs v-if="$route.meta.isTab" v-model="mainTabsActiveName" :closable="true"
				@tab-click="selectedTabHandle" @tab-remove="removeTabHandle">
				
				<el-scrollbar ref="scroll" :height="siteContentViewHeight+32+'px'" @scroll="scroll">
					<el-tab-pane v-for="item in mainTabs" :label="item.title" :name="item.name">
						<el-card :style="'min-height:'+siteContentViewHeight + 'px'">
			
							<router-view v-if="item.name === mainTabsActiveName" />
			
						</el-card>
					</el-tab-pane>
				</el-scrollbar>
			</el-tabs>
			<div v-else>
				<el-scrollbar ref="scroll" :height="siteContentViewHeight+32+'px'" @scroll="scroll">
					<!-- 主入口標(biāo)簽頁(yè) e -->
					<el-card :style="'min-height:'+ siteContentViewHeight + 'px'">
						<router-view />
					</el-card>
				</el-scrollbar>
			</div>
  • 修改樣式:

/* 修改標(biāo)簽欄樣式 */
.content-main .el-tabs .el-tabs__header {
	z-index: 90;
	padding: 0 55px 0 15px;
	box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04);
	background-color: #fff;
}

.content-main .el-tabs .el-tabs__nav-wrap::after {
	width: 0px;
}

.content-main .el-scrollbar .el-card {
	margin: 15px 15px;
	
}
.content-main .el-tabs .el-tabs__header{
	margin: unset;
}
.content-main .el-tabs .el-tab-pane{
}
  • ?在methods中添加函數(shù)方法
selectedTabHandle: function(tab, e) {
				tab = this.mainTabs.filter(item => item.name === tab.paneName);
				if (tab.length >= 1) {
					this.$router.push({
						name: tab[0].name,
						query: tab[0].query,
						params: tab[0].params
					});
				}
			},
			removeTabHandle: function(tabName) {
				this.mainTabs = this.mainTabs.filter(item => item.name !== tabName);
				if (this.mainTabs.length >= 1) {
					// 當(dāng)前選中tab被刪除
					if (tabName === this.mainTabsActiveName) {
						var tab = this.mainTabs[this.mainTabs.length - 1];
						this.$router.push({
								name: tab.name,
								query: tab.query,
								params: tab.params
							},
							() => {
								this.mainTabsActiveName = this.$route.name;
							}
						);
					}
				} else {
					this.menuActiveName = '';
					this.$router.push({
						name: 'Home'
					});
				}
			},
  • 效果:

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

(七)、修改封裝菜單欄

  • ?在router文件下新建文件

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

  • ?menu.js文件代碼:
var mu = {
	longTitle: '管理控制臺(tái)',
	littleTitle: '控制臺(tái)',
	items: [{
			iconName: 'home',
			name: '首頁(yè)',
			routerName: 'index',
			disabled: false
		}, {
			iconName: 'img',
			name: '圖片管理',
			submenu: [{
				iconName: 'img',
				name: '圖片一',
				routerName: 'img1',
				disabled: false
			}, {
				iconName: 'img',
				name: '圖片二',
				routerName: 'img2',
				disabled: false
			}, {
				iconName: 'img',
				name: '圖片三管理',
				submenu: [{
					iconName: 'img',
					name: '圖片三',
					routerName: 'img1',
					disabled: true
				}]

			}]
		},
		{
			iconName: 'collection',
			name: '收藏管理',
			submenu: [{
				iconName: 'collection',
				name: '收藏',
				routerName: 'collect',
				disabled: false
			}]
		},
		{
			iconName: 'about',
			name: '設(shè)置',
			routerName: 'set',
			disabled: false
		}

	]
}
export default mu;
  • 重新寫(xiě)菜單組件:
<div class="menu-nav-header">
				<span>{{isCollapse?littleTitle:longTitle}}</span>
			</div>
			<el-menu active-text-color="#fff" background-color="#263238" class="el-menu-vertical-demo"
				:collapse-transition="false"  text-color="#96a4ab " @open="handleOpen"
				@close="handleClose" :collapse="isCollapse">
				<template v-for="(item,index) in menus">
					
					<el-menu-item v-if="!item.submenu" :index="index" @click="$router.push({ name: item.routerName })" :disabled="item.disabled">
						<SvgIcon :name="item.iconName" class="icon-svg" />
						<span slot="">&nbsp;&nbsp;{{item.name}}</span>
					</el-menu-item>
					<el-sub-menu v-else :index="index">
						<template #title>
							<SvgIcon :name="item.iconName" class="icon-svg" />
							<span slot="">&nbsp;&nbsp;{{item.name}}</span>
						</template>
						<template v-for="(submenuItem,submenuIndex) in item.submenu">
						
							<el-menu-item v-if="!submenuItem.submenu" :index="index+'-'+submenuIndex" :disabled="submenuItem.disabled"
								@click="$router.push({ name: submenuItem.routerName })">
								<SvgIcon :name="submenuItem.iconName" class="icon-svg" />
								<span slot="">&nbsp;&nbsp;{{submenuItem.name}}</span>
							</el-menu-item>
							<el-sub-menu v-else :index="index+'-'+submenuIndex">
								<template #title>
									<SvgIcon :name="submenuItem.iconName" class="icon-svg" />
									<span slot="">&nbsp;&nbsp;{{submenuItem.name}}</span>
								</template>
								<el-menu-item v-for="(item3,index3) in submenuItem.submenu" :index="index" :disabled="item3.disabled"
									@click="$router.push({ name: item3.routerName })">
									<SvgIcon :name="item3.iconName" class="icon-svg" />
									<span slot="">&nbsp;&nbsp;{{item3.name}}</span>
								</el-menu-item>

							</el-sub-menu>
						</template>
					</el-sub-menu>
				</template>
			</el-menu>

只嵌套了三級(jí)子菜單,如果有更多級(jí)子菜單,需要在組件中再嵌套多個(gè)for循環(huán)即可。

  • script代碼中首先導(dǎo)入menu

import mu from '../router/menu/menu.js';

  • ?在created中調(diào)用

vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板

?這樣,修改菜單欄就只需要在menu.js進(jìn)行編輯了,不再需要修改頁(yè)面代碼。

(八)、添加面包屑

  • 頁(yè)面中加入面包屑組件:
<el-breadcrumb separator="/">
					<el-breadcrumb-item v-if="!breadcrumbList.size && breadcrumbList[0]!='首頁(yè)'" :to="{ name: 'index' }">
						首頁(yè)
					</el-breadcrumb-item>
					<el-breadcrumb-item v-for="it in breadcrumbList">{{it}}</el-breadcrumb-item>
				</el-breadcrumb>
  • 在created中,將菜單欄集合做下處理,處理成下面格式:
{
"首頁(yè)":["首頁(yè)"],
"圖片一":["圖片管理","圖片一"],
......
}
  • 代碼:
    //菜單項(xiàng)層級(jí)處理,做一個(gè)面包屑集合保存
            var mus=that.menus
            for (let i1 of mus) {
                if (i1.submenu) {
                    for (let i2 of i1.submenu) {
                        if (i2.submenu) {
                            for (let i3 of i2.submenu) {
                                if (!i3.submenu) {
                                    that.breadcrumbObj[i3.name] = [i1.name, i2.name, i3.name];
                                }
                            }
                        } else {
                            that.breadcrumbObj[i2.name] = [i1.name, i2.name];
                            console.log(i2.name)
                        }
                    }
                } else {
                    that.breadcrumbObj[i1.name] = [i1.name];
                    console.log(i1.name)
                }
            }

路由發(fā)生變化時(shí)賦值,在watch中加入:

this.breadcrumbList = this.breadcrumbObj[to.meta.title]

注意:路由中的name要與菜單中的name保持一致。

四、結(jié)尾

到這里,一個(gè)簡(jiǎn)單的管理后臺(tái)基礎(chǔ)模板就完成了,源代碼拿走不謝,碼字不易,既然看到了這里,點(diǎn)個(gè)贊再走吧。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-423385.html

到了這里,關(guān)于vue系列(三)——手把手教你搭建一個(gè)vue3管理后臺(tái)基礎(chǔ)模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 手把手教你搭建Spring Boot+Vue前后端分離

    手把手教你搭建Spring Boot+Vue前后端分離

    1 什么是前后端分離 前后端分離是目前互聯(lián)網(wǎng)開(kāi)發(fā)中比較廣泛使用的開(kāi)發(fā)模式,主要是將前端和后端的項(xiàng)目業(yè)務(wù)進(jìn)行分離,可以做到更好的解耦合,前后端之間的交互通過(guò)xml或json的方式,前端主要做用戶(hù)界面的渲染,后端主要負(fù)責(zé)業(yè)務(wù)邏輯和數(shù)據(jù)的處理。 2 Spring Boot后端搭建

    2023年04月08日
    瀏覽(100)
  • 手把手教你使用vue2搭建微前端micro-app

    手把手教你使用vue2搭建微前端micro-app

    ? 本文主要講述新手小白怎么搭建micro-app,幾乎是每一步都有截圖說(shuō)明。上手應(yīng)該很簡(jiǎn)單。 這段時(shí)間在網(wǎng)上找了很多有關(guān)微前端相關(guān)的知識(shí),起初本來(lái)是想著先搭建一個(gè)single-spa,但是奈何網(wǎng)上能找到的內(nèi)容都是千篇一律。我也是搭了好久沒(méi)搭出來(lái)。不知道為啥,反正就是一

    2024年01月20日
    瀏覽(37)
  • C#系列-手把手教你安裝 Visual Studio配置C#開(kāi)發(fā)環(huán)境,創(chuàng)建第一個(gè)C#程序

    C#系列-手把手教你安裝 Visual Studio配置C#開(kāi)發(fā)環(huán)境,創(chuàng)建第一個(gè)C#程序

    下載軟件 點(diǎn)擊此處開(kāi)始下載 安裝依賴(lài) 選擇.NET desktop development 安裝完成,重啟電腦 解決方案1 找到這個(gè)目錄C:ProgramDataMicrosoftVisualStudioPackages 直接搜索VC_redist 找到這個(gè)VC_redist.x64.exe文件,一般會(huì)有兩個(gè),直接全部雙擊安裝 返回VS installer 界面點(diǎn)擊:更多—修復(fù) 解決方

    2024年04月26日
    瀏覽(33)
  • 手把手完成前端Vue3 + Vite項(xiàng)目工程化搭建

    基于 Vue3 + Vite 搭建的前端工程化項(xiàng)目演示模板 開(kāi)發(fā)環(huán)境: Node.js v16.14.2 + npm v8.3.2 開(kāi)發(fā)工具: Visual Studio Code or WebStorm 源代碼管理: Git npm鏡像: npm config set registry https://registry.npmmirror.com 技術(shù)棧 描述 Vue 漸進(jìn)式 JavaScript 框架 Vite 新一代前端開(kāi)發(fā)與構(gòu)建工具 Element Plus 基于 Vue

    2024年04月11日
    瀏覽(30)
  • (一)手把手教你如何通過(guò)ARM DesignStart計(jì)劃在FPGA上搭建一個(gè)Cortex-M3軟核

    (一)手把手教你如何通過(guò)ARM DesignStart計(jì)劃在FPGA上搭建一個(gè)Cortex-M3軟核

    1.1 如何下載ARM DesignStart Cortex-M3相關(guān)文件 ? 關(guān)于ARM DesignStart計(jì)劃的介紹:ARM DesignStart計(jì)劃——私人定制一顆ARM處理器 - 知乎 (zhihu.com)。 ? 在arm Developer官網(wǎng)[Arm Developer](https://developer.arm.com/downloads)右上方的Downloads中搜索ARM DesignStart Cortex-M3第一個(gè)即是FPGA上定制的Cortex-M3軟核IP。

    2024年02月04日
    瀏覽(24)
  • 【項(xiàng)目實(shí)戰(zhàn)】手把手教你搭建前后端分離項(xiàng)目 SpringBoot + Vue + Element UI + Mysql

    【項(xiàng)目實(shí)戰(zhàn)】手把手教你搭建前后端分離項(xiàng)目 SpringBoot + Vue + Element UI + Mysql

    ?? 博主介紹 : 博主從事應(yīng)用安全和大數(shù)據(jù)領(lǐng)域,有8年研發(fā)經(jīng)驗(yàn),5年面試官經(jīng)驗(yàn),Java技術(shù)專(zhuān)家,WEB架構(gòu)師,阿里云專(zhuān)家博主,華為云云享專(zhuān)家,51CTO TOP紅人 Java知識(shí)圖譜點(diǎn)擊鏈接: 體系化學(xué)習(xí)Java(Java面試專(zhuān)題) ???? 感興趣的同學(xué)可以收藏關(guān)注下 , 不然下次找不到喲

    2024年02月16日
    瀏覽(27)
  • 手把手教你搭建微信聊天機(jī)器人系列(一):文心一言(百度千帆ERNIE-Bot大模型)API測(cè)試

    手把手教你搭建微信聊天機(jī)器人系列(一):文心一言(百度千帆ERNIE-Bot大模型)API測(cè)試

    ????????今年年初chatgpt大火,國(guó)產(chǎn)gpt文心一言也提供了內(nèi)測(cè)服務(wù),大家可以去訪問(wèn)官網(wǎng)申請(qǐng)?bào)w驗(yàn)。文心一言APP上的功能更加強(qiáng)大,可以看這個(gè)測(cè)評(píng)文章。作為程序猿的我們,想接入文心一言的能力,比如開(kāi)發(fā)一個(gè)聊天機(jī)器人,要怎么做呢?百度在其開(kāi)發(fā)者平臺(tái)開(kāi)放了大模

    2024年02月07日
    瀏覽(29)
  • 手把手教你搭建微信聊天機(jī)器人系列(三):搭建對(duì)接文心一言(ERNIE-Bot大模型)接口的微信聊天機(jī)器人

    手把手教你搭建微信聊天機(jī)器人系列(三):搭建對(duì)接文心一言(ERNIE-Bot大模型)接口的微信聊天機(jī)器人

    ????????上一章介紹了eggjs+wechaty搭建一個(gè)簡(jiǎn)單的微信聊天機(jī)器人,只是實(shí)現(xiàn)了簡(jiǎn)單的回復(fù),這一章我們將對(duì)接ERNIE-Bot接口,實(shí)現(xiàn)智能回復(fù)。 ????????我們?cè)谏弦徽麓a基礎(chǔ)上進(jìn)行調(diào)整,首先我們要加入access_token的請(qǐng)求邏輯。第一章我們說(shuō)過(guò),請(qǐng)求需要使用應(yīng)用對(duì)應(yīng)的

    2024年02月03日
    瀏覽(20)
  • 手把手教你從0搭建SpringBoot項(xiàng)目

    手把手教你從0搭建SpringBoot項(xiàng)目

    用到的工具:idea 2021、Maven 3.6.3、postman 框架:SpringBoot、Mybatis 數(shù)據(jù)庫(kù):Mysql8.0.30 安裝配置參考博文 注意: 1.下載maven注意idea與Maven版本的適配: 2.為了避免每次創(chuàng)建項(xiàng)目都要改Maven配置,可以修改idea創(chuàng)建新項(xiàng)目的設(shè)置 二、安裝數(shù)據(jù)庫(kù) mysql8安裝參考博文 **注意:**連接不上往

    2024年02月03日
    瀏覽(23)
  • 手把手教你,本地RabbitMQ服務(wù)搭建(windows)

    手把手教你,本地RabbitMQ服務(wù)搭建(windows)

    前面已經(jīng)對(duì)RabbitMQ介紹了很多內(nèi)容,今天主要是和大家搭建一個(gè)可用的RabbitMQ服務(wù)端,方便后續(xù)進(jìn)一步實(shí)操與細(xì)節(jié)分析 跟我們跑java項(xiàng)目,要裝jdk類(lèi)似。rabbitMQ是基于Erlang開(kāi)發(fā)的,因此安裝rabbitMQ服務(wù)器之前,需要先安裝Erlang環(huán)境。 【PS: 我已經(jīng)上傳了對(duì)應(yīng)資源,windows可直接下載

    2024年02月14日
    瀏覽(37)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包