久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

瀏覽:2日期:2023-01-12 17:42:51

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

前言

在日常開(kāi)發(fā)中,項(xiàng)目中的菜單欄都是已經(jīng)實(shí)現(xiàn)好了的。如果需要添加新的菜單,只需要在路由配置中新增一條路由,就可以實(shí)現(xiàn)菜單的添加。

相信大家和我一樣,有時(shí)候會(huì)躍躍欲試自己去實(shí)現(xiàn)一個(gè)菜單欄。那今天我就將自己實(shí)現(xiàn)的菜單欄的整個(gè)思路和代碼分享給大家。

本篇文章重在總結(jié)和分享菜單欄的一個(gè)遞歸實(shí)現(xiàn)方式,代碼的優(yōu)化、菜單權(quán)限等不在本篇文章范圍之內(nèi),在文中的相關(guān)部分也會(huì)做一些提示,有個(gè)別不推薦的寫(xiě)法希望大家不要參考哦。

同時(shí)可能會(huì)存在一些細(xì)節(jié)的功能沒(méi)有處理或者沒(méi)有提及到,忘知曉。

最終的效果

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

本次實(shí)現(xiàn)的這個(gè)菜單欄包含有一級(jí)菜單、二級(jí)菜單和三級(jí)菜單這三種類型,基本上已經(jīng)可以覆蓋項(xiàng)目中不同的菜單需求。

后面會(huì)一步一步從易到難去實(shí)現(xiàn)這個(gè)菜單。

簡(jiǎn)單實(shí)現(xiàn)

我們都知道到element提供了 NavMenu 導(dǎo)航菜單組件,因此我們直接按照文檔將這個(gè)菜單欄做一個(gè)簡(jiǎn)單的實(shí)現(xiàn)。

基本的布局架構(gòu)圖如下:

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

菜單首頁(yè)-menuIndex

首先要實(shí)現(xiàn)的是菜單首頁(yè)這個(gè)組件,根據(jù)前面的布局架構(gòu)圖并且參考官方文檔,實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單。

<!-- src/menu/menuIndex.vue --><template> <div id='menu-index'> <el-container> <el-header> <TopMenu :logoPath='logoPath' :name='name'></TopMenu> </el-header> <el-container id='left-container'> <el-aside width='200px'> <LeftMenu></LeftMenu> </el-aside> <el-main> <router-view/> </el-main> </el-container> </el-container> </div></template><script>import LeftMenu from ’./leftMenu’;import TopMenu from ’./topMenu’;export default { name: ’MenuIndex’, components: {LeftMenu, TopMenu}, data() { return { logoPath: require('../../assets/images/logo1.png'), name: ’員工管理系統(tǒng)’ } }}</script><style lang='scss'> #menu-index{ .el-header{ padding: 0px; } }</style>

頂部菜單欄-topMenu

頂部菜單欄主要就是一個(gè)logo和產(chǎn)品名稱。

邏輯代碼也很簡(jiǎn)單,我直接將代碼貼上。

<!-- src/menu/leftMenu.vue --><template> <div id='top-menu'> <img :src='http://www.gepszalag.com/bcjs/logoPath' /> <p class='name'>{{name}}</p> </div></template><script>export default { name: ’topMenu’, props: [’logoPath’, ’name’]}</script><style lang='scss' scoped> $topMenuWidth: 80px; $logoWidth: 50px; $bg-color: #409EFF; $name-color: #fff; $name-size: 18px; #top-menu{ height: $topMenuWidth; text-align: left; background-color: $bg-color; padding: 20px 20px 0px 20px; .logo { width: $logoWidth; display: inline-block; } .name{ display: inline-block; vertical-align: bottom; color: $name-color; font-size: $name-size; } }</style>

這段代碼中包含了父組件傳遞給子組件的兩個(gè)數(shù)據(jù)。

props: [’logoPath’, ’name’]

這個(gè)是父組件menuIndex傳遞給子組件topMenu的兩個(gè)數(shù)據(jù),分別是logo圖標(biāo)的路徑和產(chǎn)品名稱。

完成后的界面效果如下。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

左側(cè)菜單欄-leftMenu

首先按照官方文檔實(shí)現(xiàn)一個(gè)簡(jiǎn)單的菜單欄。

<!-- src/menu/leftMenu.vue --><template> <div id='left-menu'> <el-menu :default-active='$route.path' :collapse='false'> <el-menu-item index='1'> <i class='el-icon-s-home'></i> <span slot='title'>首頁(yè)</span> </el-menu-item> <el-submenu index='2'> <template slot='title'> <i class='el-icon-user-solid'></i> <span slot='title'>員工管理</span> </template> <el-menu-item index='2-1'>員工統(tǒng)計(jì)</el-menu-item> <el-menu-item index='2-2'>員工管理</el-menu-item> </el-submenu> <el-submenu index='3'> <template slot='title'> <i class='el-icon-s-claim'></i> <span slot='title'>考勤管理</span> </template> <el-menu-item index='3-1'>考勤統(tǒng)計(jì)</el-menu-item> <el-menu-item index='3-2'>考勤列表</el-menu-item> <el-menu-item index='3-2'>異常管理</el-menu-item> </el-submenu> <el-submenu index='4'> <template slot='title'> <i class='el-icon-location'></i> <span slot='title'>工時(shí)管理</span> </template> <el-menu-item index='4-1'>工時(shí)統(tǒng)計(jì)</el-menu-item> <el-submenu index='4-2'> <template slot='title'>工時(shí)列表</template> <el-menu-item index='4-2-1'>選項(xiàng)一</el-menu-item> <el-menu-item index='4-2-2'>選項(xiàng)二</el-menu-item> </el-submenu> </el-submenu> </el-menu> </div></template><script>export default { name: ’LeftMenu’}</script><style lang='scss'> // 使左邊的菜單外層的元素高度充滿屏幕 #left-container{ position: absolute; top: 100px; bottom: 0px; // 使菜單高度充滿屏幕 #left-menu, .el-menu-vertical-demo{ height: 100%; } }</style>

注意菜單的樣式代碼,設(shè)置了絕對(duì)定位,并且設(shè)置top、bottom使菜單高度撐滿屏幕。

此時(shí)在看下界面效果。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

基本上算是實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的菜單布局。

不過(guò)在實(shí)際項(xiàng)目在設(shè)計(jì)的時(shí)候,菜單欄的內(nèi)容有可能來(lái)自后端給我們返回的數(shù)據(jù),其中包含菜單名稱、菜單圖標(biāo)以及菜單之間的層級(jí)關(guān)系。

總而言之,我們的菜單是動(dòng)態(tài)生成的,而不是像前面那種固定的寫(xiě)法。因此下面我將實(shí)現(xiàn)一個(gè)動(dòng)態(tài)生成的菜單,菜單的數(shù)據(jù)來(lái)源于我們的路由配置。

