电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

前言

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

效果

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

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

API

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

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

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

title: 展示的標(biāo)題 expand 是否展開節(jié)點(diǎn) checked 是否選中節(jié)點(diǎn) children 子節(jié)點(diǎn)

以及還有兩個event

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

我們來 init tree主組件

首先需要考慮一個問題因?yàn)閠ree是遞歸遍歷的,因?yàn)槲覀冃枰獎?chuàng)建一個入口組件還有一個遞歸children的組件。

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

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

如何實(shí)現(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 負(fù)責(zé)渲染當(dāng)前節(jié)點(diǎn),如果當(dāng)前節(jié)點(diǎn)有children 那就遞歸調(diào)用本身來遞歸渲染這是使用了一個deepCopy的方法,這個是深拷貝的簡單實(shí)現(xiàn),遞歸的去重新重新賦值data數(shù)組,開辟新的堆內(nèi)存與傳入的數(shù)據(jù)無關(guān)聯(lián)。不會破壞原有的數(shù)據(jù)

我們來 init node遞歸組件

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

展開關(guān)閉按鈕 checkbox 節(jié)點(diǎn)的title 遞歸

node的基本構(gòu)造

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

結(jié)語

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

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

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器 | 上海物流公司,上海货运公司,上海物流专线-优骐物流公司 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 挨踢网-大家的导航! | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 石英粉,滑石粉厂家,山东滑石粉-莱州市向阳滑石粉有限公司 | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 沟盖板_复合沟盖板厂_电力盖板_树脂雨水篦子-淄博拜斯特 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 自动配料系统_称重配料控制系统厂家| 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 对夹式止回阀厂家,温州对夹式止回阀制造商--永嘉县润丰阀门有限公司 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 东莞画册设计_logo/vi设计_品牌包装设计 - 华略品牌设计公司 | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺 | 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 电梯装饰-北京万达中意电梯装饰有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 海南在线 海南一家 | 低温等离子清洗机(双气路进口)-嘉润万丰 |