vue+element-ui树形表多选,支持多层级联动

在这里插入图片描述

添加@select=“rowSelect” @select-all=“selectAll”

<el-table
        :data="tableData"
        ref="tableRef"
        style="width: 100%;margin-bottom: 20px;"
        row-key="id"
        border
        default-expand-all
        select-on-indeterminate
        @select="rowSelect"
        @select-all="selectAll"
        :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="id" label="ID" width="180" align="center"></el-table-column>
        <el-table-column prop="distribution" label="订餐点" width="180" align="center"></el-table-column>
        <el-table-column prop="level" label="层级" align="center" width="120"> </el-table-column>
        <el-table-column prop="user" label="关联用户" align="center" width="160"> </el-table-column>
        <el-table-column prop="address" label="地址说明" align="center"> </el-table-column>
        <el-table-column prop="date" label="创建时间" align="center" width="200"> </el-table-column>
        <el-table-column fixed="right" label="操作" align="center">
          <template>
            <el-button type="text" size="small" @click="openCodeDialog">查看二维码</el-button>
            <el-button type="text" size="small" @click="to_modify_distribution">编辑</el-button>
            <el-button type="text" size="small" @click="openAddNextDialog">新增下级</el-button>
            <el-button type="text" size="small" class="delete-txt-btn" >删除</el-button>
          </template>
        </el-table-column>
      </el-table>

1.遍历数据加上select字段,判断是否被选中
2.点击每一个节点数据的时候,去判断是否有子节点,有的话操作子节点(全选or全取消)
3.然后判断是否有父节点,如果有,拿到父节点,再去对父节点进行操作
我定义的规则(可根据需求重新自定义):
当所有节点都被选中,父节点打勾,兄弟节点只要有一个节点没打勾,父节点要取消打勾

  import Vue from 'vue'
  export default {
    data() {
      return {
        tableData: [{
          id: 1,
          distribution: "一楼",
          level: "1",
          user: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄',
          date: '2016-05-02',
        }, {
          id: 2,
          distribution: "一楼",
          level: "1",
          user: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄',
          date: '2016-05-02',
          children: [{
            id: 21,
            distribution: "一楼",
            level: "1",
            user: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄',
            date: '2016-05-02',
          }, {
            id: 22,
            distribution: "一楼",
            level: "1",
            user: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄',
            date: '2016-05-02',
            children: [{
            id: 221,
            distribution: "一楼",
            level: "1",
            user: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄',
            date: '2016-05-02',
            }, {
              id: 222,
              distribution: "一楼",
              level: "1",
              user: '王小虎',
              address: '上海市普陀区金沙江路 1518 弄',
              date: '2016-05-02',
              children: [{
              id: 2221,
              distribution: "一楼",
              level: "1",
              user: '王小虎',
              address: '上海市普陀区金沙江路 1518 弄',
              date: '2016-05-02',
              }]
            }]
          }]
        },
        selectFlag: false,
      }
    },
    methods: {
      toggleSelection(rows, flag) {
        if (rows) {
          rows.forEach(row => {
            this.$refs.tableRef.toggleRowSelection(row, flag);
            if(row.children){
              this.toggleSelection(row.children, flag);
            }
          });
        }
      },
      rowSelect(selection,row){
        // 全选 or 取消全选
        if(selection.indexOf(row)>-1){
          this.toggleSelection(row.children, true);
          row.select=true
          if(row.children){
            this.addSelect(row.children,true)
          }
        }else if(selection.indexOf(row)==-1){
          this.toggleSelection(row.children, false);
          row.select=false
          if(row.children){
            this.addSelect(row.children,false)
          }
        }
        this.getParent(this.tableData,row)
      },
      // 获取父节点并操作
      // 当所有子节点取消选中,父节点也要取消选中;当所有子节点已选中,父节点也要相应选中
      getParent(data,row){
        data.forEach((item) => {
          //判断该行是否有子节点
          if (item.children) {
            //遍历子节点
            item.children.forEach((item2) => {
              //判断该节点是否为我点击的节点
              if (item2.id == row.id) {
                // 去遍历被点击节点的父节点
                if(item.children){
                  let rowParentFlag = true;
                  item.children.forEach((i) => {
                    rowParentFlag=i.select && rowParentFlag
                  })
                  // 当所有节点都被选中,父节点打勾
                  if(rowParentFlag){
                    this.$refs.tableRef.toggleRowSelection(item, true);
                    item.select=true
                    // 获取父节点的父节点进行判断
                    this.getParent(this.tableData,item)
                  }else{
                    // 兄弟节点只要有一个节点没打勾,父节点都要取消打勾
                    this.$refs.tableRef.toggleRowSelection(item, false);
                    item.select=false
                    // 获取父节点的父节点进行判断
                    this.getParent(this.tableData,item)
                  }
                }
              }else if(item.children){
                this.getParent(item.children,row)
              }
            });
          }
        });
      },
      selectAll(selection){
        if(!this.selectFlag){
          this.toggleSelection(selection, true);
          this.addSelect(this.tableData,true)
        }else{
          this.$refs.tableRef.clearSelection();
          this.addSelect(this.tableData,false)
        }
        this.selectFlag=!this.selectFlag
      },
      // 树形表多选,添加select字段区分当前行是否被选中
      // 为了:当所有子节点取消选中,父节点也要取消选中;当所有子节点已选中,父节点也要相应选中
      // element文档貌似没相关操作
      addSelect(data,flag){
        data.forEach((item,index)=>{
            Vue.set(item,'select',flag);
            if(data[index].children){
              this.addSelect(data[index].children,flag)
            }
        })
      }
    },
    created(){
      this.addSelect(this.tableData,false)
    }
  }
  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于多选的Table数据回显,可以使用Vue中的v-model来实现。你可以在data中定义一个选中的数组,然后在Table中使用v-model绑定这个数组,这样就可以实现多选数据回显了。 例如: ```html <template> <div> <el-table :data="tableData" :row-key="row => row.id" v-loading="loading" v-model="selectedItems"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> </el-table> </div> </template> <script> export default { data() { return { loading: false, tableData: [ { id: 1, name: 'John', age: 18 }, { id: 2, name: 'Jane', age: 22 }, { id: 3, name: 'Tom', age: 20 }, ], selectedItems: [], }; }, }; </script> ``` 对于多页选择数据回显,可以在Table中使用selection-change事件来监听选中数据的变化,然后在翻页时将选中数据保存在一个数组中。例如: ```html <template> <div> <el-table :data="tableData" :row-key="row => row.id" v-loading="loading" v-model="selectedItems" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> </el-table> <el-pagination :current-page="currentPage" :page-size="pageSize" :total="total" @current-change="handlePageChange"> </el-pagination> </div> </template> <script> export default { data() { return { loading: false, tableData: [], selectedItems: [], currentPage: 1, pageSize: 10, total: 0, selectionList: [], }; }, methods: { handleSelectionChange(selection) { this.selectionList[this.currentPage] = selection; }, handlePageChange(page) { this.currentPage = page; if (!this.selectionList[page]) { this.selectionList[page] = []; } this.selectedItems = this.selectionList[page]; }, }, }; </script> ``` 这样就可以实现多页选择数据回显,并且分页记录保存选中的数据了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值