結(jié)合路由配置實(shí)現(xiàn)動(dòng)態(tài)菜單

路由配置

首先,我將項(xiàng)目的路由配置代碼貼出來(lái)。

import Vue from ’vue’;import Router from 'vue-router';// 菜單import MenuIndex from ’@/components/menu/menuIndex.vue’;// 首頁(yè)import Index from ’@/components/homePage/index.vue’;// 人員統(tǒng)計(jì)import EmployeeStatistics from ’@/components/employeeManage/employeeStatistics.vue’;import EmployeeManage from ’@/components/employeeManage/employeeManage.vue’// 考勤// 考勤統(tǒng)計(jì)import AttendStatistics from ’@/components/attendManage/attendStatistics’;// 考勤列表import AttendList from ’@/components/attendManage/attendList.vue’;// 異常管理import ExceptManage from ’@/components/attendManage/exceptManage.vue’;// 工時(shí)// 工時(shí)統(tǒng)計(jì)import TimeStatistics from ’@/components/timeManage/timeStatistics.vue’;// 工時(shí)列表import TimeList from ’@/components/timeManage/timeList.vue’;Vue.use(Router)let routes = [ // 首頁(yè)(儀表盤(pán)、快速入口) { path: ’/index’, name: ’index’, component: MenuIndex, redirect: ’/index’, meta: { title: ’首頁(yè)’, // 菜單標(biāo)題 icon: ’el-icon-s-home’, // 圖標(biāo) hasSubMenu: false, // 是否包含子菜單,false 沒(méi)有子菜單;true 有子菜單 }, children:[ { path: ’/index’, component: Index } ] }, // 員工管理 { path: ’/employee’, name: ’employee’, component: MenuIndex, redirect: ’/employee/employeeStatistics’, meta: { title: ’員工管理’, // 菜單標(biāo)題 icon: ’el-icon-user-solid’, // 圖標(biāo) hasSubMenu: true, // 是否包含子菜單 }, children: [ // 員工統(tǒng)計(jì) { path: ’employeeStatistics’, name: ’employeeStatistics’, meta: { title: ’員工統(tǒng)計(jì)’, // 菜單標(biāo)題, hasSubMenu: false // 是否包含子菜單 }, component: EmployeeStatistics, }, // 員工管理(增刪改查) { path: ’employeeManage’, name: ’employeeManage’, meta: { title: ’員工管理’, // 菜單標(biāo)題 hasSubMenu: false // 是否包含子菜單 }, component: EmployeeManage } ] }, // 考勤管理 { path: ’/attendManage’, name: ’attendManage’, component: MenuIndex, redirect: ’/attendManage/attendStatistics’, meta: { title: ’考勤管理’, // 菜單標(biāo)題 icon: ’el-icon-s-claim’, // 圖標(biāo) hasSubMenu: true, // 是否包含子節(jié)點(diǎn),false 沒(méi)有子菜單;true 有子菜單 }, children:[ // 考勤統(tǒng)計(jì) { path: ’attendStatistics’, name: ’attendStatistics’, meta: { title: ’考勤統(tǒng)計(jì)’, // 菜單標(biāo)題 hasSubMenu: false // 是否包含子菜單 }, component: AttendStatistics, }, // 考勤列表 { path: ’attendList’, name: ’attendList’, meta: { title: ’考勤列表’, // 菜單標(biāo)題 hasSubMenu: false // 是否包含子菜單 }, component: AttendList, }, // 異常管理 { path: ’exceptManage’, name: ’exceptManage’, meta: { title: ’異常管理’, // 菜單標(biāo)題 hasSubMenu: false // 是否包含子菜單 }, component: ExceptManage, } ] }, // 工時(shí)管理 { path: ’/timeManage’, name: ’timeManage’, component: MenuIndex, redirect: ’/timeManage/timeStatistics’, meta: { title: ’工時(shí)管理’, // 菜單標(biāo)題 icon: ’el-icon-message-solid’, // 圖標(biāo) hasSubMenu: true, // 是否包含子菜單,false 沒(méi)有子菜單;true 有子菜單 }, children: [ // 工時(shí)統(tǒng)計(jì) { path: ’timeStatistics’, name: ’timeStatistics’, meta: { title: ’工時(shí)統(tǒng)計(jì)’, // 菜單標(biāo)題 hasSubMenu: false // 是否包含子菜單 }, component: TimeStatistics }, // 工時(shí)列表 { path: ’timeList’, name: ’timeList’, component: TimeList, meta: { title: ’工時(shí)列表’, // 菜單標(biāo)題 hasSubMenu: true // 是否包含子菜單 }, children: [ { path: ’options1’, meta: { title: ’選項(xiàng)一’, // 菜單標(biāo)題 hasSubMenu: false // 是否包含子菜單 }, }, { path: ’options2’, meta: { title: ’選項(xiàng)二’, // 菜單標(biāo)題 hasSubMenu: false // 是否包含子菜單 }, }, ] } ] },];export default new Router({ routes})

在這段代碼的最開(kāi)始部分,我們引入了需要使用的組件,接著就對(duì)路由進(jìn)行了配置。

此處使用了直接引入組件的方式,項(xiàng)目開(kāi)發(fā)中不推薦這種寫(xiě)法,應(yīng)該使用懶加載的方式

路由配置除了最基礎(chǔ)的path、component以及children之外,還配置了一個(gè)meta數(shù)據(jù)項(xiàng)。

meta: { title: ’工時(shí)管理’, // 菜單標(biāo)題 icon: ’el-icon-message-solid’, // 圖標(biāo) hasSubMenu: true, // 是否包含子節(jié)點(diǎn),false 沒(méi)有子菜單;true 有子菜單}

meta數(shù)據(jù)包含的配置有菜單標(biāo)題(title)、圖標(biāo)的類名(icon)和是否包含子節(jié)點(diǎn)(hasSubMenu)。

根據(jù)title、icon這兩個(gè)配置項(xiàng),可以展示當(dāng)前菜單的標(biāo)題和圖標(biāo)。

hasSubMenu表示當(dāng)前的菜單項(xiàng)是否有子菜單,如果當(dāng)前菜單包含有子菜單(hasSubMenu為true),那當(dāng)前菜單對(duì)應(yīng)的標(biāo)簽元素就是el-submenu;否則當(dāng)前菜單對(duì)應(yīng)的菜單標(biāo)簽元素就是el-menu-item。

是否包含子菜單是一個(gè)非常關(guān)鍵的邏輯,我在實(shí)現(xiàn)的時(shí)候是直接將其配置到了meta.hasSubMenu這個(gè)參數(shù)里面。

根據(jù)路由實(shí)現(xiàn)多級(jí)菜單

路由配置完成后,我們就需要根據(jù)路由實(shí)現(xiàn)菜單了。

獲取路由配置

既然要根據(jù)路由配置實(shí)現(xiàn)多級(jí)菜單,那第一步就需要獲取我們的路由數(shù)據(jù)。這里我使用簡(jiǎn)單粗暴的方式去獲取路由配置數(shù)據(jù):this.$router.options.routes。

這種方式也不太適用日常的項(xiàng)目開(kāi)發(fā),因?yàn)闊o(wú)法在獲取的時(shí)候?qū)β酚勺鲞M(jìn)一步的處理,比如權(quán)限控制。

