vxe-table合并单元格后增加选中效果

<vxe-table
      :data="retrievalList"
      :row-class-name="setRowClass"
       @cell-click="selectRow">
     <vxe-column field="name" title="姓名"></vxe-column>
</vxe-table>

后端返回的JSON格式 (合并单元格需要对数据处理后,通过setMergeCells合并)
在这里插入图片描述
注:

相关单元格全部选中

效果图:
在这里插入图片描述

 data() {
    return {
    	sourceList: [],  //  后端返回的JSON数据
        retrievalList: [],  //  格式化后的数据 [{},{},{}]
    }
 },
 methods: {
	//  设置已选中的单元格类名
    setRowClass({row}) {
      //  patId为JSON外层唯一主键,选中后根据主键动态设置类
      if (row.patId === this.currentRow.patId) {
        return 'current-pat';
      }
    },
    //  单击选中
    selectRow({row}) {
      //  获取当前合并的单元格整体信息,此处为多条数据的集合
      this.currentRow = this.sourceList.find(item => item.patId === row.patId);
    }
 }
//  scss
.vxe-table {
      .current-pat, .current-pat > td {
        background-color: #CBECFC !important;
      }
}

所选单元格整体增加背景色,但仅选中单元格特殊标识

在这里插入图片描述
注 :
(1)第一列被合并单元格选中样式默认跟随合并后的第一行。
(2)可自行变形,使首列单元格底色与单项选中的单元格一致。
(3)此处存在个BUG,首次点击单元格时未出现选中效果;由于已选择第一种方案,此处未深究,仅做记录。

 data() {
    return {
    	sourceList: [],  //  后端返回的JSON数据
        retrievalList: [],  //  格式化后的数据 [{},{},{}]
    }
 },
 methods: {
	//  设置行类名
    setRowClass({row}) {
      if (row.itemId === this.firstItemId) {
      	//  itemId为JSON内层nurseOptPatVoList内唯一主键,用于设置被合并列单元格底色
        return 'current-first'
      } else if (row.patId === this.currentRow.patId) {
        //  patId为JSON外层唯一主键,选中后根据主键动态设置类
        return 'current-pat'
      }
    },
    //  单击选中
    selectRow({row}) {
      //  获取当前合并的单元格整体信息,此处为多条数据的集合
      this.currentRow = this.sourceList.find(item => item.patId === row.patId);
      //  获取当前合并的单元格首条信息
      let firstItem = this.retrievalList.find(item => item.patId === row.patId);
      this.firstItemId = firstItem.itemId;
    }
.vxe-table {
      .current-pat {
        background-color: #f00;
      }

      .current-first {
        // 此处不使用important是为了避免背景与选中效果冲突
        background-color: #f00; 

        & > .vxe-body--column:first-child {
          background-color: #f00 !important;
        }
      }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
vxe-table 是一个基于 Vue.js 的表格组件库,它提供了丰富的功能和灵活的配置选项,其中包括点击单元格弹窗显示在单元格附近的功能。 实现这个功能的方式是通过使用 vxe-table 提供的 slot 和 API。具体来说,可以在表格的 column 中定义一个 slot,然后在 slot 中使用 vxe-table 提供的 API 来实现弹窗的显示和定位。 以下是一个示例代码: ``` <template> <vxe-table :data="tableData"> <vxe-table-column type="index" width="60"></vxe-table-column> <vxe-table-column field="name" title="姓名"></vxe-table-column> <<vxe-table-column field="age" title="年龄"> <template #default="{ row, column }"> <div @click="showPopover(row, column)"> {{ row.age }} </div> </template> </vxe-table-column> </vxe-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18 }, { name: '李四', age: 22 }, { name: '王五', age: 30 } ], popoverVisible: false, popoverContent: '', popoverPosition: { top: 0, left: 0 } } }, methods: { showPopover(row, column) { // 获取单元格位置信息 const cell = this.$refs.table.getCell(row, column); const { top, left, height, width } = cell.getBoundingClientRect(); // 设置弹窗位置 this.popoverPosition = { top: top + height, left }; // 显示弹窗 this.popoverContent = `姓名:${row.name},年龄:${row.age}`; this.popoverVisible = true; } } } </script> ``` 在上面的代码中,我们在 age 列中定义了一个 slot,用来显示单元格内容,并且绑定了 click 事件。当用户点击单元格时,我们会调用 showPopover 方法来显示弹窗。 在 showPopover 方法中,我们首先获取单元格的位置信息,然后根据位置信息设置弹窗的位置。最后,我们将弹窗内容设置为当前单元格的姓名和年龄,并将弹窗显示出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值