日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何實現(xiàn)vue的tree組件

瀏覽:47日期:2022-10-21 16:19:03

前言

Tree一直是大家熟知的組件,做一些大型的后臺管理系統(tǒng)都會用到。使用樹組件可以完整的展現(xiàn)其中的層級關系,并具有展開收起選擇等交互功能。

效果

如何實現(xiàn)vue的tree組件

節(jié)點可以無限的遞歸延伸可以展開和收起子節(jié)點如果子節(jié)點全部選擇對應的父節(jié)點也應該選中,反之父節(jié)點取消選中對應子節(jié)點也需要取消選中

API

prop傳遞data屬性,來描述所有的節(jié)點的信息

如何實現(xiàn)vue的tree組件

每個節(jié)點的配置描述如下

title: 展示的標題 expand 是否展開節(jié)點 checked 是否選中節(jié)點 children 子節(jié)點

以及還有兩個event

on-toggle-expand 展開和收起子列表時觸發(fā)的 on-check-change 點擊checkbox觸發(fā)

我們來 init tree主組件

首先需要考慮一個問題因為tree是遞歸遍歷的,因為我們需要創(chuàng)建一個入口組件還有一個遞歸children的組件。

首先創(chuàng)建我們的tree組件

如何實現(xiàn)vue的tree組件

如何實現(xiàn)vue的tree組件

我們在初始化以及watch監(jiān)聽的時候重新深拷貝了一下prop傳來的data并賦值給了cloneData

然后在template里來引入node.vue,然后循環(huán)cloneData來循環(huán)node.vue。node.vue接受兩個prop

showCheckbox 就是tree組件接收的 showCheckbox 這里傳給node組件來判斷展示data 為item 是一個object 負責渲染當前節(jié)點,如果當前節(jié)點有children 那就遞歸調(diào)用本身來遞歸渲染這是使用了一個deepCopy的方法,這個是深拷貝的簡單實現(xiàn),遞歸的去重新重新賦值data數(shù)組,開辟新的堆內(nèi)存與傳入的數(shù)據(jù)無關聯(lián)。不會破壞原有的數(shù)據(jù)

我們來 init node遞歸組件

node組件為主要組件,主要功能是展示當前項的title 以及 如果有children時遞歸本身。

展開關閉按鈕 checkbox 節(jié)點的title 遞歸

node的基本構造

如何實現(xiàn)vue的tree組件

prop中的data就是當前節(jié)點的所有信息,比如說是否展開和關閉當前的節(jié)點,是否選中,title標題以及children的子節(jié)點數(shù)組。

expand 判斷條件為 data.children && data.children.length 才會展示 + 或者 - 按鈕 checkbox就是當前的節(jié)點是否需要默認勾選

點擊 + 號時會展開當前的子節(jié)點,點擊 - 號會關閉,這一步只需要在handleExpand 中修改data的expand數(shù)據(jù)即可同時我們還需要觸發(fā)一個emit來提示用戶展示或者收起了節(jié)點

如何實現(xiàn)vue的tree組件

如何實現(xiàn)vue的tree組件

這里有一點需要注意 修改data.expand我們通過 VUE的 $set 并沒有像下面這樣

this.data.expand = !this.data.expand;

這里有什么區(qū)別呢?如果直接用上面的代碼進行修改,就會發(fā)現(xiàn)數(shù)據(jù)雖然被修改了,但是視圖沒有被更新,這是因為這里的this.data 時props通過上一級傳遞出來的,也有可能時node遞歸傳遞的,無論如何咱們需要的cloneData里的節(jié)點數(shù)據(jù),此時不一定初始化定義時就含有expand或者checked字段 如果不含有直接通過this.data.expand修改,這個expand時不可響應式的數(shù)據(jù),所以視圖不會被更新,干脆就直接用$set來改變

接下來我們就需要處理響應狀態(tài)了,大家可能覺得不就是選中和取消嗎 的確這樣可以,但是樹組件時有上下級關系,他們分為兩種邏輯,當選中(或取消選中)一個節(jié)點時

它下面的所有子節(jié)點都會被選中 如果同一級所有子節(jié)點選中時,它的父級也自動選中,一直遞歸判斷到根節(jié)點。