我們?cè)诮M件加載時(shí)打印一下這個(gè)數(shù)據(jù)。

// 代碼位置:src/menu/leftMenu.vue mounted(){ console.log(this.$router.options.routes);}

打印結(jié)果如下。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

可以看到這個(gè)數(shù)據(jù)就是我們?cè)趓outer.js中配置的路由數(shù)據(jù)。

為了方便使用,我將這個(gè)數(shù)據(jù)定義到計(jì)算屬性中。

// 代碼位置:src/menu/leftMenu.vuecomputed: { routesInfo: function(){ return this.$router.options.routes; }}

一級(jí)菜單

首先我們來(lái)實(shí)現(xiàn)一級(jí)菜單。

主要的邏輯就是循環(huán)路由數(shù)據(jù)routesInfo,在循環(huán)的時(shí)候判斷當(dāng)前路由route是否包含子菜單,如果包含則當(dāng)前菜單使用el-submenu實(shí)現(xiàn),否則當(dāng)前菜單使用el-menu-item實(shí)現(xiàn)。

<!-- src/menu/leftMenu.vue --><el-menu :default-active='$route.path' :collapse='false'> <!-- 一級(jí)菜單 --> <!-- 循環(huán)路由數(shù)據(jù) --> <!-- 判斷當(dāng)前路由route是否包含子菜單 --> <el-submenu v-for='route in routesInfo' v-if='route.meta.hasSubMenu' :index='route.path'> <template slot='title'> <i :class='route.meta.icon'></i> <span slot='title'>{{route.meta.title}}</span> </template> </el-submenu> <el-menu-item :index='route.path' v-else> <i :class='route.meta.icon'></i> <span slot='title'>{{route.meta.title}}</span> </el-menu-item></el-menu>

結(jié)果:

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

可以看到,我們第一級(jí)菜單已經(jīng)生成了,員工管理、考勤管理、工時(shí)管理這三個(gè)菜單是有子菜單的,所以會(huì)有一個(gè)下拉按鈕。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

不過(guò)目前點(diǎn)開(kāi)是沒(méi)有任何內(nèi)容的,接下來(lái)我們就來(lái)實(shí)現(xiàn)這三個(gè)菜單下的二級(jí)菜單。

二級(jí)菜單

二級(jí)菜單的實(shí)現(xiàn)和一級(jí)菜單的邏輯是相同的:循環(huán)子路由route.children,在循環(huán)的時(shí)候判斷子路由childRoute是否包含子菜單,如果包含則當(dāng)前菜單使用el-submenu實(shí)現(xiàn),否則當(dāng)前菜單使用el-menu-item實(shí)現(xiàn)。

那話不多說(shuō),直接上代碼。

<!-- src/menu/leftMenu.vue --><el-menu :default-active='$route.path' :collapse='false'> <!-- 一級(jí)菜單 --> <!-- 循環(huán)路由數(shù)據(jù) --> <!-- 判斷當(dāng)前路由route是否包含子菜單 --> <el-submenu v-for='route in routesInfo' v-if='route.meta.hasSubMenu' :index='route.path'> <template slot='title'> <i :class='route.meta.icon'></i> <span slot='title'>{{route.meta.title}}</span> </template> <!-- 二級(jí)菜單 --> <!-- 循環(huán)子路由`route.children` --> <!-- 循環(huán)的時(shí)候判斷子路由`childRoute`是否包含子菜單 --> <el-submenu v-for='childRoute in route.children' v-if='childRoute.meta.hasSubMenu' :index='childRoute.path'> <template slot='title'> <i :class='childRoute.meta.icon'></i> <span slot='title'>{{childRoute.meta.title}}</span> </template> </el-submenu> <el-menu-item :index='childRoute.path' v-else> <i :class='childRoute.meta.icon'></i> <span slot='title'>{{childRoute.meta.title}}</span> </el-menu-item> </el-submenu> <el-menu-item :index='route.path' v-else> <i :class='route.meta.icon'></i> <span slot='title'>{{route.meta.title}}</span> </el-menu-item></el-menu>

結(jié)果如下:

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

可以看到二級(jí)菜單成功實(shí)現(xiàn)。

三級(jí)菜單

三級(jí)菜單就不用多說(shuō)了,和一級(jí)、二級(jí)邏輯相同,這里還是直接上代碼。

<!-- src/menu/leftMenu.vue --><el-menu :default-active='$route.path' :collapse='false'> <!-- 一級(jí)菜單 --> <!-- 循環(huán)路由數(shù)據(jù) --> <!-- 判斷當(dāng)前路由route是否包含子菜單 --> <el-submenu v-for='route in routesInfo' v-if='route.meta.hasSubMenu' :index='route.path'> <template slot='title'> <i :class='route.meta.icon'></i> <span slot='title'>{{route.meta.title}}</span> </template> <!-- 二級(jí)菜單 --> <!-- 循環(huán)子路由`route.children` --> <!-- 循環(huán)的時(shí)候判斷子路由`childRoute`是否包含子菜單 --> <el-submenu v-for='childRoute in route.children' v-if='childRoute.meta.hasSubMenu' :index='childRoute.path'> <template slot='title'> <i :class='childRoute.meta.icon'></i> <span slot='title'>{{childRoute.meta.title}}</span> </template> <!-- 三級(jí)菜單 --> <!-- 循環(huán)子路由`childRoute.children` --> <!-- 循環(huán)的時(shí)候判斷子路由`child`是否包含子菜單 --> <el-submenu v-for='child in childRoute.children' v-if='child.meta.hasSubMenu' :index='child.path'> <template slot='title'> <i :class='child.meta.icon'></i> <span slot='title'>{{child.meta.title}}</span> </template> </el-submenu> <el-menu-item :index='child.path' v-else> <i :class='child.meta.icon'></i> <span slot='title'>{{child.meta.title}}</span> </el-menu-item> </el-submenu> <el-menu-item :index='childRoute.path' v-else> <i :class='childRoute.meta.icon'></i> <span slot='title'>{{childRoute.meta.title}}</span> </el-menu-item> </el-submenu> <el-menu-item :index='route.path' v-else> <i :class='route.meta.icon'></i> <span slot='title'>{{route.meta.title}}</span> </el-menu-item></el-menu>

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

