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 相关文章推荐
枚举JavaScript对象的函数
Dec 22 Javascript
jQuery移动和复制dom节点实用DOM操作案例
Dec 17 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
Aug 22 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
Dec 08 Javascript
jQuery实现列表内容的动态载入特效
Aug 08 Javascript
javascript字符串替换函数如何一次性全部替换掉
Oct 30 Javascript
JS中改变this指向的方法(call和apply、bind)
Mar 26 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
May 03 Javascript
浅析$.getJSON异步请求和同步请求
Jun 06 Javascript
详解JavaScript跨域总结与解决办法
Oct 31 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
Jun 29 Javascript
基于Bootstrap分页的实例讲解(必看篇)
Jul 04 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
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
ext实现完整的登录代码
2008/08/08 Javascript
JS 判断代码全收集
2009/04/28 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
python使用str &amp; repr转换字符串
2016/10/13 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
Python通过文本和图片生成词云图
2020/05/21 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
恶意软件的定义
2014/11/12 面试题
怎样填写就业意向
2014/04/02 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
2014年国庆节演讲稿精选范文1500字
2014/09/25 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
个人售房合同协议书
2016/03/21 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS