elements plus 单元格合并使用 template slot

45 min read

在 Vue.js 中,你可以使用 <slot> 元素创建 template slot。而对于 element-plus,你可以在 <el-table> 中使用 template 属性来定义单元格内容,然后在 <template> 中使用 <el-table-column>slot-scope 属性来访问单元格的数据。

下面是一个示例,展示如何在 <el-table> 的单元格中合并单元格并使用 template slot:

<template>
  <el-table :data="tableData">
    <el-table-column
      prop="name"
      label="Name"
      :span-method="mergeNameSpan"
      :sortable="true">
      <template slot-scope="scope">
        <span v-if="scope.span === 1">{{ scope.row.name }}</span>
        <span v-else>{{ scope.row.name }} (Merged)</span>
      </template>
    </el-table-column>
    <el-table-column prop="age" label="Age"></el-table-column>
    <el-table-column prop="gender" label="Gender"></el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: 'John', age: 25, gender: 'Male' },
        { name: 'Amy', age: 30, gender: 'Female' },
        { name: 'Chris', age: 20, gender: 'Male' },
        { name: 'Emma', age: 35, gender: 'Female' },
      ]
    };
  },
  methods: {
    mergeNameSpan({ row, column, rowIndex, columnIndex }) {
      if (rowIndex === 0) {
        if (columnIndex === 0) {
          return [1, 2];
        }
        return [0, 0];
      }
      if (rowIndex === 1) {
        if (columnIndex === 0) {
          return [0, 0];
        }
        return [1, 1];
      }
      return [0, 0];
    }
  }
};
</script>

在上述示例中,我们使用了 <el-table><el-table-column> 创建了一个简单的表格,并使用了 template slot 来合并单元格。在 <el-table-column>template 属性中,我们使用了 slot-scope="scope" 来访问单元格的数据。在 <template> 中,我们使用了 v-ifv-else 来判断是否为合并的单元格,并根据需要渲染相应的内容。

mergeNameSpan 方法定义了单元格的合并方式。在该方法中,我们根据行索引和列索引决定了单元格的合并方式。在这个例子中,我们合并了第一列的前两行,并合并了第二列的第二行。

希望这可以帮助到你!如果你还有其他问题,请随时提问。