第 1 個邏輯相對簡單,當選中一個節(jié)點時,只要遞歸地遍歷它下面所屬的所有子節(jié)點數(shù)據(jù),修改所有的 checked 字段即可

如何實現(xiàn)vue的tree組件

再來看第2個邏輯 一個節(jié)點,除了手動選中(或反選),還有就是第 2 種邏輯的被動選中(或反選),也就是說,如果這個節(jié)點的所有直屬子節(jié)點(就是它的第一級子節(jié)點)都選中(或反選)時,這個節(jié)點就自動被選中(或反選),遞歸地,可以一級一級響應上去。有了這個思路,我們就可以通過 watch 來監(jiān)聽當前節(jié)點的子節(jié)點是否都選中,進而修改當前的 checked 字段:

如何實現(xiàn)vue的tree組件

在 watch 中,監(jiān)聽了 data.children 的改變,并且是深度監(jiān)聽的。這段代碼的意思是,當 data.children 中的數(shù)據(jù)的某個字段發(fā)生變化時(這里當然是指 checked 字段),也就是說它的某個子節(jié)點被選中(或反選)了,這時執(zhí)行綁定的句柄 handler 中的邏輯。const checkedAll = !data.some(item => !item.checked); 也是一個巧妙的縮寫,checkedAll 最終返回結果就是當前子節(jié)點是否都被選中了。

這里非常巧妙地利用了遞歸的特性,因為 node.vue 是一個遞歸組件,那每一個組件里都會有 watch 監(jiān)聽 data.children,要知道,當前的節(jié)點有兩個”身份“,它既是下屬節(jié)點的父節(jié)點,同時也是上級節(jié)點的子節(jié)點,它作為下屬節(jié)點的父節(jié)點被修改的同時,也會觸發(fā)上級節(jié)點中的 watch 監(jiān)聽函數(shù)。這就是遞歸。

結語

遞歸的可以把一個大問題通過不斷調(diào)用自身的方式,使代碼簡潔的實現(xiàn)功能,但是個別問題像算法中斐波那契數(shù)列如果使用遞歸就會使得時間復雜度以及空間復雜度會飆升??偟膩碚f要合理運用,活學活用。

