vue3实现element 表格合并行,并修改hover样式

本文介绍如何在ElementPlus表格中实现鼠标移入时动态合并行并高亮显示。通过`span-method`属性结合`rowClassName`监听`cell-mouse-enter`和`cell-mouse-leave`事件,实现行合并及颜色变化。关键步骤包括数据处理以添加order标识,以及创建鼠标移入事件来更新高亮数据。
摘要由CSDN通过智能技术生成

查询element plus官网,当鼠标移入时,只会显示合并的第一行

 想要的效果如下:

 

 

 利用饿了么UI 自带合并行/合并列计算方法 span-method

<el-table
      v-loading="listLoading"
      border
      :data="list"
      height="670"
      :row-class-name="rowClassName"
      :span-method="objectSpanMethod"
      @cell-mouse-enter="enter"
      @cell-mouse-leave="leave"
    >
只需要在state中新建一个
resultData: [], //用于hover改变颜色的数组

 需要合并第几列,将 columnIndex === ‘几’,注意:列是从0开始计算

 // 合并相同行 row行 column列 rowIndex 行号 columnIndex 列号
      const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
        const dataProvider = state.list
        const cellValue = row[column.property]
        if (cellValue && columnIndex === 2) {
          // 上一条数据
          const prevRow = dataProvider[rowIndex - 1]
          // 下一条数据
          let nextRow = dataProvider[rowIndex + 1]
          // 当上一条数据等于下一条数据
          if (prevRow && prevRow[column.property] === cellValue) {
            return { rowspan: 0, colspan: 0 }
          } else {
            let rowspan = 1
            while (nextRow && nextRow[column.property] === cellValue) {
              rowspan++
              nextRow = dataProvider[rowspan + rowIndex]
            }
            if (rowspan > 1) {
              return { rowspan, colspan: 1 }
            }
          }
        }
      }

对表格数据进行处理,添加一个order标识,将合并的数据,归为一组,

思路:将表格中第一个数据,添加order为1,如果当前数据和前一个数据中的title(看你合并的数据,如果是id,或者其他,则把title改为你合并的数据)相同,则将其归为一类,并将前一个数据order值赋值给当前数据,如果不同,则将这个数据order值+1,然后累加order

const handleData = () => {
        var order = 1
        let data = state.list
        for (let i = 0; i < data.length; i++) {
          if (i == 0) {
            data[i].order = order
            // 第一个数组
          } else {
            if (data[i]['title'] == data[i - 1]['title']) {
              // 此处是给相同的数据加相同order,具体判断条件可根据自己数据进行判断
              data[i]['order'] = data[i - 1]['order']
            } else {
              data[i]['order'] = order + 1
              order++
            }
          }
        }
        // console.log(state.list)
      }

在表格数据返回后调用 handleData方法

const getList = async () => {
        const {
          data: { list, total },
        } = await getinventoryList(state.queryForm)
        state.list = list
        handleData()
      }

创建一个鼠标移入事件

const enter = (row) => {
        // 表格的所有数据
        var table = state.list
        let result = table.filter((item) => {
        //返回鼠标移入的order值和table表格中所有数据的相匹配的数据
          return item.order == row.order
        })
        //state中新建一个resultData ,用来存储,需要改变颜色的数组
        state.resultData = result
      }

给相应的rowIndex添加类名

const rowClassName = ({ row, rowIndex }) => {
        let r = -1
        let d = -2
        state.resultData.forEach((item) => {
          if (item.order === row.order) {
            r = rowIndex
          }
        })
        if (rowIndex === r) {
          return 'hover-row'
        } else if (rowIndex === d) {
          return 'current-row'
        }
      }
//鼠标划出 清空样式
      const leave = () => {
        state.resultData = []
      }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值