vue3+ts實(shí)現(xiàn)樹形組件(菜單組件)
前言
之前在使用element-plus的使用,使用el-menu組件,并且使用了遞歸思想完成了無限極菜單的展開,現(xiàn)在想要自己手寫一個(gè)簡單的樹形組件,同樣使用遞歸的思想
全局注冊(cè)組件
文件結(jié)構(gòu):
---mTree ---index.ts ---mTree.vue
在index.ts文件中引入組件然后注冊(cè),并最后在main.ts文件中引入并且使用app.use
import mTree from "./mTree.vue" mTree.install = app => { app.component(mTree.name,mTree) } export default mTree
組件的實(shí)現(xiàn)
首先我們先要?jiǎng)?chuàng)建一個(gè)樹狀的數(shù)據(jù),分清楚層級(jí)關(guān)系
const state = reactive({ treeOptions: [ { label: '一級(jí)', children: [ ... { label: '一級(jí)-3', children: [ .... ], }, ], }, ... })
就像這樣的層級(jí)關(guān)系,當(dāng)然這里面我們只是模擬數(shù)據(jù),真實(shí)的項(xiàng)目開發(fā)過程中應(yīng)該是后端給前端數(shù)據(jù),然后前端在根據(jù)數(shù)據(jù)進(jìn)行渲染
樹形組件的基本結(jié)構(gòu):
<template> <li v-for="item in options" :key="item.label"> {{ item.label }} <ul v-if="item.children&&item.children.length>0"> <mTree :options="item.children"></mTree> </ul> </li> ? </template>
如圖:
解釋一下這個(gè)組件的這個(gè)結(jié)構(gòu):
首先使用li組件渲染第一層結(jié)構(gòu),然后在ul里面重新嵌套mTree樹形組件,并且判斷當(dāng)前item元素是否有children屬性,如果有這個(gè)屬性,那么就進(jìn)行渲染,否則的話就不渲染。這樣就不停的遞歸,到最后一個(gè)children都渲染結(jié)束之后結(jié)束了。這樣在不確定有多少層級(jí)時(shí)就可以使用,可以實(shí)現(xiàn)無限的層級(jí)嵌套。
完善組件(添加點(diǎn)擊事件,過渡效果)????
<li v-for... @click.stop="toggleisOpen(item)"> {{ item.label }} <transition name="slide-fade"> <ul v-show="item.isOpen">...</ul> </transition> </li>
這里只展示了新增的代碼,給li添加了一個(gè)點(diǎn)擊事件:
interface optionsProp { label: string isOpen?: boolean children?: optionsProp[] } const props = defineProps({ options: { type: Array as PropType<optionsProp[]>, default() { return [] }, }, }) const toggleisOpen = (item: any) => { item.isOpen = !item.isOpen }
注意ul通過v-show來控制顯示或者隱藏,當(dāng)?shù)谝淮吸c(diǎn)擊的時(shí)候由于源數(shù)據(jù)中沒有isOpen,所以這個(gè)時(shí)候取反就是true,就會(huì)顯示點(diǎn)擊元素的子級(jí)。還有一點(diǎn)要注意的時(shí),由于冒泡會(huì)導(dǎo)致出現(xiàn)一些問題,所以在點(diǎn)擊事件后面加上.stop來阻止冒泡。
添加過渡
這里我們使用了Vue3官方中的過渡,不是很了解的小伙伴可以去官網(wǎng)查看,簡單來說就是使用transition包裹要使用過渡效果的部分,然后定義name屬性,本文中的name為slide-fade所以下面的樣式就是這樣的:
v-enter-from
:進(jìn)入動(dòng)畫的起始狀態(tài)。v-enter-active
:進(jìn)入動(dòng)畫的生效狀態(tài)。v-leave-active
:離開動(dòng)畫的生效狀態(tài)v-leave-to
:離開動(dòng)畫的結(jié)束狀態(tài)。
.slide-fade-enter-active { transition: all 0.3s ease-out; } ? .slide-fade-leave-active { transition: all 0.2s cubic-bezier(1, 0.5, 0.8, 1); } ? .slide-fade-enter-from, .slide-fade-leave-to { transform: translateY(20px); opacity: 0; }
總結(jié):
通過對(duì)這個(gè)組件的實(shí)現(xiàn),我們有掌握了對(duì)遞歸組件的使用以及簡單的實(shí)現(xiàn),學(xué)習(xí)的時(shí)候可以對(duì)自己好奇的東西嘗試自己去實(shí)現(xiàn),這樣做我們可以學(xué)習(xí)的更快,并且使自己有一些小小的成就感。
到此這篇關(guān)于vue3+ts實(shí)現(xiàn)樹形組件(菜單組件)的文章就介紹到這了,更多相關(guān)vue3 ts樹形組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue初始化項(xiàng)目時(shí)報(bào)錯(cuò):Error:Cannot find module vue-temp
這篇文章主要介紹了vue初始化項(xiàng)目時(shí)報(bào)錯(cuò):Error:Cannot find module vue-template-compiler問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03vue3+element?Plus使用el-tabs標(biāo)簽頁解決頁面刷新不回到默認(rèn)頁的問題
這篇文章主要介紹了vue3+element?Plus使用el-tabs標(biāo)簽頁頁面刷新不回到默認(rèn)頁的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07vue.js中v-on:textInput無法執(zhí)行事件問題的解決過程
大家都知道vue.js通過v-on完成事件處理與綁定,但最近使用v-on的時(shí)候遇到了一個(gè)問題,所以下面這篇文章主要給大家介紹了關(guān)于vue.js中v-on:textInput無法執(zhí)行事件問題的解決過程,需要的朋友可以參考下。2017-07-07Vue.js手風(fēng)琴菜單組件開發(fā)實(shí)例
這篇文章主要為大家詳細(xì)介紹了Vue.js手風(fēng)琴菜單組件開發(fā)實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Vue2?Element?description組件列合并詳解
在使用Vue的時(shí)候經(jīng)常會(huì)涉及到表格的列合并,下面這篇文章主要給大家介紹了給大家Vue2?Element?description組件列合并的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01antd-DatePicker組件獲取時(shí)間值,及相關(guān)設(shè)置方式
這篇文章主要介紹了antd-DatePicker組件獲取時(shí)間值,及相關(guān)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10vue項(xiàng)目打包優(yōu)化方式(讓打包的js文件變小)
這篇文章主要介紹了vue項(xiàng)目打包優(yōu)化方式(讓打包的js文件變小),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04