可以看到工時(shí)列表下的三級(jí)菜單已經(jīng)顯示了。

總結(jié)

此時(shí)我們已經(jīng)結(jié)合路由配置實(shí)現(xiàn)了這個(gè)動(dòng)態(tài)的菜單。

不過(guò)這樣的代碼在邏輯上相關(guān)于三層嵌套的for循環(huán),對(duì)應(yīng)的是我們有三層的菜單。

假如我們有四層、五層甚至更多層的菜單時(shí),那我們還得在嵌套更多層for循環(huán)。很顯然這樣的方式暴露了前面多層for循環(huán)的缺陷,所以我們就需要對(duì)這樣的寫(xiě)法進(jìn)行一個(gè)改進(jìn)。

遞歸實(shí)現(xiàn)動(dòng)態(tài)菜單

前面我們一直在說(shuō)一級(jí)、二級(jí)、三級(jí)菜單的實(shí)現(xiàn)邏輯都是相同的:循環(huán)子路由,在循環(huán)的時(shí)候判斷子路由是否包含子菜單,如果包含則當(dāng)前菜單使用el-submenu實(shí)現(xiàn),否則當(dāng)前菜單使用el-menu-item實(shí)現(xiàn)。那這樣的邏輯最適合的就是使用遞歸去實(shí)現(xiàn)。

所以我們需要將這部分共同的邏輯抽離出來(lái)作為一個(gè)獨(dú)立的組件,然后遞歸的調(diào)用這個(gè)組件。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

邏輯拆分

<!-- src/menu/menuItem.vue --><template> <div> <el-submenu v-for='child in route' v-if='child.meta.hasSubMenu' :index='child.path'> <template slot='title'> <i :class='child.meta.icon'></i> <span slot='title'>{{child.meta.title}}</span> </template> </el-submenu> <el-menu-item :index='child.path' v-else> <i :class='child.meta.icon'></i> <span slot='title'>{{child.meta.title}}</span> </el-menu-item> </div></template><script>export default { name: ’MenuItem’, props: [’route’]}</script>

需要注意的是,這次抽離出來(lái)的組件循環(huán)的時(shí)候直接循環(huán)的是route數(shù)據(jù),那這個(gè)route數(shù)據(jù)是什么呢。

我們先看一下前面三層循環(huán)中循環(huán)的數(shù)據(jù)源分別是什么。

為了看得更清楚,我將前面代碼中一些不相關(guān)的內(nèi)容進(jìn)行了刪減。

<!-- src/menu/leftMenu.vue --><!-- 一級(jí)菜單 --><el-submenu v-for='route in routesInfo' v-if='route.meta.hasSubMenu'> <!-- 二級(jí)菜單 --> <el-submenu v-for='childRoute in route.children' v-if='childRoute.meta.hasSubMenu'> <!-- 三級(jí)菜單 --> <el-submenu v-for='child in childRoute.children' v-if='child.meta.hasSubMenu'> </el-submenu> </el-submenu></el-submenu>

從上面的代碼可以看到:

一級(jí)菜單循環(huán)的是`routeInfo`,即最初我們獲取的路由數(shù)據(jù)`this.$router.options.routes`,循環(huán)出來(lái)的每一項(xiàng)定義為`route`

二級(jí)菜單循環(huán)的是`route.children`,循環(huán)出來(lái)的每一項(xiàng)定義為`childRoute`

三級(jí)菜單循環(huán)的是`childRoute.children`,循環(huán)出來(lái)的每一項(xiàng)定義為`child`

按照這樣的邏輯,可以發(fā)現(xiàn)二級(jí)菜單、三級(jí)菜單循環(huán)的數(shù)據(jù)源都是相同的,即前一個(gè)循環(huán)結(jié)果項(xiàng)的children,而一級(jí)菜單的數(shù)據(jù)來(lái)源于this.$router.options.routes。

前面我們抽離出來(lái)的menuItem組件,循環(huán)的是route數(shù)據(jù),即不管是一層菜單還是二層、三層菜單,都是同一個(gè)數(shù)據(jù)源,因此我們需要統(tǒng)一數(shù)據(jù)源。那當(dāng)然也非常好實(shí)現(xiàn),我們?cè)谡{(diào)用組件的時(shí)候,為組件傳遞不同的值即可。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

代碼實(shí)現(xiàn)

前面公共組件已經(jīng)拆分出來(lái)了,后面的代碼就非常好實(shí)現(xiàn)了。

首先是抽離出來(lái)的meunItem組件,實(shí)現(xiàn)的是邏輯判斷以及遞歸調(diào)用自身。

<!-- src/menu/menuItem.vue --><template> <div> <el-submenu v-for='child in route' v-if='child.meta.hasSubMenu' :index='child.path'> <template slot='title'> <i :class='child.meta.icon'></i> <span slot='title'>{{child.meta.title}}</span> </template> <!--遞歸調(diào)用組件自身 --> <MenuItem :route='child.children'></MenuItem> </el-submenu> <el-menu-item :index='child.path' v-else> <i :class='child.meta.icon'></i> <span slot='title'>{{child.meta.title}}</span> </el-menu-item> </div></template><script>export default { name: ’MenuItem’, props: [’route’]}</script>

接著是leftMenu組件,調(diào)用menuIndex組件,傳遞原始的路由數(shù)據(jù)routesInfo。

<!-- src/menu/leftMenu.vue --><template> <div id='left-menu'> <el-menu :default-active='$route.path' :collapse='false'> <MenuItem :route='routesInfo'></MenuItem> </el-menu> </div></template><script>import MenuItem from ’./menuItem’export default { name: ’LeftMenu’, components: { MenuItem }}</script><style lang='scss'> // 使左邊的菜單外層的元素高度充滿屏幕 #left-container{ position: absolute; top: 100px; bottom: 0px; // 使菜單高度充滿屏幕 #left-menu, .el-menu-vertical-demo{ height: 100%; } }</style>

最終的結(jié)果這里就不展示了,和我們需要實(shí)現(xiàn)的結(jié)果是一致的。

功能完善

到此,我們結(jié)合路由配置實(shí)現(xiàn)了菜單欄這個(gè)功能基本上已經(jīng)完成了,不過(guò)這是一個(gè)缺乏靈魂的菜單欄,因?yàn)闆](méi)有設(shè)置菜單的跳轉(zhuǎn),我們點(diǎn)擊菜單欄還無(wú)法路由跳轉(zhuǎn)到對(duì)應(yīng)的組件,所以接下來(lái)就來(lái)實(shí)現(xiàn)這個(gè)功能。

菜單跳轉(zhuǎn)的實(shí)現(xiàn)方式有兩種,第一種是NavMenu組件提供的跳轉(zhuǎn)方式。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

第二種是在菜單上添加router-link實(shí)現(xiàn)跳轉(zhuǎn)。

