elementui樹形復選框,element-ui checkbox 組件的樹形聯動

前言

示例版本為 Element-ui 2.13.0 + Vue 2.6.11

最近想弄 Element-ui checkbox 的多級聯動,網上相關的例子大多數為二級聯動,自己研究了一下,弄了一個樹形菜單的多級聯動,常用于角色管理等業務。(僅供參考,未考慮性能問題)

數據模型

[

{

"menu": {

"id":14,

"menuName":"測試管理',

"parentId":0

} ,

"menuOptionsList":[

{

"id":46,

"optionsName":"列表",

"checked":false

},

{

"id":47,

"optionsName":"新增",

"checked":false

}

],

"children":[],

"checked":false

}

]復制代碼

這里展示的最頂級的數據結構,下級數據只需要在 children 中添加即可。需要注意的是 checked 屬性,本身數據庫表中沒有這個數據,需要后臺建立一個 VO 映射實體將 checked 字段添加進去,默認值為 false.

邏輯處理

html 使用 el-table + el-chekbox 展示:

d2a72b70deb0c345ec070815e898e9c2.png

:data="menuList"

border

fit

size="mini"

highlight-current-row

row-key="menu.id"

:default-expand-all="true"

:tree-props="{children: 'children', hasChildren: 'hasChildren'}"

>

v-model="scope.row.checked"

:indeterminate="scope.row.indeterminate"

@change="handleCheckAllChange(scope.row, $event)">

{{ scope.row.menu.menuName }}

v-for="options in scope.row.menuOptionsList"

:key="options.id"

v-model="options.checked"

:label="options.optionsName"

@change="handleCheckChange(scope.row)"

/>

復制代碼

核心方法 handleCheckAllChange 和 handleCheckChange 這兩個方法,handleCheckAllChange 是 菜單選項 列按鈕被點擊的事件,handleCheckChange 是 選項列表 列被點擊的事件。

handleCheckAllChange(菜單列改變事件)

handleCheckAllChange(val, checked) {

// 有下級去處理下級

if (val.children.length > 0) {

// 遞歸設置子級選中狀態

this.findChildren(val.children, checked)

} else {

// 無下級處理本級

val.menuOptionsList.forEach(options => { options.checked = checked })

}

// 處理上級

if (val.menu.parentId !== 0) {

遞歸設置上級選中狀態

this.findParent(this.menuList, val.menu.parentId)

}

// 設置全選的未全部選中的狀態

val.indeterminate = false

}

復制代碼

根據數據中 children 的長度來判斷是否存在下級,如果存在就執行遞歸方法 findChildren 將子類的 checked 屬性設置為 true,不存在處理本級的 checked 屬性即可。需要注意的是 parentId 等于 0 證明當前菜單父級為頂級菜單,不需要再向上尋找。以此為判斷依據來進行父級菜單的判斷條件。 如果 parentId 不等于 0 說明當前全選的菜單存在父級,需要將父級的選項框進行狀態設置。

handleCheckChange(選項列改變事件)

handleCheckChange(val) {

const length = val.menuOptionsList.length

let checkedLength = 0

val.menuOptionsList.forEach(options => {

if (options.checked) {

checkedLength++

}

})

val.checked = checkedLength === length

val.indeterminate = checkedLength > 0 && checkedLength < length

// 處理上級

if (val.menu.parentId !== 0) {

this.findParent(this.menuList, val.menu.parentId)

}

}

復制代碼

這個方法對應著 選項列表 列選中的狀態,需要對 菜單名稱 列的全選狀態進行控制。首先通過變量 length 獲取到當前數據行選項列表的數量,遍歷選項數組根據 checked 的狀態獲取到已選中的選項數量。val.checked 代表當前列是否全選,val.indeterminate 代表當前列是否有選項被選中。但是這只是處理了當前行的狀態,當前行可能是某一菜單的子集,所以需要由下向上的去尋找菜單的父級并設置選中狀態。這里同樣用到了上面方法中的 findParent 函數。

findChildren(遞歸查詢子集)

findChildren(list, checked) {

list.forEach(children => {

children.checked = checked

children.indeterminate = false

children.menuOptionsList.forEach(options => {

options.checked = checked

if (children.children.length > 0) {

this.findChildren(children.children, checked)

}

})

})

}

復制代碼

findParent(遞歸查詢父集)

