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 相关文章推荐
jquery.jstree 增加节点的双击事件代码
Jul 27 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
javascript中判断json的方法总结
Aug 27 Javascript
javascript伸缩菜单栏实现代码分享
Nov 12 Javascript
学习使用bootstrap3栅格系统
Apr 12 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
May 12 Javascript
ES6中的数组扩展方法
Aug 26 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
Aug 29 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
Feb 06 Javascript
JavaScript继承与聚合实例详解
Jan 22 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
Mar 14 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
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
理解Javascript_03_javascript全局观
2010/10/11 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
Vue项目中如何引入icon图标
2018/03/28 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
Cython 三分钟入门教程
2009/09/17 Python
在Python中实现贪婪排名算法的教程
2015/04/17 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
python flask 多对多表查询功能
2017/06/25 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
市场营销求职信范文
2014/02/21 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
后备干部培训方案
2014/05/22 职场文书
建筑专业毕业生自荐信
2014/05/25 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android