实现el-table 两列多选框且不可同时勾选,可单选,可多选

1.页面实现效果:

审核通过可批量处理,可单选;审核不通过,单选,但两者不可同时勾选☑️

2.代码如下

html 复制代码
<template lang="pug">
.financing-order-tab
  .table-container
    .btns(style="margin-bottom: 15px")
        el-button(type="primary" size="mini", @click="handleCheck") 批量初审
        el-button(type="primary" size="mini", @click="handleReview") 批量复审
    el-table.no-wrap-cell(:data="tableData",ref="multipleTable",style="width: 100%", size="small" show-summary, :summary-method="getSummaries",@selection-change="handleSelectionChange",:row-key="getRowKey")
      el-table-column(fixed="left", label="审核通过",width="60",align="center")
        el-table-column(fixed="left",type="selection",align="center", width="60", :selectable="disableSelect")
      el-table-column(fixed="left", label="审核不通过",width="60",align="center",:render-header="renderCustomHeader")
        template(slot-scope="scope")
          el-checkbox(:disabled="disableRow(scope.row)",v-model="scope.row.isChecked",@change="handleSecondColumnCheckboxChange(scope.$index, scope.row)")
      el-table-column(prop="projectCode", label="项目编号", width="180")
      el-table-column(prop="orgName", label="服务商", width="180")
      el-table-column(prop="stationDetailAddress", label="预约安装详细地址", width="180")
      el-table-column(prop="realCapacity", label="装机容量(W)", width="100")
        template(slot-scope="{row}") {{row.realCapacity}}
</template>

<script>

export default {
  data() {
    return {
      tableData: [],  
      passList: [],
      rejectList: [],
      firstColumnSelection: [], // 第一列选中项
      secondColumnSelection: new Set(), // 使用Set来存储第二列选中项的索引,方便去重
      customSelections: [], // 第二列自定义选中项
      loading: false,
    }
  },

  created() {
  },
  methods: {
    getRowKey(row) {
      return row.id // 假设每行数据都有唯一的 'id' 字段
    },

    handleSelectionChange (rows) {
      this.firstColumnSelection = rows
      rows.map(item => this.tableData.indexOf(item)).forEach(el => {
        Array.from(this.secondColumnSelection).length && Array.from(this.secondColumnSelection).forEach(ele => {
          if (el === ele) {
            // 当选中第一列的时候,自动取消第二列对应行的选中状态
            this.$set(this.tableData[el], 'isChecked', false)
            this.secondColumnSelection.delete(ele)
            this.customSelections = this.tableData.filter((row, index) => this.secondColumnSelection.has(index))
          }
        })
      })
    },

    disableSelect(row) {
      return row.loanAuditStatus === 'WAIT_AUDIT' || row.loanAuditStatus === 'WAIT_REVIEW'
    },
    disableRow(row) {
      if (row.loanAuditStatus === 'WAIT_AUDIT' || row.loanAuditStatus === 'WAIT_REVIEW') {
        return false
      } else {
        return true
      }
    },

    handleSecondColumnCheckboxChange(index, row) {
      // 切换第二列的选中状态
      if (this.secondColumnSelection.has(index)) {
        this.secondColumnSelection.delete(index)
      } else {
        this.secondColumnSelection.add(index)
      }
      // 当第二列选中项变化时,自动取消第一列对应行的选中状态
      if (this.secondColumnSelection.has(index)) {
        const rowIndex = this.tableData.findIndex(row => this.tableData.indexOf(row) === index)
        this.$refs.multipleTable.toggleRowSelection(this.tableData[rowIndex], false)
      }
      this.customSelections = this.tableData.filter((row, index) => this.secondColumnSelection.has(index))
    },

    renderCustomHeader(h, { column, $index }) {
      return h('span', '审核不通过')
    }
  }
}
</script>

<style lang="scss" scoped>
.filter-form::v-deep{
  .el-input--mini{
    width: 175px;
  }
}
.table-container {
  margin-top: 20px;
  .el-pagination {
    margin-top: 20px;
    text-align: center;
  }
}
</style>
相关推荐
竹林8183 小时前
用Viem替代ethers.js:从一次签名失败到完整迁移的实战记录
前端·javascript
之歆3 小时前
DAY08_CSS浮动与行内块布局实战指南(上)
前端·css
light blue bird3 小时前
主子端台二分法任务汇总组件
前端·数据库·.net·桌面端winform
不可能的是4 小时前
Claude Code 子 Agent 机制全解:怎么跑起来、怎么被管理、怎么互不干扰
javascript
jeffwang4 小时前
我做了个让 AI 看屏幕跑测试的工具,因为 Playwright 测不了我的 Flutter Web
前端
HSunR5 小时前
dify 搭建ai作业批改流
开发语言·前端·javascript
代码不加糖5 小时前
2026 跨境电商独立站实战:从 0 到 1 搭建高转化 SaaS 商城(附源码)
开发语言·前端·javascript
亲亲小宝宝鸭5 小时前
拖一拖控件,拖出个问卷(低代码平台)
前端·低代码
江南十四行5 小时前
ReAct Agent 基本理论与项目实战(一)
前端·react.js·前端框架
We་ct6 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·leetcode·typescript·动态规划