findParent(list, parentId) {

list.forEach(result => {

let parentCheckedLength = 0

let parentIndeterminateLength = 0

if (result.menu.id === parentId) {

result.children.forEach(children => {

if (children.indeterminate) {

parentIndeterminateLength++

} else if (children.checked) {

parentCheckedLength++

}

})

result.checked = parentCheckedLength === result.children.length

result.indeterminate = (parentIndeterminateLength > 0 || parentCheckedLength > 0) && parentCheckedLength < result.children.length

if (result.menu.parentId !== 0) {

this.findParent(this.menuList, result.menu.parentId)

}

} else if (result.children.length > 0) {

this.findParent(result.children, parentId)

}

})

}

復制代碼

完整示例

由于源碼篇幅過長,暫時將源碼放到 GitHub 了,希望可以幫助到你。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530854.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530854.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530854.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php 魔術方法 sleep,php 魔術方法 sleep() wakeup()

__sleep() 和 __wakeup()public array __sleep ( void )void __wakeup ( void )serialize() 函數會檢查類中是否存在一個魔術方法 __sleep()。如果存在&#xff0c;該方法會先被調用&#xff0c;然后才執行序列化操作。此功能可以用于清理對象&#xff0c;并返回一個包含對象中…

java 先入先出,java_阻塞隊列(FIFO先進先出)

java_阻塞隊列(FIFO先進先出)ArrayBlockingQueue&#xff1a;由數組結構組成的有界阻塞隊列&#xff1b;LinkedBlockingQueue&#xff1a;由鏈表結構組成的有界阻塞隊列(但大小默認值為&#xff1a;Integer.MAX_VALUE)&#xff1b;PriorityBlockingQueue&#xff1a;支持優先級…

PHP能在Mac上運行嗎,PHP Composer無法在Mac上運行

我安裝了bitnami mac堆棧主要是因為我的項目需要至少PHP 5.4.7版本.但是,我遇到了作曲家的問題.這是我跑步時遇到的錯誤&#xff1a;php composer.phar install --dev錯誤&#xff1a;Richard-Knops-MacBook-Pro:my-project richardknop$php composer.phar install --devdyld: …

主機安裝php網站,php支持虛擬主機(php網站空間)

php設置虛擬主機&#xff0c;主要是為了在ie輸入地址欄是&#xff0c;可以輸入任意的&#xff0c;而不是localhost/&#xff0c;為了方便&#xff0c;但是設置起來很不方便的。。發現不能實現每個站點使用不同的PHP版本&#xff0c;想向大家求教一下&#xff0c;有沒有能讓。支…

php時分獲取秒數,javascript與php時/分/秒與秒數互轉

javascript&#xff1a;/*時間轉換成秒*/function time_to_second(time){var arr time.split(‘:‘)var hour arr[0]?arr[0]:0var minute arr[1]?arr[1]:0var second arr[2]?arr[2]:0var ret hour * 3600 minute * 60 secondreturn ret}/*秒轉換成時間*/function sec…

lbp matlab程序,求教大神給解釋一下LBP特征提取每部分程序是干什么的

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓function X1 LBP(Resimage)% Returns a rotation invariant LBP (uniform patterns) histogram (10 bins)% of picture X.% the size of picture X must be at least 3x3 pixelsw1 (1/sqrt(2))^2;%根號1/2平方w2 (1-1/sqrt(2))*…

python以20字符寬居中輸出,Python 字符串內置方法(一)

以下方法只需要知道用法就行了&#xff0c;權當了解&#xff0c;不用硬背&#xff0c;以后需要用到的時候再回來看說明&#xff1a;一般方法中前面是is開頭的就是判斷來的&#xff0c;輸出不是True就是False&#xff0c;例如isalpha()方法capitalize()方法&#xff1a;首字母大…

php 復選框全選和取消,基于JavaScript實現復選框的全選和取消全選

這篇文章主要為大家詳細介紹了基于JavaScript實現復選框的全選和取消全選&#xff0c;具有一定的參考價值&#xff0c;感興趣的小伙伴們可以參考一下本文實例為大家分享了js復選框的全選和取消全選的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下效果圖&#xff1a;…

oracle 字段全大寫,Oracle如何批量將表中字段名全轉換為大寫(利用簡單存儲過程)...

前言今天查詢一個數據字段一直提示字符無效&#xff0c;明明在數據庫表字段中是存在的&#xff1b;查詢后得知&#xff0c;數據庫表字段為小寫時&#xff0c;查詢需要將字段名小寫并加上雙引號&#xff1b;表名同理&#xff0c;我這里表名是大寫&#xff0c;暫時不需要改。搜到…

oracle的al32utf8,oracle字符集修改(AL32UTF8-UTF8)

