Element樹(shù)形控件el-tree實(shí)現(xiàn)一鍵全選、反選功能
前言
本篇文章將詳細(xì)講解 vue3+Element Plus 項(xiàng)目中如何實(shí)現(xiàn)el-tree組件的一鍵全選反選功能:點(diǎn)擊一鍵全選時(shí),將選中所有的節(jié)點(diǎn),當(dāng)節(jié)點(diǎn)未被全部選中時(shí) ,全選框?yàn)榘脒x狀態(tài)。(最后有增加vue2+element ui 實(shí)現(xiàn)代碼)
vue3+Element Plus具體實(shí)現(xiàn):
模板部分:
1,在合適位置(如el-tree同級(jí))新增一個(gè)復(fù)選框組件 el-checkbox
<el-checkbox size="mini" :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" style="padding:0px;margin-right:5px;"> 全選</el-checkbox>
步驟詳解:
(1) indeterminate
屬性用以表示 checkbox 的不確定狀態(tài),一般用于實(shí)現(xiàn)全選的效果;
(2)v-model 綁定的值控制全選框是否為選中狀態(tài);
(3)@change是狀態(tài)改變時(shí)觸發(fā)的事件。
2,給el-tree組件綁定ref屬性,node-key屬性,以及 @check-change事件
<el-tree ref="testingTree" :data="testingData" :props="testingProps" show-checkbox @check-change="testCheckChange" node-key="path" />
步驟詳解:
(1) 在vue3中同樣是以ref屬性來(lái)獲取元素;
(2)check-change 事件當(dāng)復(fù)選框被點(diǎn)擊的時(shí)候觸發(fā);
(3)node-key 節(jié)點(diǎn)標(biāo)識(shí) 通常用id,實(shí)際開(kāi)發(fā)根據(jù)后端數(shù)據(jù)來(lái)確定就好。
JS邏輯部分
3,實(shí)現(xiàn)全選及反選邏輯(代碼有點(diǎn)長(zhǎng),我會(huì)逐句講解)
//一鍵全選 let checkAll = ref(false) //全選按鈕的綁定值 let isIndeterminate = ref(false) //全選按鈕的全選,半選樣式 const testingTree = ref(null) //在vue3中使用ref獲取元素需要在setup中進(jìn)行聲明一個(gè)同名變量 //1.1獲取當(dāng)前選中的節(jié)點(diǎn) function testCheckChange() { // 獲取Tree組件的實(shí)例,使用ref聲明的變量在邏輯代碼中使 用時(shí)需加 .value const tree = testingTree.value; let checkedCount = 0;//被勾選上的一級(jí)節(jié)點(diǎn)個(gè)數(shù) let disabledCount = 0;//置灰的一級(jí)節(jié)點(diǎn)個(gè)數(shù) let indeterminateFlag = false;//有沒(méi)有一級(jí)節(jié)點(diǎn)處于半選狀態(tài) //遍歷所有一級(jí)節(jié)點(diǎn)(testingData為el-tree組件:data的值) for (let i = 0; i < testingData.value.length; i++) { //getNode為el-tree組件的實(shí)例方法,可以根據(jù) data 或者 key 拿到 Tree 組件中的 node if (tree.getNode(testingData.value[i]).disabled == true) { disabledCount += 1;//如果有置灰的節(jié)點(diǎn),置灰變量加1 } if (tree.getNode(testingData.value[i]).checked == true) { checkedCount += 1;//如果有勾選的節(jié)點(diǎn),勾選變量加1 } if (tree.getNode(testingData.value[i]).indeterminate == true) { indeterminateFlag = true;//如果有半選的節(jié)點(diǎn),半選變量設(shè)為true } } if (checkedCount == 0) { isIndeterminate.value = false; checkAll.value = false;//如果勾選的一級(jí)節(jié)點(diǎn)數(shù)為0,則設(shè)置全選按鈕樣式不為半選樣式,全選的值為false if (indeterminateFlag == true) {//如果下面有半選的,設(shè)置全選按鈕的樣式為半選樣式 isIndeterminate.value = true; checkAll.value = false; } } else if ((checkedCount + disabledCount) == testingData.value.length) {//如果樹(shù)上勾上的和置灰的加起來(lái)等于tree上data的長(zhǎng)度,設(shè)置全選按鈕樣式不為半選樣式,全選值為true isIndeterminate.value = false; checkAll.value = true; } else {//上面條件不滿足,則說(shuō)明沒(méi)有全部勾上,設(shè)置樣式為半選,全選值為false isIndeterminate.value = true; checkAll.value = false; } return; } //全選按鈕勾上的方法事件 function handleCheckAllChange(val) { isIndeterminate.value = false;//設(shè)置全選按鈕樣式不為半選 if (checkAll.value == true) { //如果是當(dāng)前值是全選,依次遍歷節(jié)點(diǎn)設(shè)置勾選,同時(shí)過(guò)濾的disabled為true的 for (let i = 0; i < testingData.value.length; i++) { if (testingTree.value.getNode(testingData.value[i]).disabled == false) { testingTree.value.setChecked(testingData.value[i].path, true, true); } } } else { //取消全選時(shí)置空 testingTree.value.setCheckedKeys([]) }
vue2+Element ui具體實(shí)現(xiàn):
<template> <div> <el-checkbox size="mini" :indeterminate="isIndeterminate" v-model="new_task_form.case_checkAll" @change="handleCheckAllChange" style="padding:0px;margin-right:5px;">全選</el-checkbox> </div> <el-tree style="max-height: 200px;overflow: auto;" :data="casedata" show-checkbox :default-expand-all="false" node-key="id" ref="casetree" highlight-current :props="defaultPorps" @check-change="case_check_change"> </el-tree> </template>
data(){ return { new_task_form:{ "case_checkAll":false //全選按鈕的綁定值 }, isIndeterminate:false,//全選按鈕的全選,半選樣式 } }, methods:{ case_check_change(node1,node2,node3){//樹(shù)節(jié)點(diǎn)check事件 let checked_count = 0;//被勾選上的一級(jí)節(jié)點(diǎn)個(gè)數(shù) let disabled_count = 0;//置灰的一級(jí)節(jié)點(diǎn)個(gè)數(shù) let indeterminate_flag = false;//有沒(méi)有一級(jí)節(jié)點(diǎn)處于半選狀態(tài) //遍歷所有一級(jí)節(jié)點(diǎn) for(let i=0;i<this.casedata.length;i++){ if(this.$refs.casetree.getNode(this.casedata[i]).disabled==true){ disabled_count += 1;//如果有置灰的節(jié)點(diǎn),置灰變量加1 } if(this.$refs.casetree.getNode(this.casedata[i]).checked==true){ checked_count += 1;//如果有勾選的節(jié)點(diǎn),勾選變量加1 } if(this.$refs.casetree.getNode(this.casedata[i]).indeterminate==true){ indeterminate_flag = true;//如果有半選的節(jié)點(diǎn),半選變量設(shè)為true } } if(checked_count==0){ this.isIndeterminate = false; this.new_task_form.case_checkAll = false;//如果勾選的一級(jí)節(jié)點(diǎn)數(shù)為0,則設(shè)置全選按鈕樣式不為半選樣式,全選的值為false if(indeterminate_flag==true){//如果下面有半選的,設(shè)置全選按鈕的樣式為半選樣式 this.isIndeterminate = true; this.new_task_form.case_checkAll = false; } } else if((checked_count+disabled_count)==this.casedata.length){//如果樹(shù)上勾上的和置灰的加起來(lái)等于tree上data的長(zhǎng)度,設(shè)置全選按鈕樣式不為半選樣式,全選值為true this.isIndeterminate = false; this.new_task_form.case_checkAll = true; } else{//上面條件不滿足,則說(shuō)明沒(méi)有全部勾上,設(shè)置樣式為半選,全選值為false this.isIndeterminate = true; this.new_task_form.case_checkAll = false; } return; }, handleCheckAllChange(val){//全選按鈕勾上的方法事件 this.isIndeterminate = false;//設(shè)置全選按鈕樣式不為半選 if(this.new_task_form.case_checkAll==true){//如果是當(dāng)前值是全選,依次遍歷節(jié)點(diǎn)設(shè)置勾選,同時(shí)過(guò)濾的disabled為true的 for(let i=0;i<this.casedata.length;i++){ if(this.$refs.casetree.getNode(this.casedata[i]).disabled==false){ this.$refs.casetree.setChecked(this.casedata[i].id,true,true); } } } else{//當(dāng)前值不是全選,設(shè)置勾選列表為空 this.$refs.casetree.setCheckedKeys([]); } }, }
總結(jié)
到此這篇關(guān)于Element樹(shù)形控件el-tree實(shí)現(xiàn)一鍵全選、反選功能的文章就介紹到這了,更多相關(guān)el-tree一鍵全選反選內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度以及省市區(qū)功能
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度以及省市區(qū)功能的相關(guān)資料,開(kāi)發(fā)中我們需要地圖定位,就是用戶輸入位置,自動(dòng)定位獲取經(jīng)緯度,需要的朋友可以參考下2023-08-08vuedraggable實(shí)現(xiàn)簡(jiǎn)單拖拽功能
這篇文章主要為大家詳細(xì)介紹了vuedraggable實(shí)現(xiàn)拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04vue-element如何實(shí)現(xiàn)動(dòng)態(tài)換膚存儲(chǔ)
這篇文章主要介紹了vue-element如何實(shí)現(xiàn)動(dòng)態(tài)換膚存儲(chǔ)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04vue axios請(qǐng)求成功卻進(jìn)入catch的原因分析
這篇文章主要介紹了vue axios請(qǐng)求成功卻進(jìn)入catch的原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Vue Router中的冗余導(dǎo)航錯(cuò)誤及解決方案
在現(xiàn)代前端開(kāi)發(fā)中,單頁(yè)應(yīng)用(SPA)已經(jīng)成為主流,而 Vue.js 作為一款流行的前端框架,其官方路由庫(kù) Vue Router 則是構(gòu)建 SPA 的核心工具之一,在使用 Vue Router 的過(guò)程中,開(kāi)發(fā)者可能會(huì)遇到一些常見(jiàn)的錯(cuò)誤,本文將深入探討這一錯(cuò)誤的原因、影響以及解決方案2025-01-01Vue.js實(shí)現(xiàn)可排序的表格組件功能示例
這篇文章主要介紹了Vue.js實(shí)現(xiàn)可排序的表格組件功能,涉及vue.js事件響應(yīng)、元素動(dòng)態(tài)操作、排序、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02