那本次我選擇的是第一種方式實(shí)現(xiàn)跳轉(zhuǎn),這種實(shí)現(xiàn)方式需要兩個(gè)步驟才能完成,第一步是啟用el-menu上的router;第二步是設(shè)置導(dǎo)航的index屬性。

那下面就來(lái)實(shí)現(xiàn)這兩個(gè)步驟。

啟用el-menu上的router

<!-- src/menu/leftMenu.vue --><!-- 省略其余未修改代碼--><el-menu :default-active='$route.path' router :collapse='false'> <MenuItem :route='routesInfo'> </MenuItem></el-menu>

設(shè)置導(dǎo)航的index屬性

首先我將每一個(gè)菜單標(biāo)題對(duì)應(yīng)需要設(shè)置的index屬性值列出來(lái)。

index值對(duì)應(yīng)的是每個(gè)菜單在路由中配置的path值

首頁(yè) 員工管理 員工統(tǒng)計(jì) index='/employee/employeeStatistics' 員工管理 index='/employee/employeeManage'考勤管理 考勤統(tǒng)計(jì) index='/attendManage/attendStatistics' 考勤列表 index='/attendManage/attendList' 異常管理 index='/attendManage/exceptManage'員工統(tǒng)計(jì) 員工統(tǒng)計(jì) index='/timeManage/timeStatistics' 員工統(tǒng)計(jì) index='/timeManage/timeList' 選項(xiàng)一 index='/timeManage/timeList/options1' 選項(xiàng)二 index='/timeManage/timeList/options2'

接著在回顧前面遞歸調(diào)用的組件,導(dǎo)航菜單的index設(shè)置的是child.path,為了看清楚child.path的值,我將其添加菜單標(biāo)題的右側(cè),讓其顯示到界面上。

<!-- src/menu/menuItem.vue --><!-- 省略其余未修改代碼--><el-submenu v-for='child in route' v-if='child.meta.hasSubMenu' :index='child.path'> <template slot='title'> <i :class='child.meta.icon'></i> <span slot='title'>{{child.meta.title}} | {{child.path}}</span> </template> <!--遞歸調(diào)用組件自身 --> <MenuItem :route='child.children'></MenuItem></el-submenu><el-menu-item :index='child.path' v-else> <i :class='child.meta.icon'></i> <span slot='title'>{{child.meta.title}} | {{child.path}}</span></el-menu-item>

同時(shí)將菜單欄的寬度由200px設(shè)置為400px。

<!-- src/menu/menuIndex.vue --><!-- 省略其余未修改代碼--><el-aside width='400px'> <LeftMenu></LeftMenu> </el-aside>

然后我們看一下效果。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

可以發(fā)現(xiàn),child.path的值就是當(dāng)前菜單在路由中配置path值(router.js中配置的path值)。

那么問(wèn)題就來(lái)了,前面我們整理了每一個(gè)菜單標(biāo)題對(duì)應(yīng)需要設(shè)置的index屬性值,就目前來(lái)看,現(xiàn)在設(shè)置的index值是不符合要求的。不過(guò)仔細(xì)觀察現(xiàn)在菜單設(shè)置的index值和正常值是有一點(diǎn)接近的,只是缺少了上一級(jí)菜單的path值,如果能將上一級(jí)菜單的path值和當(dāng)前菜單的path值進(jìn)行一個(gè)拼接,就能得到正確的index值了。

那這個(gè)思路實(shí)現(xiàn)的方式依然是在遞歸時(shí)將當(dāng)前菜單的path作為參數(shù)傳遞給menuItem組件。

<!-- src/menu/menuIndex.vue --><!--遞歸調(diào)用組件自身 --><MenuItem :route='child.children' :basepath='child.path'></MenuItem>

將當(dāng)前菜單的path作為參數(shù)傳遞給menuItem組件之后,在下一級(jí)菜單實(shí)現(xiàn)時(shí),就能拿到上一級(jí)菜單的path值。然后組件中將basepath的值和當(dāng)前菜單的path值做一個(gè)拼接,作為當(dāng)前菜單的index值。

