vue多级多选菜单组件开发


Posted in Javascript onSeptember 08, 2020

本文实例为大家分享了vue多级多选菜单组件的制作方法,供大家参考,具体内容如下

vue多级多选菜单组件开发

要开发一个这样的多级多选菜单组件,功能是:

点击父标题栏可以打开与折叠子列表
点击父标题栏的勾选图标可以全选或取消子列表
点击子列表的勾选图标达到全选时,父标题栏的勾选图标自动勾选;反之,没达到全选时,父标题栏的勾选图标自动取消勾选
当所有父标题栏的勾选图标达到全选时,最底下那个全选框自动勾选;反之,没达到全选时,最底下那个全选框自动取消勾选
点击最底下那个全选框可以全选或取消全部的勾选图标

所以总结起来我们重点要利用子列表勾选了哪些项来计算出父标题与底下的全选框是自动勾选还是自动取消,并且父标题与底下的全选框在选择变化时子列表应有什么变化。要做到以上,实现过程是:

构建我们model层数据

datas : [
 {
 //用于判断是否展示子列表
 isShowListItem : false,
 //用于记录选中了哪些子项
 selected : [],
 //父标题
 listTitle : "保利南悦湾",
 //子列表
 listItem : [
 {
 id : 1,
 name : "李小龙"
 },
 {
 id : 2,
 name : "周星驰"
 },
 {
 id : 3,
 name : "周杰伦"
 }
 ]
 },
 {
 isShowListItem : false,
 selected : [],
 listTitle : "南庄万科城",
 listItem : [
 {
 id : 4,
 name : "大魔王"
 },
 {
 id : 5,
 name : "老妖怪"
 }
 ]
 }
]

记录子列表勾选了哪些项
子列表通过v-model=”data.selected”去双向绑定到selected数组中,当子列表项的checked发生变化时,就会把当前项的id记录到selected数组里去

<input 
type="checkbox"
:value="item.id"
v-model="data.selected"
>

当父标题勾选变化时的处理方法
自动处理父标题勾选图标的变化
在HTML里,通过绑定:checked=”isTitleChecked(data)”,这时,每当其他项变化时,父标题都会调用一下isTitleChecked这个方法去判断一下这时自己的checked状态是true还是false,从而达到根据子项选中数目不同,父标题自动变化的目的。
通过@change=”changeTitleChecked(data,$event)”,每当父标题主动勾选或取消时触发
父标题HTML

<input :id="data.listTitle"
 class="list-input"
 type="checkbox"
 :checked="isTitleChecked(data)"
 @change="changeTitleChecked(data,$event)"
>

父标题JS

changeTitleChecked方法:当主动触发父标题的勾选图标时,如果这次触发chaeked的状态是true,则要把子列表项中没选中的全部选中,即将它们全部加进selected数组中;如果是false,则要把子列表项全部取消选中,即清空selected数组。
isTitleChecked方法:当子列表项全部选中时自动勾选父标题。

/**
* 当父标题状态变化时的处理方法
* @param data [当前项的data]
* @param event [当前项的event]
*/
changeTitleChecked : function (data,event) {
 if (event.target.checked === true) {
 data.listItem.forEach(function (item) {
 data.selected.indexOf(item.id) === -1 && data.selected.push(item.id);
 })
 }else {
 data.selected = [];
 }
}
/**
* 判断父标题选择状态
* @param data [当前项的data]
* @returns {boolean}
*/
isTitleChecked : function (data) {
 var _selected = data.selected;
 var _listItem = data.listItem;
 // 验证selected中是否含有全部的item的id 如果是 证明title要选中
 return _listItem.every(function (item) {
 return _selected.indexOf(item.id) != -1;
 });
}

当底下的全选框变化时的处理方法
自动处理底下的全选框的变化

全选框HTML:

<input id="all-checked"
 type="checkbox"
 :checked="isAllChecked()"
 @change="changeAllChecked($event)"
>

全选框JS:

changeAllChecked方法:当主动触发全选框时,如果checked为true,则将全部的子项都放进selected数组里;反之则清空全部selected数组。
isAllChecked 方法:判断selected数组的长度是否等于全部子项数,如果相等,则全选框checked状态设为true。

/**
* 全选框change事件的回调处理方法
* @param event 
*/
changeAllChecked : function (event) {
 if (event.target.checked === true) {
 this.datas.forEach(function (data) {
 data.listItem.forEach(function (item) {
 data.selected.indexOf(item.id) === -1 && data.selected.push(item.id);
 })
 })
}else {
 this.datas.forEach(function (data) {
 data.selected = [];
 })
 }
}

/**
* 判断全选框选择状态
* @returns {boolean}
*/
isAllChecked : function () {
 return this.datas.every(function (data) {
 return data.selected.length === data.listItem.length;
 });
}

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
当jQuery1.7遇上focus方法的问题
Jan 26 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
详解JavaScript逻辑Not运算符
Dec 04 Javascript
canvas学习之API整理笔记(二)
Dec 29 Javascript
老生常谈jquery id选择器和class选择器的区别
Feb 12 Javascript
ES6生成器用法实例分析
Apr 10 Javascript
基于Vue实现后台系统权限控制的示例代码
Aug 29 Javascript
vue keep-alive请求数据的方法示例
May 16 Javascript
JS实现li标签的删除
Apr 12 Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 Javascript
JS异步错误捕获的一些事小结
Apr 26 Javascript
google广告之另类js调用实现代码
Aug 22 Javascript
使用Javascript监控前端相关数据的代码
Oct 27 #Javascript
js实现各种复制到剪贴板的方法(分享)
Oct 27 #Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
Oct 27 #Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
Oct 27 #Javascript
vue插件tab选项卡使用小结
Oct 27 #Javascript
JS实现用户注册时获取短信验证码和倒计时功能
Oct 27 #Javascript
微信小程序 action-sheet底部菜单详解
Oct 27 #Javascript
You might like
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
php精度计算的问题解析
2019/06/21 PHP
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
python解析文件示例
2014/01/23 Python
Python中的super()方法使用简介
2015/08/14 Python
Python中字典的setdefault()方法教程
2017/02/07 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
python如何实现DES加密
2020/09/21 Python
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
《赠汪伦》教学反思
2014/04/12 职场文书
婚礼家长致辞
2015/07/27 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书