.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rgba(37, 41, 51, 1) }
.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 三级复选框,全选控制全部,左侧选中控制右侧全选的更多相关文章

  1. jquery checkbox 复选框多次点击判断选中状态,以及全选/取消的代码示例

    2015年12月21日 10:52:51 星期一 目标, 点击当前的checbox, 判断点击后当前checkbox是否是选中状态. html: <input type="checkb ...

  2. Ext.grid.CheckboxSelectionModel复选框设置某行不可以选中

    var sm = new Ext.grid.CheckboxSelectionModel({ renderer:function(v,c,r){ if(r.get("isEdit" ...

  3. 同上! 下拉复选框 点击当前的checkbox 选中后面li 添加到指定区域

    (function() { $(".cxbtntj").click(function(){ console.log($("#jsLi1").attr(" ...

  4. jquery对复选框(checkbox)的操作(精华)

    @{ Layout = null;} <!DOCTYPE html> <html><head> <meta name="viewport" ...

  5. 案例1.通过Jquery来处理复选框

    实现以下功能: 1:选中第一个复选框,那么下面所有的复选框都选中,去除选中第一个复选框,下面的都不选中 2:当点击全选按钮,上面足球.篮球.游泳.唱歌 全部选中 3:当点击全不选按钮,上面四个全部取消 ...

  6. 关于复选框input[type=checkbox]

    关于复选框input[type=checkbox],其实在前面的文章中说过一次,当时主要关注点在设置复选框的状态,利用prop实现,今天继续关注一下复选框. 自己在项目中,遇到一个全选/全不选的需求, ...

  7. DOM(十)使用DOM设置单选按钮、复选框、下拉菜单

    1.设置单选按钮 单选按钮在表单中即<input type="radio" />它是一组供用户选择的对象,但每次只能选一个.每一个都有checked属性,当一项选择为t ...

  8. 制作复选框(Toggle)

    怎样判断是否应当使用复选框 复选框,就是对一个选项做上一个标记,表示这个选项已经被选中了.在游戏中,复选框一般用来做一些选项的控制,这种选项一般都只有两种答案:是和否.例如,单击一下开启音乐的复选框, ...

  9. easyUI带复选框的组合树

    代码: <input id="depts"><script type="text/javascript">$(document).rea ...

  10. 功能代码(1)---通过Jquery来处理复选框

    实现以下功能: 1:选中第一个复选框,那么下面所有的复选框都选中,去除选中第一个复选框,下面的都不选中 2:当点击全选按钮,上面足球.篮球.游泳.唱歌 全部选中 3:当点击全不选按钮,上面四个全部取消 ...

随机推荐

  1. 【Uni-APP】02 FLEX 弹性布局

    新建一个项目: 注释所有内容: <template> <!-- <view class="content"> <image class=&quo ...

  2. 国产最好用的操作系统——deepin,为什么不适合生产环境

    前几天看了罗永浩的视频,他推荐了一本Intel创始人的书,看了这本书后想到书中大谈Intel和Microsoft的合作才创建下了今天的PC世界.看到这我就有些不爽了,现在美国各种控制和制裁我们的芯片, ...

  3. Singleton bean creation not allowed while singletons of this factory are in destruction

    1.背景 一直都是正常运行的程序,检查日志发现有一条报错如下: org.springframework.beans.factory.BeanCreationNotAllowedException: E ...

  4. 简化数据流:Apache SeaTunnel实现多表同步的高效指南

    Apache SeaTunnel除了单表之间的数据同步之外,也支持单表同步到多表,多表同步到单表,以及多表同步到多表,下面简单举例说明如何实现这些功能. 单表 to 单表 一个source,一个sin ...

  5. games101 作业1及作业2分析及解决

    games101 作业1及作业2分析及解决 去年的时候把games101的课程以及作业完成,但是整个过程比较粗略,也借助了不少外界的力量(doge),于是最近准备抽几天集中再把作业(1-7)过一遍,常 ...

  6. Headless靶机笔记

    Headless靶机 靶机概述 Headless 是一款简单易难的 Linux 机器,具有python实现的托管网站的服务器.基本思路: 通过端口探测到web页面,有一个表单. 利用忙注XSS,获得管 ...

  7. WPF 模拟UWP原生窗口样式——亚克力|云母材质、自定义标题栏样式、原生DWM动画 (附我封装好的类)

    先看一下最终效果,左图为使用亚克力材质并添加组合颜色的效果:右图为MicaAlt材质的效果.两者都自定义了标题栏并且最大限度地保留了DWM提供的原生窗口效果(最大化最小化.关闭出现的动画.窗口阴影.拖 ...

  8. Windows 查看当前登录用户名

    使用 PowerShell 输入 whoami,PowerShell 将以 hostname\username 的方式输出主机名和用户名: $ whoami hostname\username 使用 ...

  9. 【Python】Selenium自动化测试之动态识别验证码图片方法(附静态图片文字获取)

    目录 一.前提 二.获取验证码 三.获取4位验证码 四.判断验证码是否正确 五.输入验证码登录 六.登录页面类 七.完整的获取验证码类代码 八.附录:静态图片文字提取 一.前提 返回目录 经常会遇到登 ...

  10. C++性能优化——能用array就不要用unordered_map作为查询表

    unordered_map需要哈希值计算和表查询的开销,当key值为整数且连续,直接用数组作为查询表具有更高的效率. #include <iostream> #include <ch ...