vue3中el-table实现多表头并表格合并行或列

16 篇文章 1 订阅
本文详细描述了如何在Vue的el-table组件中使用`span-method`属性实现自定义列合并功能,如性别列在特定条件下的跨行跨列显示,以及JavaScript函数`genderSpanCity`的具体实现过程。
摘要由CSDN通过智能技术生成
1、el-table中添加事件 :span-method="genderSpanCity"
<el-table :span-method="genderSpanCity"
              :data="data.tableData"
              :fit="true" table-layout="fixed" header-align="center" stripe
              style="width:100%;height: 96%;"
              :cell-style="{borderColor:'#aaa'}"
              :header-cell-style="{color:'#000',textAlign:'center',borderColor:' #CCC',background:'#f9f9f9',height:'50px'}"
              v-else>
      <el-table-column :label="$t('wms.dailyProduct')" align="center" height="70px">
        <el-table-column>
          <el-table-column prop="process" :label="$t('mes.workingProcedure')" width="100" align="center"/>
          <el-table-column prop="item" width="130"/>
          <el-table-column prop="item2" width="150"/>
        </el-table-column>
        <!--二级标题日期-->
        <el-table-column v-for="(name,index) in data.title" :key="name" :label="name" align="center">
          <!-- 三级标题-->
          <el-table-column v-for="column in data.tableColumns" :key="column.prop"
                           :prop="column.prop"
                           :label="column.label" align="center">
            <template #default="scope">
              {{ scope.row.custom.length > 0 ? scope.row.custom[index][column.prop] : scope.row.custom[column.prop] }}
            </template>
          </el-table-column>
        </el-table-column>
      </el-table-column>
    </el-table>
2、js添加函数
// 合并列
const genderSpanCity = ({
  row,
  column,
  rowIndex,
  columnIndex
}) => {
  // 合并前4行的2列与3列
  for (let i = 0; i < 13; i++) {
    if (columnIndex === 1 && rowIndex === i) {
      return {
        rowspan: 1,
        colspan: 2
      }
    } else if (columnIndex === 2 && rowIndex === i) {
      return {
        rowspan: 0,
        colspan: 0
      }
    }
  }

  // 合并第4行以后的数据
  for (let i = 4; i < data.tableData.length; i++) {
    if (columnIndex > 3 && columnIndex % 2 === 0 && rowIndex === i) {
      return [1, 3]
    } else if (columnIndex >= 3 && columnIndex % 2 === 1 && rowIndex === i) {
      return [0, 0]
    }
  }
  // 合并前两列的数据
  if (columnIndex === 0 || columnIndex === 1) {
    // 获取当前单元格的值
    const currentValue = row[column.property]
    // 获取上一行相同列的值
    const preRow = data.tableData[rowIndex - 1]
    const preValue = preRow ? preRow[column.property] : null
    // 如果当前值和上一行的值相同,则将当前单元格隐藏
    if (currentValue === preValue) {
      return {
        rowspan: 0,
        colspan: 0
      }
    } else {
      // 否则计算当前单元格应该跨越多少行
      let rowspan = 1
      for (let i = rowIndex + 1; i < data.tableData.length; i++) {
        const nextRow = data.tableData[i]
        const nextValue = nextRow[column.property]
        if (nextValue === currentValue) {
          rowspan++
        } else {
          break
        }
      }
      return {
        rowspan,
        colspan: 1
      }
    }
  }
}
效果图为
  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue3 ,可以使用 `v-slot` 和 `@click` 指令来实现点击表头修改表格数据的功能。 首先,在 `<el-table>` 标签添加 `@header-click` 监听器来捕获表头点击事件,并将其绑定到一个方法: ```html <el-table :data="tableData" @header-click="handleHeaderClick"> <!-- 表格列 --> </el-table> ``` 然后,在 `handleHeaderClick` 方法获取到被点击的表头列的字段名,并根据需要修改表格数据。例如,可以按照表头列的升降序对表格数据进行排序,或者筛选出符合某些条件的数据。 ```js methods: { handleHeaderClick(column) { // 获取被点击的表头列的字段名 const prop = column.property; // 根据字段名进行表格数据的修改操作 // 例如,按照升降序对表格数据进行排序 this.tableData.sort((a, b) => a[prop] - b[prop]); } } ``` 最后,可以在需要修改表格数据的表头列上使用 `v-slot` 和 `@click` 指令来添加点击事件。例如,下面的代码演示了如何在“操作”列上添加一个“删除”按钮,点击该按钮后删除对应的行数据: ```html <el-table :data="tableData" @header-click="handleHeaderClick"> <el-table-column label="姓名" prop="name"></el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> <el-table-column label="操作"> <template v-slot:header> <span>操作</span> <span @click="handleDeleteAll">全部删除</span> </template> <template v-slot="scope"> <el-button @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> </el-table> ``` 其,`handleDeleteAll` 方法可以用来删除所有行数据,而 `handleDelete` 方法则可以用来删除单个行数据。 ```js methods: { handleHeaderClick(column) { // 获取被点击的表头列的字段名 const prop = column.property; // 根据字段名进行表格数据的修改操作 // 例如,按照升降序对表格数据进行排序 this.tableData.sort((a, b) => a[prop] - b[prop]); }, handleDelete(row) { // 从表格数据删除指定行数据 const index = this.tableData.indexOf(row); if (index !== -1) { this.tableData.splice(index, 1); } }, handleDeleteAll() { // 删除所有行数据 this.tableData = []; } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值