vue+element-ui树形表格+复选框(实现复选框的各种效果)

news/2024/7/10 2:29:15 标签: vue, checkbox, js, javascript, es6

需求

项目的需求是给角色分配菜单,菜单会有子集,所以后台反给我的是带children的树形数据,但是添加的时候可能是一次性选很多的菜单,多选就不能直接用elemengt自带的多选,所以用了表格树形和复选框的组合,复选框用了插槽,完成了一些列的逻辑

代码块

表格部分

视图层
table中加入树形 :tree-props="{children: 'children'}"
插入两个复选框,一个是表头的,一个是表身<el-checkbox>绑定对应的v-model,还有对应的事件,后边写对应的逻辑

<el-dialog title="菜单分配" append-to-body center show-close :visible.sync="dialogMenuVisible" @open="handleOpening" @close="handleClosing">
      <el-table
        ref="multipleTable"
        :data="menuData"
        style="width: 100%;margin-bottom: 20px;"
        row-key="id"
        border
        :tree-props="{children: 'children'}"
      >
        <el-table-column width="105">
          <template slot="header" slot-scope="scope">
            <span>全选</span>
            <el-checkbox v-model="checkouts" style="padding-left:10px" @change="checkAllIn(scope)" />
          </template>
          <template slot-scope="scope">
            <el-checkbox v-model="scope.row.checks" style="padding-left:10px" @change="checkChange(scope.row)" />
          </template>
        </el-table-column>
        <el-table-column
          align="left"
          prop="menuName"
          label="菜单名称"
          min-width="180"
          :show-overflow-tooltip="isshow" />
        <el-table-column
          align="left"
          prop="menuCode"
          label="菜单编码"
          min-width="240" />
      </el-table>
      <el-row type="flex" justify="center">
        <el-button type="primary" @click="menuSubmit">提交</el-button>
        <el-button type="primary" @click="resetSubmit">取消</el-button>
      </el-row>
    </el-dialog>

逻辑层

1.点击全选,列表的父节点子节点全部选中

因为是树形,所以遍历完父节点再遍历子节点(个人认为循环套循环不好,有更好方法请大神指教!!!)
v-model:checkouts默认选中状态在data中声明false即可
checkouts: false,

javascript">//this.$refs.multipleTable.data是使用$ref获取注册的子组件信息,用data获取所有行,并用map函数遍历行
//使用$set的原因,是因为数组通过下标改变视图层不改变
// 总全选
    checkAllIn() {
      console.log(this.checkouts);
      this.$refs.multipleTable.data.map((items) => {
        console.log(items);
        this.$set(items, "checks", this.checkouts)
        if (items.children) {
          items.children.forEach((item) => {
            this.$set(item, "checks", this.checkouts)
          })
        }
      });
    },

2.第二个插槽复选框逻辑

1.列表父节点点击,其对应子节点选中
checkchange是上边绑定事件判断当前改变后的值是true还是flase
2.子带父,点击子集复选框被点中true☑️,对应的父级也会变为true
menuData是我掉菜单接口获取了平铺的树形结构后赋值给menudata这个数组,遍历这个数字,判断子父的联系,比如我这里是孩子的parentId和父元素的id是一样的,且父元素的parentid是“0”所以就这样判断的他们的关联
3.子空父空,当点击父元素其变为true时,子元素全部变为true,这时当把该父元素下所有子集点位false时,父元素变为false
思路是把其子元素放在一个空数组里,判断数组的长度是否等于零,如果等于

javascript">checkChange(row) {
      console.log(row);
      // 父选子
      if (row.children) {
        if (row.checks) {
          console.log("panduanxuanzhong");
          row.children.map((item) => {
            this.$set(item, "checks", true)
          });
          this.$set(row, "checks", true)
        } else {
          console.log("未选中");
          row.children.map((item) => {
            this.$set(item, "checks", false)
          });
          this.$set(row, "checks", false)
        }
      }
      // 子带父
      if (row.checks) {
        this.menuData.map(items => {
        // console.log(item.parentId);
          if (row.parentId === items.id && items.parentId === "0") {
            this.$set(items, "checks", true)
          }
        })
        return
      }
      // 子空父空
      const son = []
      if (!row.checks && row.parentId !== 0) {
        this.menuData.map(ite => {
          if (ite.children) {
            ite.children.map(items => {
              if (items.parentId === row.parentId && items.checks) {
                son.push(items)
              }
            })
          }
        })
      }
      if (son.length === 0) {
        this.menuData.map(item => {
          if (item.id === row.parentId) {
            this.$set(item, "checks", false)
          }
        })
      }
      console.log(son);
    },

实现图如下
在这里插入图片描述

如有不对之处!!!欢迎大家指正!!!!!


http://www.niftyadmin.cn/n/734446.html

相关文章

(-)PXE技术篇--DHCP服务器的搭建

DHCP服务器指的是由服务器控制一段IP地址范围&#xff0c;客户端登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。其它的请自行百度 测试环境&#xff1a;VMware Workstation Pro 把DHCP的默认端口号是67/68放行&#xff0c;我这里是直接把防火墙直接关闭。 为了验证…

vue表格中序号生成

表格序号问题 记录一下&#xff0c;表格插入序号 <el-table-columnalign"center"label"序号"width"70px"><template slot-scope"scopes">{{ scopes.$index1 }}</template></el-table-column>

常见时间转换

时间转换(字符串转换为年月日) 拼一下即可 //时间戳转日期格式 function timestampToTime(timestamp) {var date new Date(timestamp);//时间戳为10位需*1000&#xff0c;时间戳为13位的话不需乘1000Y date.getFullYear() -;M (date.getMonth()1 < 10 ? 0(date.getM…

hibernate中的schema

将数据库从SqlServer换为MySQL之后,运行项目报错: 还有一个sql error的错误, 原因是因为hibernate配置文件中的schema属性 把这个属性去掉就不再报错了. 我个人理解 原因就是在MySQL中创建一个Schema和创建一个Database的效果是一样的&#xff0c;但是在sqlserver和oracle数据库…

防止图片缓存,更新图片页面不更新问题

页面缓存问题 最近做了一个简单的jq项目&#xff0c;每天需要手动更新美工做的图片&#xff0c;当时想到缓存问题&#xff0c;想着和美工一起把图片的名字每天一换应该就不会有缓存问题了&#xff0c;可是现实去给我深深的教训&#xff0c;投入生产后仍是出现了页面不更新的情…

react-native-storage(数据存储)文档介绍

2019独角兽企业重金招聘Python工程师标准>>> 中文doc:仅供参考 import Storage from react-native-storage; import {AsyncStorage} from react-native; var storage new Storage({// 最大容量&#xff0c;默认值1000条数据循环存储size: 1000,// 存储引擎&#xf…

小程序踩坑!!!iphone时间问题!

new Date(“2021-08-16 15:41:06”) 在IOS会出现NAN的情况&#xff0c;必须改为new Date(“2021/08/16 15:41:06”) 才能兼容&#xff1b; 使用replace(/-/g,’/’))&#xff0c;转一下即可&#xff01;

网站快照被篡改劫持怎么办

最近很多公司的网站快照被劫持跳转到了bo彩、cai票网站上去&#xff0c;客户从百度点击进去会跳转&#xff0c;直接输入网站的域名不会跳转&#xff0c;网站快照也被劫持成bo彩的内容&#xff0c;site查看网站在百度的收录也出现问题&#xff0c;收录了很多cai票内容&#xff0…