最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年12月03日 09:26:38   作者:Yaning  
這篇文章主要介紹了如何實現(xiàn)vue的tree組件,幫助大家更好的理解和學習vue框架,感興趣的朋友可以了解下

前言

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

效果

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

API

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

每個節(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組件

我們在初始化以及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 那就遞歸調用本身來遞歸渲染
這是使用了一個deepCopy的方法,這個是深拷貝的簡單實現(xiàn),遞歸的去重新重新賦值data數(shù)組,開辟新的堆內(nèi)存與傳入的數(shù)據(jù)無關聯(lián)。不會破壞原有的數(shù)據(jù)

我們來 init node遞歸組件

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

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

node的基本構造

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é)點

這里有一點需要注意 修改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 字段即可

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

在 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ù)。這就是遞歸。

結語

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

以上就是如何實現(xiàn)vue的tree組件的詳細內(nèi)容,更多關于vue tree組件的資料請關注腳本之家其它相關文章!

相關文章

  • Vue中provide和inject的使用教程詳解

    Vue中provide和inject的使用教程詳解

    在?Vue?中,provide?和?inject?是用于實現(xiàn)祖先組件向后代組件傳遞數(shù)據(jù)的一種方式,本文主要來和大家詳細講講provide和inject的使用方法,希望對大家有所幫助
    2024-02-02
  • 媒體查詢media不生效的原因及解決

    媒體查詢media不生效的原因及解決

    媒體查詢@media常見的不生效原因包括格式書寫錯誤,例如and后必須有空格;樣式?jīng)_突,后面的CSS會覆蓋前面的;CSS本身存在問題,比如塊元素浮動導致父級元素無高度而背景顏色不顯示;漏掉了meta屬性中的viewport屬性,正確書寫和排列CSS代碼
    2024-10-10
  • vue如何實現(xiàn)清空this.$route.query的值

    vue如何實現(xiàn)清空this.$route.query的值

    這篇文章主要介紹了vue如何實現(xiàn)清空this.$route.query的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue.js自定義事件的表單輸入組件方法

    Vue.js自定義事件的表單輸入組件方法

    下面小編就為大家分享一篇Vue.js自定義事件的表單輸入組件方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue antd的from表單中驗證rules中type的坑記錄

    vue antd的from表單中驗證rules中type的坑記錄

    這篇文章主要介紹了vue antd的from表單中驗證rules中type的坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue3+Element?Plus按需引入(自動導入)詳解

    Vue3+Element?Plus按需引入(自動導入)詳解

    element-plus根據(jù)官網(wǎng)文檔,推薦用戶采用按需導入的方式進行導入,下面這篇文章主要給大家介紹了關于Vue3+Element?Plus按需引入(自動導入)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • 如何在VUE中使用vue-awesome-swiper

    如何在VUE中使用vue-awesome-swiper

    這篇文章主要介紹了如何在VUE中使用vue-awesome-swiper,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-01-01
  • vue項目里面引用svg文件并給svg里面的元素賦值

    vue項目里面引用svg文件并給svg里面的元素賦值

    這篇文章主要介紹了vue項目里面引用svg文件并給svg里面的元素賦值,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • vue的虛擬DOM使用方式

    vue的虛擬DOM使用方式

    這篇文章主要介紹了vue的虛擬DOM使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Vue?檢測變化的注意事項

    Vue?檢測變化的注意事項

    這篇文章主要介紹了Vue?檢測變化的注意事項,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08

最新評論

乌海市| 许昌县| 河东区| 海原县| 集安市| 康保县| 邵阳县| 翁牛特旗| 周至县| 绥中县| 两当县| 鄯善县| 普格县| 瑞安市| 鹤山市| 基隆市| 若羌县| 新和县| 右玉县| 广水市| 察隅县| 阳原县| 辽源市| 恩平市| 芒康县| 安塞县| 宜春市| 麻城市| 三江| 甘肃省| 新巴尔虎左旗| 渝中区| 平南县| 葵青区| 合川市| 天水市| 寻乌县| 金昌市| 巫山县| 滕州市| 历史|