author&#xff1a;skatetime&#xff1a;2012/04/10AL32UTF8->UTF8步驟shutdown immediate;startup mount;alter session set sql_tracetrue;alter system enable restricted session;alter system set job_queue_processes0;alter system set aq_tm_processes0;alter data…

javascript date php date,JavaScript Date 知識淺析

Date函數new Date()Date 對象會自動把當前日期和時間保存為其初始值。date.getDate()從 Date 對象返回一個月中的某一天 (1 ~ 31)。date.getDay()從 Date 對象返回一周中的某一天 (0 ~ 6)。周日是0。date.getMonth()從 Date 對象返回月份 (0 ~ 11)。date.getFullYear()從 Date …

16字節 oracle md5,Oracle中的MD5加密

因為要用到MD5加密&#xff0c;所以在網上搜了一下相關資料&#xff0c;并進行仔細研究。其核心就是MD5編碼的數據包函數&#xff1a;DBMS_OBFUSCATION_TOOLKIT.M因為要用到MD5加密&#xff0c;所以在網上搜了一下相關資料&#xff0c;并進行仔細研究。其核心就是MD5編碼的數據…

ip字符串轉換 linux,Linux網絡編程入門

在日常使用&#xff0c;我們更多的使用十進制字符串表示IP地址&#xff0c;比如192.169.130.66&#xff0c;而不是記憶32位的IP地址(關鍵是太長了記不住呀)&#xff0c;使用字符串IP更為方便&#xff0c;可讀性也更好。但是根據上述in_addr定義&#xff0c;網絡編程中需要的是網…

linux php目錄是否存在,PHP判斷文件或者目錄是否可寫,兼容windows/linux系統

在PHP中&#xff0c;可用is_writable()函數來判斷一個 文件/目錄 是否可寫&#xff0c;用是否可生成文件的方式判斷目錄是否可寫&#xff1b;網上的一些代碼大多數能判斷linux系統&#xff0c;但windows服務器下判斷不準確。下面的代碼兼容windows和linux判斷文件或目錄是否可寫…

linux 腳本 發送郵件,shell 腳本發送郵件

有時候會使用腳本完成一系列的自動化工作&#xff0c;工作完成后還需要郵件通知相關人員&#xff0c;此時可以使用第三方的工具&#xff1a;SendEmail,最新版本sendEmail-v1.56.tar.gz下載地址&#xff1a;http://caspian.dotconf.net/menu/Software/SendEmail/sendEmil的使用范…

link linux 跨設備,Linux中的兩種link方式

Linux系統中包括兩種鏈接方式&#xff1a;硬鏈接(hard link)和符號鏈接(symbolic link)&#xff0c;其中符合鏈接就是所謂的軟鏈接(soft link)&#xff0c;那么兩者之間到底有什么區別呢&#xff1f;inode在Linux系統中&#xff0c;內核為每一個新創建的文件分配一個inode&…

linux 運行ca.crt,linux下使用openssl生成 csr crt CA證書,opensslcsr

linux下使用openssl生成 csr crt CA證書&#xff0c;opensslcsr本文主要借鑒和引用了下面2個地址的內容&#xff0c;然后在自己的機器上進行了測試和執行&#xff0c;并做了如下記錄。ref:http://blog.chinaunix.net/uid-26760055-id-3128132.htmlhttp://www.111cn.net/sys/lin…

linux cpu核數和線程數,cpu個數、核數和線程的理解

1.查看物理cpu個數grep physical id /proc/cpuinfo | sort -u | wc -l2.查看核心數量grep core id /proc/cpuinfo | sort -u | wc -l3.查看線程數grep processor /proc/cpuinfo | sort -u | wc -lcat /proc/cpuinfo 查看文件里面關鍵信息processor : 23 ----------代表…

linux設置超鏈接,幫助-鏈接 - Linux Kernel Newbies

this page is outdated and needs to be fixed參考鏈接形式語法備注內部鏈接WikiNameCamelCase page name內部自由鏈接["Page"] or ["free link"]可配置函數內部子頁面鏈接/SubPage or ["/Sub page"]相對于上一級頁面外部鏈接http://example.net…

linux 文件系統cache,終于找到一篇詳解Linux文件系統Cache的文章

級別&#xff1a; 初級2006 年 5 月 11 日文件 Cache 管理是 Linux 內核中一個很重要并且較難理解的組成部分。本文詳細介紹了 Linux內核中文件 Cache 管理的各個方面&#xff0c;希望能夠對開發者理解相關代碼有所幫助。自從誕生以來&#xff0c;Linux 就被不斷完善和普及&…