vue3+tpyeScript + element plus 三级复选框,全选控制全部,左侧选中控制右侧全选
.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { line-height: 1.5; margin-top: 35px; margin-bottom: 10px; padding-bottom: 5px }
.markdown-body h1 { font-size: 24px; line-height: 38px; margin-bottom: 5px }
.markdown-body h2 { font-size: 22px; line-height: 34px; padding-bottom: 12px; border-bottom: 1px solid rgba(236, 236, 236, 1) }
.markdown-body h3 { font-size: 20px; line-height: 28px }
.markdown-body h4 { font-size: 18px; line-height: 26px }
.markdown-body h5 { font-size: 17px; line-height: 24px }
.markdown-body h6 { font-size: 16px; line-height: 24px }
.markdown-body p { line-height: inherit; margin-top: 22px; margin-bottom: 22px }
.markdown-body img { max-width: 100% }
.markdown-body hr { border-top: 1px solid rgba(221, 221, 221, 1); border-right: none; border-bottom: none; border-left: none; margin-top: 32px; margin-bottom: 32px }
.markdown-body code { border-radius: 2px; overflow-x: auto; background-color: rgba(255, 245, 245, 1); color: rgba(255, 80, 44, 1); font-size: 0.87em; padding: 0.065em 0.4em }
.markdown-body code, .markdown-body pre { font-family: Menlo, Monaco, Consolas, Courier New, monospace }
.markdown-body pre { overflow: auto; position: relative; line-height: 1.75 }
.markdown-body pre>code { font-size: 12px; padding: 15px 12px; margin: 0; word-break: normal; display: block; overflow-x: auto; color: rgba(51, 51, 51, 1); background: rgba(248, 248, 248, 1) }
.markdown-body a { text-decoration: none; color: rgba(2, 105, 200, 1); border-bottom: 1px solid rgba(209, 233, 255, 1) }
.markdown-body a:active, .markdown-body a:hover { color: rgba(39, 91, 140, 1) }
.markdown-body table { display: inline-block !important; font-size: 12px; width: auto; max-width: 100%; overflow: auto; border: 1px solid rgba(246, 246, 246, 1) }
.markdown-body thead { background: rgba(246, 246, 246, 1); color: rgba(0, 0, 0, 1); text-align: left }
.markdown-body tr:nth-child(2n) { background-color: rgba(252, 252, 252, 1) }
.markdown-body td, .markdown-body th { padding: 12px 7px; line-height: 24px }
.markdown-body td { min-width: 120px }
.markdown-body blockquote { color: rgba(102, 102, 102, 1); padding: 1px 23px; margin: 22px 0; border-left: 4px solid rgba(203, 203, 203, 1); background-color: rgba(248, 248, 248, 1) }
.markdown-body blockquote:after { display: block; content: "" }
.markdown-body blockquote>p { margin: 10px 0 }
.markdown-body ol, .markdown-body ul { padding-left: 28px }
.markdown-body ol li, .markdown-body ul li { margin-bottom: 0; list-style: inherit }
.markdown-body ol li .task-list-item, .markdown-body ul li .task-list-item { list-style: none }
.markdown-body ol li .task-list-item ol, .markdown-body ol li .task-list-item ul, .markdown-body ul li .task-list-item ol, .markdown-body ul li .task-list-item ul { margin-top: 0 }
.markdown-body ol ol, .markdown-body ol ul, .markdown-body ul ol, .markdown-body ul ul { margin-top: 3px }
.markdown-body ol li { padding-left: 6px }
.markdown-body .contains-task-list { padding-left: 0 }
.markdown-body .task-list-item { list-style: none }
@media (max-width: 720px) { .markdown-body h1 { font-size: 24px } .markdown-body h2 { font-size: 20px } .markdown-body h3 { font-size: 18px } }.markdown-body pre, .markdown-body pre>code.hljs { color: rgba(51, 51, 51, 1); background: rgba(248, 248, 248, 1) }
.hljs-comment, .hljs-quote { color: rgba(153, 153, 136, 1); font-style: italic }
.hljs-keyword, .hljs-selector-tag, .hljs-subst { color: rgba(51, 51, 51, 1); font-weight: 700 }
.hljs-literal, .hljs-number, .hljs-tag .hljs-attr, .hljs-template-variable, .hljs-variable { color: rgba(0, 128, 128, 1) }
.hljs-doctag, .hljs-string { color: rgba(221, 17, 68, 1) }
.hljs-section, .hljs-selector-id, .hljs-title { color: rgba(153, 0, 0, 1); font-weight: 700 }
.hljs-subst { font-weight: 400 }
.hljs-class .hljs-title, .hljs-type { color: rgba(68, 85, 136, 1); font-weight: 700 }
.hljs-attribute, .hljs-name, .hljs-tag { color: rgba(0, 0, 128, 1); font-weight: 400 }
.hljs-link, .hljs-regexp { color: rgba(0, 153, 38, 1) }
.hljs-bullet, .hljs-symbol { color: rgba(153, 0, 115, 1) }
.hljs-built_in, .hljs-builtin-name { color: rgba(0, 134, 179, 1) }
.hljs-meta { color: rgba(153, 153, 153, 1); font-weight: 700 }
.hljs-deletion { background: rgba(255, 221, 221, 1) }
.hljs-addition { background: rgba(221, 255, 221, 1) }
.hljs-emphasis { font-style: italic }
.hljs-strong { font-weight: 700 }
需求
当点击左侧复选框时,右侧的全部复选框会被选中,当右侧部分复选框被选中时,左侧会显示半选状态。上方有一个全选复选框,当左侧所有复选框都被选中时,全选按钮会显示选中状态,当左侧复选框部分选中时,全选按钮会显示半选状态。
代码
1首先我们要确定数据格式,就是左侧和右侧还是有全选按钮的关联关系
全选是独立的
//全选 设置选中的非选择
const selectAll: any = ref(false);
//使用element 完成半选
const selectAllIndeterminate: any = ref(false);
//左侧和右侧的关联关系
const options: any = ref([
{
label: 'Option 1', //左侧展示的数据
leftChecked: false, // 左侧是否选中
optionsData: ['A', 'B', 'C'], // 右侧的数据
rightChecked: [], //右侧选中
indeterminate:false, //左侧是否全选还是半选
},
{
label: 'Option 2',
leftChecked: false,
optionsData: ['X', 'Y', 'Z'],
rightChecked: [],
indeterminate:false,
},
]);
2.通过循环展示出来原型图的样式
<div>
<el-checkbox v-model="selectAll" :indeterminate="selectAllIndeterminate" @change="handleSelectAll">全选</el-checkbox>
<el-row v-for="(item, index) in options" :key="index">
<!-- 左侧复选框 -->
<el-col :span="8">
<el-checkbox v-model="item.leftChecked" @change="handleLeftChange(index)" :indeterminate="item.indeterminate">
{{ item.label }}
</el-checkbox>
</el-col>
<!-- 右侧复选框 -->
<el-col :span="16">
<el-checkbox-group v-model="item.rightChecked" @change="(val:any)=>handleCheckGroup(index,val)">
<el-checkbox :label="option" v-for="(option, optionIndex) in item.optionsData" :key="optionIndex">
{{ option }}
</el-checkbox>
</el-checkbox-group>
</el-col>
</el-row>
</div>
3 实现的相应的逻辑
//点击左侧的复选框 右侧全选 同时消除半选的状态
const handleLeftChange = (index: number) => {
//找到对应的左侧复选框
const option = options.value[index];
// option.leftChecke是否选中,如果选中就将右侧的所有的都赋值过去 这是多个复选框展示和选中都是以数组的形式所表现的所以就可以的到点击左侧右侧全选和右侧不全选
option.rightChecked = option.leftChecked ? [...option.optionsData] : [];
option.indeterminate=false
checkSelectAll();
}
// 监听右侧复选框的变化
const handleCheckGroup=(index:number,data:any)=>{
//找到对应的数据
const option = options.value[index];
//根据右侧复选框来判断做的是否选中还是半选 如果右侧全部选中和原本数据对比如果一致那就左侧就是选中
option.leftChecked =data.length>0 && data.length === option.optionsData.length
// 如果右侧全部选中和原本数据对比如果不一致那就左侧就是半选
option.indeterminate = data.length>0 && data.length !== option.optionsData.length
checkSelectAll();
}
// 无论左侧还是右侧全部选中了对上面的全选做一个状态调整
const checkSelectAll = () => {
// 判断左侧是否全部选中
const allLeftChecked = options.value.every((option: any) => option.leftChecked);
//判断左侧是否是部分选中
const someLeftChecked = options.value.some((option: any) => option.leftChecked);
//如果是全部选中那么就将全选的按钮做选中效果
selectAll.value = allLeftChecked ? true : (someLeftChecked ? null : false);
//如果是部分选中那么就将全选的按钮做部分选中效果
selectAllIndeterminate.value =allLeftChecked ? false : (someLeftChecked ? true : false);
}
//当全选的点击事件触发变化
const handleSelectAll = (data: any) => {
//去掉全选的半选样式
selectAllIndeterminate.value=false
options.value.map((option: any) => {
//将全选选中 true /false 选中和不选中的效果 赋值给所有的左侧复选框
option.leftChecked = data;
//将全选选中 将所有的左侧半选样式去掉
option.indeterminate = false;
//将全选选中 将所有的左侧半选样式去掉
// 右侧整体如果是选中的话那么就有全部的数据否则就是空
option.rightChecked = data ? [...option.optionsData] : [];
});
}
// 初始化时检查是否全选
onMounted(() => {
checkSelectAll();
});
vue3+tpyeScript + element plus 三级复选框,全选控制全部,左侧选中控制右侧全选的更多相关文章
- jquery checkbox 复选框多次点击判断选中状态,以及全选/取消的代码示例
2015年12月21日 10:52:51 星期一 目标, 点击当前的checbox, 判断点击后当前checkbox是否是选中状态. html: <input type="checkb ...
- Ext.grid.CheckboxSelectionModel复选框设置某行不可以选中
var sm = new Ext.grid.CheckboxSelectionModel({ renderer:function(v,c,r){ if(r.get("isEdit" ...
- 同上! 下拉复选框 点击当前的checkbox 选中后面li 添加到指定区域
(function() { $(".cxbtntj").click(function(){ console.log($("#jsLi1").attr(" ...
- jquery对复选框(checkbox)的操作(精华)
@{ Layout = null;} <!DOCTYPE html> <html><head> <meta name="viewport" ...
- 案例1.通过Jquery来处理复选框
实现以下功能: 1:选中第一个复选框,那么下面所有的复选框都选中,去除选中第一个复选框,下面的都不选中 2:当点击全选按钮,上面足球.篮球.游泳.唱歌 全部选中 3:当点击全不选按钮,上面四个全部取消 ...
- 关于复选框input[type=checkbox]
关于复选框input[type=checkbox],其实在前面的文章中说过一次,当时主要关注点在设置复选框的状态,利用prop实现,今天继续关注一下复选框. 自己在项目中,遇到一个全选/全不选的需求, ...
- DOM(十)使用DOM设置单选按钮、复选框、下拉菜单
1.设置单选按钮 单选按钮在表单中即<input type="radio" />它是一组供用户选择的对象,但每次只能选一个.每一个都有checked属性,当一项选择为t ...
- 制作复选框(Toggle)
怎样判断是否应当使用复选框 复选框,就是对一个选项做上一个标记,表示这个选项已经被选中了.在游戏中,复选框一般用来做一些选项的控制,这种选项一般都只有两种答案:是和否.例如,单击一下开启音乐的复选框, ...
- easyUI带复选框的组合树
代码: <input id="depts"><script type="text/javascript">$(document).rea ...
- 功能代码(1)---通过Jquery来处理复选框
实现以下功能: 1:选中第一个复选框,那么下面所有的复选框都选中,去除选中第一个复选框,下面的都不选中 2:当点击全选按钮,上面足球.篮球.游泳.唱歌 全部选中 3:当点击全不选按钮,上面四个全部取消 ...
随机推荐
- 【转载】 CV往哪卷?李飞飞指出三颗「北极星」:具身智能,视觉推理和场景理解
原文地址: https://news.cnblogs.com/n/720105/ 新智元报道 编辑:LRS ============================================== ...
- 零基础学习人工智能—Python—Pytorch学习(一)
前言 其实学习人工智能不难,就跟学习软件开发一样,只是会的人相对少,而一些会的人写文章,做视频又不好好讲. 比如,上来就跟你说要学习张量,或者告诉你张量是向量的多维度等等模式的讲解:目的都是让别人知道 ...
- uniapp苹果开发用什么截屏
uniapp开发好苹果的app后,需要上架到app store connect后,用户才能使用app store进行安装. 在上架app store的过程中,却要求我们提供多种尺寸的app运行的设备截 ...
- JavaScript 事件循环竟还能这样玩!
JavaScript 是一种单线程的编程语言,这意味着它一次只能执行一个任务.为了能够处理异步操作,JavaScript 使用了一种称为事件循环(Event Loop)的机制. 本文将深入探讨事件循环 ...
- LVM逻辑卷创建
创建步骤 1.创建分区 2.创建PV 3.创建VG 4.创建LV 5.格式化及挂载 创建分区 使用分区工具(如fdisk等)创建LVM分区. 创建PV $ pvcreate /dev/sdb5 #将每 ...
- Nano 编辑器入门
按键映射 ⌃: Control M: Meta (Alt) 编辑文件: nano MyFile.txt 退出并保存: ⌃-X 退出(此时 nano 会提示你要不要保存,按 Y 保存) Nano 提示输 ...
- tlmgr 操作
宏包管理 sudo tlmgr install <package> # 安装宏包 sudo tlmgr install scheme-full # 安装全部宏包 sudo tlmgr re ...
- 使用JDBC查询数据库会一次性加载所有数据吗
前几天有个小伙伴说他有个疑问:当我们发起一个查询的时候,数据库服务器是把所有结果集都准备好,然后一次性返回给应用程序服务吗(因为他们生产有个服务因为一个报表查询搞宕机了). 这样想的原因很简单,假设那 ...
- Android Adapter分页显示异常: 首页数据在屏幕内全显示,无法上滑分页
前情提要: Android 端Adapter分页,下拉刷新,上滑分页, 原有流程:上滑时,滑动触及底部,触发Adapter的onScrolled的方法 异常情况:第一页数据完全显示,导致上滑时,未触及 ...
- 第1章-JSP 简介
目录 什么是JSP 安装配置JSP运行环境 JSP页面 JSP页面简介 设置Web服务目录 JSP运行原理 JSP 与Java Servlet的关系 HTML与JavaScript 什么是JSP ★ ...