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.mzph.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 就被不断完善和普及&…