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:当点击全不选按钮,上面四个全部取消 ... 
随机推荐
- 浪潮计算平台之AI方向——AI_Station开发环境的使用总结
			概览: 1. 开发环境 使用默认的设置,不改挂载路径: 可以看到在容器内对挂载的目录进行文件操作是可以真实记录到实际的文件目录内的. 对挂载路径的另一种设置: 不使用默认的设置,手动更改挂载路径: ... 
- Ubuntu Server无桌面无显示器情况下虚拟屏幕xvfb的安装及设置—ubuntu18.04server服务器系统下为python安装虚拟显示器  (使用jupyter notebook在web端播放openai的gym下保存的运行视频——需安装ipython)
			1. 安装xvfb sudo apt-get install xvfb Xvfb是流行的虚拟现实库,可以使很多需要图形界面的程序虚拟运行. 2. 安装pyvirtualdisplay pyvirtu ... 
- [BJOI2016] IP地址 题解
			前言 来个不一样的做法,用到了 Trie 树和主席树,并且是可爱的在线算法. 题目链接:洛谷. 题目分析 对于一个查询 \(\texttt{ip}\),只考虑所有前缀字符串规则.以时间建里横轴,匹配长 ... 
- JavaScript中的包装类型详解
			JavaScript中的包装类型详解 在 JavaScript 中,我们有基本类型和对象类型两种数据类型. 基本类型包括 String,Number,Boolean,null,undefined 和 ... 
- 树莓派CM4(一): 镜像烧录
			1. 简介 树莓派型号Raspberry Pi CM4 EMMC, 注意是EMMC版本,不是SD卡版本 核心板资源 IO板使用官方IO板Compute module 4 IO Board, 硬件规格 ... 
- 2. 从0开始学ARM-CPU原理,基于ARM的SOC讲解
			关于ARM的一些基本概念,大家可以参考我之前的文章: <到底什么是Cortex.ARMv8.arm架构.ARM指令集.soc?一文帮你梳理基础概念[科普]> 关于ARM指令用到的IDE开发 ... 
- Ubuntu20.04安装CUDA和CUDNN
			CUDA是GPU深度学习的运行库,那么cuDNN就是训练加速工具,两者要相互配合使用,所以一般机器学习需要训练引擎(tensorflow-gpu) + CUDA + cuDNN使用.想不安装cuDNN ... 
- CentOs7.3 配置基本信息查看
			1.基本信息查看(命令行) [root@localhost home]# CPU个数: [root@localhost home]# grep 'physical id' /proc/cpuinfo ... 
- Element ui  动态自定义表格单元格样式
			最终实现效果 在Element UI 的文档中提到了用cell-style 方法来自定义单元格样式: 具体使用方法: 1. 在el-table 标签中添加 cell-style 绑定的自定义方法 2. ... 
- LaTeX 编译警告:Script 'CJK' not explicitly supported within font 'FandolSong-Regular'. Check the typeset output, and if it is okay then ignore this warning. Otherwise a different font should be chosen.
			在编译一篇中文文档时遇到如下警告: Package fontspec Warning: Script 'CJK' not explicitly supported within font 'Fando ... 