<!-- src/menu/menuIndex.vue --><el-menu-item :index='getPath(child.path)' v-else> </el-menu-item><script>import path from ’path’export default { name: ’MenuItem’, props: [’route’,’basepath’], data(){ return { } }, methods :{ // routepath 為當(dāng)前菜單的path值 // getpath: 拼接 當(dāng)前菜單的上一級(jí)菜單的path 和 當(dāng)前菜單的path getPath: function(routePath){ return path.resolve(this.basepath, routePath); } }}</script>

再看一下界面。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

我們可以看到二級(jí)菜單的index值已經(jīng)沒(méi)問(wèn)題了,但是仔細(xì)看,發(fā)現(xiàn)工時(shí)管理-工時(shí)列表下的兩個(gè)三級(jí)菜單index值還是有問(wèn)題,缺少了工時(shí)管理這個(gè)一級(jí)菜單的path。

那這個(gè)問(wèn)題是因?yàn)槲覀冊(cè)谡{(diào)用組件自身是傳遞的basepath有問(wèn)題。

<!--遞歸調(diào)用組件自身 --><MenuItem :route='child.children' :basepath='child.path'></MenuItem>

basepath傳遞的只是上一級(jí)菜單的path,在遞歸二級(jí)菜單時(shí),index的值是一級(jí)菜單的path值+二級(jí)菜單的path值;那當(dāng)我們遞歸三級(jí)菜單時(shí),index的值就是二級(jí)菜單的path值+三級(jí)菜單的path值,這也就是為什么工時(shí)管理-工時(shí)列表下的兩個(gè)三級(jí)菜單index值存在問(wèn)題。

所以這里的basepath值在遞歸的時(shí)候應(yīng)該是累積的,而不只是上一級(jí)菜單的path值。因此借助遞歸算法的優(yōu)勢(shì),basepath的值也需要通過(guò)getPath方法進(jìn)行處理。

<MenuItem :route='child.children' :basepath='getPath(child.path)'></MenuItem>

最終完整的代碼如下。

<!-- src/menu/menuIndex.vue --><template> <div> <el-submenu v-for='child in route' v-if='child.meta.hasSubMenu' :key='child.path' :index='getPath(child.path)'> <template slot='title'> <i :class='child.meta.icon'></i> <span slot='title'> {{child.meta.title}} </span> </template> <!--遞歸調(diào)用組件自身 --> <MenuItem :route='child.children' :basepath='getPath(child.path)'> </MenuItem> </el-submenu> <el-menu-item :index='getPath(child.path)' v-else> <i :class='child.meta.icon'></i> <span slot='title'> {{child.meta.title}} </span> </el-menu-item> </div></template><script>import path from ’path’export default { name: ’MenuItem’, props: [’route’,’basepath’], data(){ return { } }, methods :{ // routepath 為當(dāng)前菜單的path值 // getpath: 拼接 當(dāng)前菜單的上一級(jí)菜單的path 和 當(dāng)前菜單的path getPath: function(routePath){ return path.resolve(this.basepath, routePath); } }}</script>

刪除其余用來(lái)調(diào)試的代碼

最終效果

文章的最后呢,將本次實(shí)現(xiàn)的最終效果在此展示一下。

Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能

選項(xiàng)一和選項(xiàng)二這兩個(gè)三級(jí)菜單在路由配置中沒(méi)有設(shè)置component,這兩個(gè)菜單只是為了實(shí)現(xiàn)三級(jí)菜單,在最后的結(jié)果演示中,我已經(jīng)刪除了路由中配置的這兩個(gè)三級(jí)菜單

此處在leftMenu組件中為el-menu開(kāi)啟了unique-opened

在menuIndex組件中,將左側(cè)菜單欄的寬度改為200px

總結(jié)

到此這篇關(guān)于Vue結(jié)合路由配置遞歸實(shí)現(xiàn)菜單欄功能的文章就介紹到這了,更多相關(guān)vue 路由遞歸菜單欄內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 99中文视频| 黄色小视频在线观看 | 中文字幕av在线 | 一区二区国产精品 | 中文字幕一区二区在线观看 | 伊人久操 | 久久久久国产视频 | 黄色小视频在线观看 | 五月婷婷中文 | 91久久久久久久久久久久久久久久 | 中文字幕视频在线观看 | 国产婷婷综合 | 欧美二区精品 | 欧美性www | 亚洲福利一区 | 久久成人国产精品 | 久久久久久久国产精品 | 日韩中文字幕在线视频 | 久草电影网| 欧美人妖在线 | 日韩视频在线观看 | 欧美日韩一区二区在线 | 午夜精| 精品无码久久久久国产 | 亚洲一区二区三区在线播放 | 久久黄色 | 日本中文字幕在线观看 | 永久免费网站 | 91精品国产色综合久久不卡98口 | 午夜精品一区 | 91中文在线 | 中文字幕在线电影观看 | 人人人艹| 欧洲亚洲视频 | 日本黄色毛片 | 亚洲免费视频网站 | 玖玖免费 | a级毛片黄 | 99在线精品视频 | 一区二区三区亚洲 | 国产成人久久 | 国产精品久久久久aaaa九色 | 欧美日韩不卡在线 | а√天堂资源中文最新版地址 | 色av色av色av | 亚洲精品一区二区三区在线看 | 久久精品国产一区二区三 | 狠狠的干 | 91影库| 欧美性猛片aaaaaaa做受 | 中文字幕欧美日韩一区 | 成人福利在线 | 日韩中文字幕在线视频 | 国产高清在线精品一区二区三区 | 一区二区三区国产 | 欧美人妖在线 | 国产成人精品999在线观看 | 免费 视频 1级 | 久久综合久久受 | 欧洲精品久久久 | 日韩国产一区 | 久久一级 | 免费在线亚洲 | 日本黄色毛片 | 日本精品一区二区三区在线观看视频 | 亚洲精品国产综合区久久久久久久 | 亚洲国产精品一区 | 久久精品亚洲精品国产欧美 | 一区二区日韩在线观看 | 大胆裸体gogo毛片免费看 | 欧美成人精品一区二区三区 | 一级免费片 | 亚洲一区二区三区四区五区中文 | 日韩精品一区二区三区中文在线 | 在线看一区 | 欧美1级| 亚洲一区二区三区四区在线 | 久久毛片| 久久a国产| 久久久久久亚洲精品 | 国产综合视频在线观看 | 99精品一区二区 | 国产精品污www一区二区三区 | 精品国产鲁一鲁一区二区在线观看 | 日本高清视频在线播放 | 欧美午夜一区二区三区免费大片 | 欧美日韩中文在线 | 黄色av观看| 精品久久久久久久久久久久久久 | 神马久久久久久久 | 国产精品成人一区二区三区 | 成人久久久 | 久久精品国产久精国产 | 日韩av入口 | 久热精品视频 | 在线免费黄色小视频 | 成人免费视频视频在线观看 免费 | 免费看黄色大片 | 91精品国产综合久久精品 | 另类 综合 日韩 欧美 亚洲 | 美女毛片 | 三级免费毛片 | 日韩一二三区 | 欧美视频在线免费看 | 欧美性猛交一区二区三区精品 | 欧美日韩在线一区 | 久久人人爽人人爽人人片av高清 | 国产欧美一区二区三区国产幕精品 | 女人毛片a毛片久久人人 | 亚洲视频在线播放 | 亚洲成人一区二区 | 日韩大尺度电影在线观看 | 欧美99| hitomi一区二区三区精品 | 久久高清| 欧美黄色一级毛片 | 欧美日韩精品一区二区三区 | 久久国产一区视频 | 久久久资源| 爱草在线 | 亚洲精品在线看 | 毛片免费观看网址 | 亚洲国产精品一区二区三区 | 草草精品视频 | 亚洲最新中文字幕 | 亚洲精品视频免费 | 国产精品毛片一区二区三区 | 国模一区二区三区 | 91欧美在线 | 天堂在线www| 亚洲一区二区视频在线播放 | 在线视频亚洲 | 综合二区 | 毛片一级片 | 91.com在线| 亚洲免费视频观看 | 一道本一区二区三区 | 成人一级视频 | 国外成人在线视频网站 | 久久精品一区二区三区四区 | 国产一区二区三区四区三区 | 亚洲欧洲精品一区二区三区 | 久久69精品久久久久久久电影好 | 久草视频在线资源站 | 欧美精品成人一区二区三区四区 | 99精品久久 | 春色导航 | 在线成人av| 成人av一区二区三区 | 婷婷在线免费视频 | 国产大片在线观看 | 在线观看www | 欧美黑人一区 | 在线精品亚洲欧美日韩国产 | 国产无套丰满白嫩对白 | 蜜桃精品久久久久久久免费影院 | 欧美a区 | 国产日本欧美在线 | 黄色国产大片 | 成人h在线 | 中文字幕 亚洲一区 | 国产精品一区二区视频 | 精品欧美一区二区在线观看视频 | 日韩有码一区 | 蜜桃精品久久久久久久免费影院 | 在线天堂视频 | 91精品国产欧美一区二区 | 国产精品一区二区三区四区五区 | 亚洲精品久久久久久一区二区 | 国产区在线 | a亚洲精品| 青青久在线视频 | 久久久精品免费视频 | 欧产日产国产精品一二 | 九九综合九九 | 国产黄色网址在线观看 | 九九99九九精彩46 | 天天操夜夜爽 | 久久免费视频9 | 国产高潮在线观看 | 国产午夜精品久久久久免费视高清 | 亚洲视频在线播放 | 一区二区三区四区日韩 | 免费av在线网站 | www国产亚洲精品久久网站 | 欧美黄色片 | 国产精品永久免费视频 | 精品香蕉视频 | 久久精品一区二区三区四区毛片 | 日韩欧美一二三区 | 人人看超碰| 国产九九九 | 久久毛片 | 最近免费中文字幕大全免费版视频 | 在线一级视频 | 免费观看国产精品 | 免费国产网站 | 欧美视频一区 | 一区二区三区免费网站 | 国产欧美综合一区二区三区 | 天天干天天操天天舔 | 超碰8| 99久久久久久 | 日本天天操 | av手机在线播放 | 国产浪潮av色综合久久超碰 | 久久久久久免费毛片精品 | 亚洲免费视频在线观看 | 国产精品成人3p一区二区三区 | 午夜免费看片 | 成人a在线视频免费观看 | 中文字幕在线欧美 | 久久亚洲视频 | 男人的天堂在线视频 | 久久久久九九九九 | 超碰激情 | 国产午夜精品美女视频明星a级 | 国产一区二区三区高清 | 国产 欧美 日韩 一区 | 在线区| 欧美午夜影院 | 一级毛片色一级 | 日韩欧美在线观看一区二区 | 国产精品一区二区三区四区 | 久久欧美精品 | 午夜夜| 国产精品亚洲一区二区三区 | 国产免费国产 | 成人av免费观看 | 综合网激情五月 | 亚洲一区二区免费视频 | www.久久精品视频 | 国产精品一区二区三区免费视频 | 综合久久久 | 日韩不卡中文字幕 | 欧美一区永久视频免费观看 | 久久99精品久久久久久琪琪 | www.五月婷婷| 国产黄色大片免费观看 | 久久se精品一区精品二区 | 日韩在线看片 | 国产91富婆养生按摩会所 | 久久综合99re88久久爱 | 成人免费视频网站 | 国产精品久久综合 | 中文字幕在线观看不卡视频 | 国产精品久久久久久久一区探花 | 色婷婷综合网 | 亚洲综合在线视频 | 夜夜操天天干, | 手机看片国产精品 | 国产91网址 | 国产精品永久久久久久久久久 | 91在线免费看 | 日韩一区二区三区在线观看 | 99久久精品免费看国产免费粉嫩 | 久久精品小视频 | 超碰人操| jizz国产免费 | 免费观看一级视频 | 伊人色播 | 亚洲视频在线播放 | 国产精品96久久久久久久 | 精品国产一区二区在线 | 国产精品成人久久久久 | 有码在线| 亚洲人成人一区二区在线观看 | 久久九 | 精品在线一区二区 | 91精品一区二区三区久久久久久 | 日本成人中文字幕 | 国产日韩一区二区三区 | 精品xxxx户外露出视频 | 91视频综合| 五月激情站 | 依人成人网 | 日韩一区二区免费视频 | 精品日韩欧美一区二区三区 | 日韩免费在线观看视频 | 在线观看欧美日韩视频 | 国产欧美日韩在线 | 午夜激情免费在线观看 | 99久久久久国产精品免费 | 动漫羞免费网站中文字幕 | 国产精品久久久久久久久污网站 | 亚洲免费人成在线视频观看 | 日本精品一区二区在线观看 | 国产高清在线 | 国产成人精品免高潮在线观看 | 欧美久久精品 | 精品视频久久 | 国产精品久久综合 | 久久久精品网 | 欧美日韩中文字幕在线 | www.国产视频| 国产成人精品午夜视频' | 精品一区二区三区三区 | 亚洲午夜av | 成人福利视频 | 亚洲精品乱码8久久久久久日本 | 日韩欧美精品一区 | 精品欧美一区二区三区久久久小说 | 91亚洲高清 | 一区二区免费在线 | 久久精品亚洲 | 黄色一级片免费 | 亚洲精品一区二区三区四区高清 | 亚洲国产精品一区二区三区 | 日韩在线免费观看视频 | 国产小视频在线观看 | 米奇影视7777 | 91高清在线| 91在线视频一区 | 成人在线视频观看 | 国产嫩草91 | 日日爱影视| 91在线免费看 | 亚洲高清在线观看 | 日韩视频中文字幕 | 在线观看av国产一区二区 | 国产午夜精品久久久久久久 | 国产免费天天看高清影视在线 | 日韩在线一区二区三区 | 亚洲一区二区三区四区在线 | 国产精品一区久久久 | 国产精品一区二 | 亚洲国产成人精品女人久久久 | 精品久久久久av | 亚洲欧美激情精品一区二区 | 国产激情在线观看 | 日本成人午夜影院 | 亚洲第一视频 | 成人精品一区 | 综合网激情五月 | 一区二区三区四区精品 | 欧美一区二区大片 | 国产精品久久久 | 国产毛片视频 | 亚洲网在线 | 理论片一区 | 日中文字幕在线 | 日韩欧美在线观看一区二区三区 | 国产精品日产欧美久久久久 | 国产一级毛片在线视频 | 日韩成人一区二区 | 久草高清在线 | 亚洲国产婷婷香蕉久久久久久99 | 成人免费毛片aaaaaa片 | 亚洲国产精品久久久久秋霞蜜臀 | 中文字幕免费在线 | 日韩在线免费 | 欧美午夜视频在线观看 | 久久的爱 | 91免费在线视频 | 日本aⅴ毛片成人实战推荐 成人免毛片 | 久久精品a一级国产免视看成人 | 久久白虎 | 国产91色在线 | 亚洲 | 日本三级全黄 | 色天天综合网 | 91精品久久久久久久久久入口 | 国产午夜视频 | 国产精品99久久久久久动医院 | 9se成人免费网站 | 亚洲一区二区三区在线视频 | 日韩一区二区三区精品 | 欧美一区二区三区精品 | 91精品国产综合久久婷婷香蕉 | 欧美国产日韩一区 | 亚洲 欧美 日韩 丝袜 另类 | 国产不卡视频在线观看 | 午夜精品影院 | 国产91在线观看 | 久久国产精品一区 | 99精品久久久久久久免费看蜜月 | 欧美午夜精品久久久久久浪潮 | 九九精品视频在线观看 | 久久久久久久久久穴 | 97高清国语自产拍 | 色视频www在线播放国产人成 | 精品亚洲区 | 3bmm在线观看视频免费 | 毛片综合 | 欧美日韩亚洲另类 | 亚洲综合国产 | 日日爽| 久久久久久影院 | 日韩av一区二区在线观看 | 亚洲高清视频在线 | 99福利视频 | 午夜天堂精品久久久久 | 99精品国产高清一区二区麻豆 | 日韩视频在线观看 | 国产综合视频在线观看 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 色网在线观看 | www中文字幕 | 这里有精品视频 | 99久久国产 | 欧美日韩一区二区中文字幕 | 亚洲精品久久久久久一区二区 | 青青久草| 欧美中文字幕在线观看 | 欧美日韩国产一区二区三区不卡 | 色av综合网| 久久2018 | 91网站在线看 | 日韩另类| 成人午夜视频在线观看 | 国产高清不卡在线 | 精品视频久久久 | 在线观看精品自拍私拍 | 精品久久一区 | 日韩一区二区精品 | 亚洲一区二区三区在线播放 | 欧美一区二区三区爽大粗免费 | 国产日韩欧美91 | 色婷婷久久久swag精品 | 国产成人精品一区二区三区网站观看 | 国产欧美在线 | 欧美成人性生活视频 | 中文字幕亚洲欧美日韩在线不卡 | 91麻豆精品国产91久久久更新资源速度超快 | 成人高清av | 中文字幕在线精品 | 成人黄色免费 | 四虎影院观看 | 国产成人免费网站 | 亚洲综合二 | 一级免费黄色免费片 | 成人一级片视频 | 国产亚洲精品久久久优势 | 最新超碰 | 久久精品亚洲精品 | h免费观看 | 欧美成人精品一区二区男人看 | 国产精品一区二区在线观看 | 国产精品久久久一区二区 | av在线天堂| 精品国产不卡一区二区三区 | 久久一日本道色综合久久 | 欧美日韩精品一区二区三区 | 精品国产一区二区三区成人影院 | 色综合99| 69久久久| 天堂一区 | 欧美一级视频免费 | 亚洲a人 | 久艹精品 | 国产噜噜噜噜噜久久久久久久久 | 一区日韩| 国产精品久久久久久久午夜 | 九色91视频 | 97人人草| 四虎精品在线 | 国内外成人在线视频 | 亚洲欧洲精品一区二区 | 国产精品美女在线观看 | 国产精品视频一 | 综合久久综合久久 | 谁有毛片| 欧美日韩一区精品 | 操片| 日本免费在线 | 欧洲亚洲精品久久久久 | aaa黄色片| 欲色av| 三级成人在线 | 日韩精品在线网站 | 国产在线观看一区二区三区 | 精品亚洲一区二区三区 | 日韩精品一区二区三区视频播放 | 国产美女自拍视频 | 久久y| 国产精品久久久久久久久久久新郎 | 久久国产一区 | 亚洲精品一区二区三区在线播放 | av中文字幕第一页 | www.伊人| 久久国产精品无码网站 | 久久久久久久久久久亚洲 | 色综合久久久久综合99 | 一区二区在线免费观看 | 国产精品久久久久久久久久久久久久 | 亚洲香蕉在线观看 | 国产美女www爽爽爽免费视频 | 久久91精品| 日本a视频| 亚洲成人av一区二区 | 国产精品理论电影 | 欧美亚洲激情 | 日韩精品一区二区三区在线观看 | 国产精品久久九九 | 国产区最新 | 高清av在线 | 欧美2区| 久久综合九色综合欧美狠狠 | 欧美一区在线视频 | 亚洲啊v | 午夜激情影院 | 在线观看成人高清 | 成人在线手机版视频 | a级性视频 | 亚洲精品9999 | 欧美精品在线免费观看 | 国产精品久久777777 | 黄篇网址| 中国大陆高清aⅴ毛片 | 国产欧美精品一区二区色综合 | 亚洲成人久久久 | 成人a毛片 | 亚洲激情综合 | 国产一区二区三区四区在线观看 | 午夜精品久久久久久 | 欧美激情精品久久久久 | 成人欧美一区二区三区 | 午夜精品久久久久久久久 | 国产成人久久 | 国产日韩精品一区二区 | 91高清视频在线观看 | 天天干天天曰天天操 | 午夜www| 精品一区av| 久久se精品一区精品二区 | 一二三四在线视频观看社区 | 国产区日韩区欧美区 | 亚洲精品乱码久久久久久国产主播 | 91久久久久久久久久久久久久久久 | 国产97免费视频 | 日本在线视频中文字幕 | 日韩精品小视频 | 欧美在线视频网站 | 午夜影院免费体验区 | 国产精品毛片一区二区三区 | 成人免费毛片嘿嘿连载视频 | 国产精品一区电影 | 欧美自拍一区 | 看真人视频a级毛片 | 亚洲精品一区中文字幕乱码 | 亚洲蜜臀av乱码久久精品蜜桃 | aa级毛片毛片免费观看久 | 玖草av| 久久综合亚洲 | 国产乱码精品一区二区三区五月婷 | 一区精品视频 | 成人网页 | 欧洲毛片 | 国外成人在线视频 | 久久精品综合 | 中文字幕国产 | 国产xxx在线观看 | 99国内精品久久久久久久 | 一区二区三区国产 | 亚洲国产精品99久久久久久久久 | 日韩在线观看网站 | 日韩在线中文字幕 | 亚洲另类视频 | 日本成人中文字幕 | 日韩综合一区 | 亚洲综合精品视频 | 欧美亚洲免费 | 91久久夜色精品国产九色 | 综合精品| 国产精品国产三级国产aⅴ无密码 | 欧美国产精品一区二区 | 亚洲高清视频在线观看 | 99视频这里有精品 | 五月天在线婷婷 | 亚洲午夜精品一区二区三区他趣 | 亚洲精彩视频在线 | 日韩精品一区二区三区视频播放 | 一区二区三区在线免费看 | 亚洲精品一区二区三区四区高清 | 午夜男人天堂 | 国产日韩欧美一区 | 一级a毛片 | 久久视频一区 | 婷婷伊人 | 91色乱码一区二区三区 | 亚洲免费观看视频 | 欧美国产日韩一区 | 毛片链接 | 亚洲狠狠爱一区二区三区 | 国产一级特黄aaa大片 | 久久精品国产久精国产 | 久久精品99国产精品亚洲最刺激 | 欧洲一区二区在线观看 | 欧美日韩h | 人人草人人 | 国产精品毛片久久久久久久 | 亚洲国产视频一区 | 91色视频在线观看 | 在线欧美日韩 | 羞羞视频在线观看入口 | 久久国产精品精品国产 | 日韩视频一区二区三区 | 国产欧美精品区一区二区三区 | 天天干,夜夜操 | 欧洲另类在线1 | 天堂资源网 | 91精品国产高清久久久久久久久 | 国产精品视频在线观看 | 日韩性在线| 日韩视频一区 | 国产一区二区三区在线 | 成人精品一区二区 | 欧美一二区 | 91视频.com| 久久成人精品视频 | 日韩视频在线视频 | 国产老女人精品毛片久久 | 黄色a视频| 欧美日韩一区在线 | 日韩欧美精品一区 | 91黄在线观看 |