表格的单元格合并和表头的合并——vxe-table

发布于:2024-05-01 ⋅ 阅读:(49) ⋅ 点赞:(0)
vxe-table的官网:https://vxetable.cn/#/table/advanced/mergeCell

在你的项目中下载安装完成后,先在main.js文件中引入:

import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'
Vue.use(VXETable)

一、单元格合并

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

<template>
  <div>
    <vxe-table
      border
      resizable
      align="center"
      :span-method="mergeRowMethod"
      :data="tableData3">
      <vxe-column field="key" title="标题1"></vxe-column>
      <vxe-column field="key1" title="标题2"></vxe-column>
      <vxe-column field="max" title="标题5"></vxe-column>
      <vxe-column field="min" title="标题6"></vxe-column>
      <vxe-column field="height" title="标题7"></vxe-column>
      <vxe-column field="low" title="标题8"></vxe-column>
      <vxe-column field="" title="操作">
        <template scope="scope">
          <span @click="updateClick(scope.row,scope.rowIndex)">操作</span>
          <span style="margin-left: 15px;">删除</span>
        </template>
      </vxe-column>
    </vxe-table>
  </div>
</template>

<script>
export default {
  data () {
    return {
      tableData3: [
        { id: 10001, key: '内容1', key1: '22%', max: 20, min: 10, height: 27, low: 19 },
        { id: 10002, key: '内容1', key1: '22%', max: 20, min: 10, height: 27, low: 19 },
        { id: 10002, key: '内容1', key1: '22%', max: 20, min: 10, height: 27, low: 19 },
        { id: 10003, key: '内容2', key1: '35%', max: 20, min: 10, height: 27, low: 19 },
        { id: 10004, key: '内容2', key1: '35%', max: 20, min: 10, height: 27, low: 19 },
      ],
    }
  },
  methods: {
    // 通用行合并函数(将相同多列数据合并为一行)
    mergeRowMethod ({ row, _rowIndex, column, visibleData }) {
      // 你需要哪一列进行合并,就写他的字段名
      const fields = ['key', 'key1']
      const cellValue = row[column.property]
      if (cellValue && fields.includes(column.property)) {
        const prevRow = visibleData[_rowIndex - 1]
        let nextRow = visibleData[_rowIndex + 1]
        if (prevRow && prevRow[column.property] === cellValue) {
          return { rowspan: 0, colspan: 0 }
        } else {
          let countRowspan = 1
          while (nextRow && nextRow[column.property] === cellValue) {
            nextRow = visibleData[++countRowspan + _rowIndex]
          }
          if (countRowspan > 1) {
            return { rowspan: countRowspan, colspan: 1 }
          }
        }
      }
    },
    updateClick (row, rowIndex) {
      console.log(row, rowIndex);
    },
  }
}
</script>

如果数据相同,但是你不想要他合并,例如:
在这里插入图片描述
如上图,虽然内容1和内容2后面对应的百分比都是22%,但是你不希望该单元格整体合并,你可以将标题1和标题2的field属性改成同一个参数名,就可以解决了,如下:

<template>
  <div>
    <vxe-table
      border
      resizable
      align="center"
      :span-method="mergeRowMethod"
      :data="tableData3">
      <vxe-column field="key" title="标题1"></vxe-column>
      <vxe-column field="key" title="标题2">
        <template slot-scope="scope">
          {{ scope.row.key1 }}
        </template>
      </vxe-column>
      <vxe-column field="max" title="标题5"></vxe-column>
      <vxe-column field="min" title="标题6"></vxe-column>
      <vxe-column field="height" title="标题7"></vxe-column>
      <vxe-column field="low" title="标题8"></vxe-column>
      <vxe-column field="" title="操作">
        <template scope="scope">
          <span @click="updateClick(scope.row,scope.rowIndex)">操作</span>
          <span style="margin-left: 15px;">删除</span>
        </template>
      </vxe-column>
    </vxe-table>
  </div>
</template>

二、表头合并

效果图:
在这里插入图片描述
代码:
columns里的field属性和data里的属性名是对应的,例如{ field: ‘address’, title: ‘标题3-4’, },标题3-4这一列展示的就是data里的address所对应的值

<template>
	<div>
  		<vxe-grid v-bind="gridOptions"></vxe-grid>
	</div>
</template>
<script>
export default {
  data () {
    return {
      gridOptions: {
        border: true,
        resizable: true,
        align: 'center',
        // 分组列头,通过 children 定义子列
        columns: [
          {
            title: '标题1',
            children: [
              {
                field: '', title: '标题1-1',
                children: [
                  { field: 'bank', title: '' },
                ]
              },
            ]
          },
          {
            title: '标题2',
            children: [
              {
                field: '',
                title: '20%',
                children: [
                  { field: 'ran', title: '标题2-1', },
                  { field: 'rank', title: '标题2-2', },
                  { field: 'ranki', title: '标题2-3', },
                  { field: 'rankin', title: '标题2-4', },
                ]
              },
            ]
          },
          {
            title: '标题3',
            children: [
              {
                field: '',
                title: '35%',
                children: [
                  { field: 'role', title: '标题3-1', },
                  { field: 'sex', title: '标题3-2', },
                  { field: 'age', title: '标题3-3', },
                  { field: 'address', title: '标题3-4', },
                ]
              },
            ]
          },
          {
            field: 'data4',
            title: '标题4',
          },
        ],
        data: [
          { id: 10001, bank: '工商银行', data4: 1, ran: '1', rank: '2', ranki: '3', rankin: '4', role: '35', sex: 'Man', age: 28, address: 'Shenzhen' },
          { id: 10002, bank: '交通银行', data4: 2, ran: '2', rank: '2', ranki: '3', rankin: '4', role: 'Test', sex: 'Women', age: 22, address: 'Guangzhou' },
          { id: 10003, bank: '工农银行', data4: 3, ran: '3', rank: '2', ranki: '3', rankin: '4', role: 'PM', sex: 'Man', age: 32, address: 'Shanghai' },
          { id: 10004, bank: '招商银行', data4: 4, ran: '4', rank: '2', ranki: '3', rankin: '4', role: 'Designer', sex: 'Women', age: 23, address: 'Shenzhen' },
        ]
      },
    }
  },
  methods: {
  }
}
</script>

网站公告

今日签到

点亮在社区的每一天
去签到