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 相关文章推荐
前后台交互过程中json格式如何解析以及如何生成
Dec 26 Javascript
处理及遍历XML文档DOM元素属性及方法整理
Aug 23 Javascript
各种常用的JS函数整理
Oct 25 Javascript
下拉列表select 由左边框移动到右边示例
Dec 04 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
Jun 30 Javascript
详解AngularJS的通信机制
Jun 18 Javascript
js控制多图左右滚动切换效果代码分享
Aug 26 Javascript
JavaScript ES5标准中新增的Array方法
Jun 28 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
Jan 16 Javascript
Vue 2.x教程之基础API
Mar 06 Javascript
vue实现PC端录音功能的实例代码
Jun 05 Javascript
layer更改皮肤的实现方法
Sep 11 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
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
php实现的简单日志写入函数
2015/03/31 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
phpfpm的作用和用法
2019/10/10 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
jquery插件制作教程 txtHover
2012/08/17 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
javascript简易画板开发
2020/04/12 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
公关关系专员的自我评价分享
2013/11/20 职场文书
化妆品活动策划方案
2014/05/23 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
六年级学生评语大全
2014/12/26 职场文书
英语通知范文
2015/04/22 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书