vxe-table多选表格设置父子树形结构不关联并实现全选

vxe-table树形结构通过checkStrictly:true 设置父子节点不互相关联,默认不显示头部复选框

如果需要显示头部复选框需要设置showHeader:true

设置checkStrictly为true的时候全选功能是没法使用的,需要我们手动写一个表头的复选框

treeCheckBox默认设置为false,表示复选框未被选中状态

treeCheckBox默认设置为null,表示有子项选中

treeCheckBox默认设置为true,表示全部选中

 <vxe-table-column
        type="checkbox"
        :width="80"
        fixed="left"
        :tree-node="true"
        field="treeNode"
      >
        <!-- checkbox不联动的时候设置全选按钮,vxe-table不联动全选不能使用 -->
        <template #header>
          <vxe-checkbox
            v-model="treeCheckBox"
            :indeterminate="treeCheckBox == null"
            @change="treeCheckBoxChange"
          ></vxe-checkbox>
        </template>
      </vxe-table-column>

 重写全选框,全选框的状态也需要自动实现,重写全选框后@checkbox-all无法使用,使用@checkbox-change实现全选框的显示状态

selectChangeEvent({records}) {
        if (records.length >= this.tableData.length) {
          this.treeCheckBox = true
        } else if (records.length > 0) {
          this.treeCheckBox = null
        } else {
          this.treeCheckBox = false
        }
      }
    },

checkStrictly:true的情况下,setAllCheckboxRow无法使用,只能使用setCheckboxRow方法,全选涉及到子行无法选中,又进行了遍历实现子行选中

// 设置手动全选
    treeCheckBoxChange({ checked }) {
      if (checked) {
        this.$refs.xTable.setCheckboxRow(this.tableData, true);
        this.setAllCheckboxRow(this.tableData, true);
      } else {
        this.$refs.xTable.clearCheckboxRow()
      }
      this.selectRecords = this.tableData;
    },
    // 处理子结构的全选
    setAllCheckboxRow(nodes, checked) {
      nodes.forEach(node => {
        node.checked = checked;
        if (node.children && node.children.length > 0) {
          this.$refs.xTable.setCheckboxRow(node.children, true)
        }
      });
    },

整体相关逻辑如下: 

<template>
  <div>
    <vxe-table
      ref="xTable"
      :data="tableData"
      row-key
      column-key
      show-overflow
      show-header-overflow
      size="mini"
      highlight-hover-row
      :height="heightSize"
      row-id="rowId"
      auto-resize
      keep-source
      type="checkbox"
      :checkbox-config="{ checkStrictly: true, showHeader: true }"
      :tree-config="{ childrenField: 'children', indent: 10 }"
      @checkbox-change="selectChangeEvent"
    >
      <vxe-table-column
        type="checkbox"
        :width="80"
        fixed="left"
        :tree-node="true"
        field="treeNode"
      >
        <!-- checkbox不联动的时候设置全选按钮,vxe-table不联动全选不能使用 -->
        <template #header>
          <vxe-checkbox
            v-model="treeCheckBox"
            :indeterminate="treeCheckBox == null"
            @change="treeCheckBoxChange"
          ></vxe-checkbox>
        </template>
      </vxe-table-column>

      <vxe-table-column> ..... </vxe-table-column>
    </vxe-table>
  </div>
</template>

<script>
export default {
  name: 'Untitled-1',
  props: {},
  components: {},
  data() {
    return {
      tableData: [{
        id:1,
        name:1,
        children:[{
          id:1,
          name:1
        }]
      }]
    }
  },
  computed: {},
  watch: {},
  created() {},
  mounted() {},
  methods: {
    // 设置手动全选
    treeCheckBoxChange({ checked }) {
      if (checked) {
        this.$refs.xTable.setCheckboxRow(this.tableData, true);
        this.setAllCheckboxRow(this.tableData, true);
      } else {
        this.$refs.xTable.clearCheckboxRow()
      }
      this.selectRecords = this.tableData;
    },
    // 处理子结构的全选
    setAllCheckboxRow(nodes, checked) {
      nodes.forEach(node => {
        node.checked = checked;
        if (node.children && node.children.length > 0) {
          this.$refs.xTable.setCheckboxRow(node.children, true)
        }
      });
    },
    // 设置全选框的状态
    selectChangeEvent({records}) {
        if (records.length >= this.tableData.length) {
          this.treeCheckBox = true
        } else if (records.length > 0) {
          this.treeCheckBox = null
        } else {
          this.treeCheckBox = false
        }
      }
    },
  },
}
</script>

<style scoped></style>

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值