以上就是如何實現(xiàn)vue的tree組件的詳細內(nèi)容,更多關于vue tree組件的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
快she精品国产999| 99热精品在线| 在线免费观看亚洲| 国产91一区| 日韩精品电影| 精品三级在线观看视频| 久久不见久久见免费视频7| 欧美伊人影院| 先锋影音久久久| 蜜桃久久久久久久| 日韩三级一区| 国产精东传媒成人av电影| 国产精品xxx在线观看| 国产精品一区二区免费福利视频| 国产亚洲一区二区三区啪| 午夜国产一区二区| 免费在线观看日韩欧美| 亚州av日韩av| 久久一区精品| 欧美亚洲精品在线| 免费在线成人网| 久久不见久久见免费视频7| 日韩av二区| 日韩在线综合| 三级在线观看一区二区 | 欧美日韩中文一区二区| 在线午夜精品| 国产精品中文字幕制服诱惑| 另类专区亚洲| 日韩一区欧美二区| 精品久久国产一区| 久久要要av| 91福利精品在线观看| 亚洲va中文在线播放免费| 美女91精品| 国产精品99一区二区三| 亚洲香蕉网站| 国产精品红桃| 日韩精品一级二级| 亚洲www啪成人一区二区| 一二三区精品| 欧美日韩精品免费观看视频完整| 欧美日韩一区自拍| 99国产精品99久久久久久粉嫩| 久久不见久久见中文字幕免费 | 日本亚洲最大的色成网站www | 在线看片日韩| 性欧美videohd高精| 国产精品一区二区精品视频观看 | 国产成人77亚洲精品www| 中文字幕一区日韩精品| 欧美一区二区三区高清视频| 毛片不卡一区二区| 7777精品| 亚洲精品一二| 免费欧美在线视频| 免费在线小视频| 精品欧美日韩精品| 国产精品3区| 美女精品视频在线| 麻豆久久一区| 欧美激情亚洲| 国产精品对白久久久久粗| 日韩中文字幕| 欧美视频精品全部免费观看| 亚洲日本久久| 亚洲日本久久| 久久国产麻豆精品| 国产精品mm| 精品国产91| 欧美日韩尤物久久| 色爱综合av| 99精品99| 国产日韩欧美三级| 麻豆国产欧美日韩综合精品二区| 国产精品多人| 黄色在线网站噜噜噜| 久久精品青草| 蜜桃视频在线观看一区二区| 日韩中文av| 精品久久久久中文字幕小说| 国产麻豆久久| 日本伊人久久| 精品亚洲a∨| 影院欧美亚洲| 国产欧美日韩一级| 久久久久久自在自线| 性欧美xxxx免费岛国不卡电影| 日韩午夜高潮| 国产麻豆精品久久| 99精品美女| 日韩一区二区三区精品视频第3页| 久久91视频| 好吊日精品视频| 麻豆91小视频| 天堂成人国产精品一区| 欧美激情福利| 国产视频一区欧美| 国产精品密蕾丝视频下载| 久久精品青草| 国产精品一区二区美女视频免费看| 精品免费视频| 久久婷婷久久| 国产伦理久久久久久妇女| 欧洲毛片在线视频免费观看| 国产精品视频一区视频二区| 天堂网av成人| 国产精品男女| 爽好多水快深点欧美视频| 福利一区和二区| 日本视频在线一区| 在线视频日韩| 91精品韩国| 丰满少妇一区| 国产福利亚洲| 日韩av一区二区三区| 中文在线资源| 国产精品久久久久久av公交车| 免费成人性网站| 亚洲精品成人| 国内精品99| 久久久久久黄| 久久精品99久久无色码中文字幕| 你懂的国产精品| 国产精品v亚洲精品v日韩精品| 亚洲开心激情| 综合亚洲自拍| 欧美一级网址| 国产精品一区二区三区美女 | 国产精品久久久久久久久久久久久久久| 在线亚洲成人| 国产精品日韩| 视频一区二区三区中文字幕| 黑丝一区二区| 国产亚洲在线观看| 石原莉奈在线亚洲三区| 蜜臀久久99精品久久久久宅男| 婷婷综合激情| 石原莉奈在线亚洲三区| 中文字幕日韩高清在线| 麻豆久久一区| 国产成人精品亚洲日本在线观看| 日韩一区二区久久| 亚洲女同一区| 六月婷婷综合| 日韩国产一区| 欧美日韩国产一区精品一区| 午夜国产欧美理论在线播放| 香蕉成人久久| 久久香蕉网站| 欧美高清不卡| 97久久亚洲| av高清不卡| 视频一区视频二区在线观看| 欧美日韩一区自拍| 999精品色在线播放| 欧美福利在线| 国产亚洲精品美女久久| 国产精品不卡| 视频在线在亚洲| 国产成人精品999在线观看| 九九综合在线| 国产美女久久| 午夜电影亚洲| 久久只有精品| 免费日本视频一区| 中文字幕在线官网| 亚洲精品系列| 亚洲成av人片一区二区密柚| 亚洲精品系列| 欧美.日韩.国产.一区.二区| 老鸭窝毛片一区二区三区| 国产精品一国产精品| 欧美亚洲国产激情| 国产精品极品国产中出| 日韩精品一区第一页| 日韩三区免费| 久久久久九九精品影院| 蜜桃一区二区三区在线观看| 毛片在线网站| 日本精品在线播放| 亚洲精品小说| 成人午夜精品| 黄色精品视频| 国产黄色精品| 国产欧美大片| 少妇精品久久久一区二区三区| 中文字幕一区久| 激情不卡一区二区三区视频在线| 日本99精品| 日本亚洲最大的色成网站www| 中文精品在线| 亚洲电影在线一区二区三区| 亚洲人成在线网站| 欧美激情国产在线| 一区二区三区四区日本视频| 亚洲一级少妇| 91精品国产成人观看| 99久久夜色精品国产亚洲1000部| 日韩成人精品一区|