首页 » 前端 » ElementUI » 正文

ElementUI 的 el-table 用 span-method 合并列中值相同的单元格

发布者:站点默认
2018/07/31 浏览数(1,642) 分类:ElementUI, Vue.js, 前端 ElementUI 的 el-table 用 span-method 合并列中值相同的单元格已关闭评论

注:以下代码仅支持向下合并单元格,不支水平合并单元格。

<el-table :data="list" :span-method="cellRowSpanConfig" border>
  <el-table-column label="序号" type="index" align="center" fixed>
    <template slot-scope="scope">
      <span>{{ (pager.page - 1) * pager.size + scope.$index + 1 }}</span>
    </template>
  </el-table-column>
  <el-table-column label="name" prop="name"></el-table-column>
  <el-table-column label="age" prop="age"></el-table-column>
  <el-table-column label="address" prop="address"></el-table-column>
</el-table>
export default {
  data() {
    return {
      list: [
        { name: '张三', age: 18, address: '中/国/北/京' },
        { name: '张三', age: 19, address: '中/国/新/疆' },
        { name: '李四', age: 19, address: '中/国/西/藏' },
        { name: '王五', age: 19, address: '中/国/青/海' },
        { name: '王五', age: 18, address: '中/国/北/京' },
        { name: '王五', age: 18, address: '中/国/北/京' },
      ],
      mergeableFields: ['age', 'name'], // 需要合并的列
      pager: {
        page: 1,
        size: 30,
        total: 6,
      },
    };
  },
  methods: {
    cellRowSpanConfig({ row, column, rowIndex, columnIndex }, elTableDataKey = "list") {
      let self = this;
      let field = column.property;
      let config = {
        rowspan: 1, // >0:向下合并的单元格个数(==1时自己与自己合并即不与其它单元格合并),==0:当前单元格被合并了
        colspan: 1,
      };
      if (self.mergeableFields && Array.isArray(self.mergeableFields) && self.mergeableFields.length && self.mergeableFields.includes(field)) {
        let value = row[field];
        if (rowIndex == 0 || (rowIndex > 0 && value !== self[elTableDataKey][rowIndex - 1][field])) {
          let span = 0;
          // 在「el-table :data="list"」中的当前行向下找,看有几行需要合并
          topLevel: for (let i = rowIndex; i < self[elTableDataKey].length; i++) {
            const v = self[elTableDataKey][i][field];
            // 恒等的原因: ''==0 is true
            if (v === value) {
              span++;
            } else {
              break topLevel;
            }
          }
          config.rowspan = span;
        }
        // 与上一行的值相同时表示当前行被合并了
        else if (rowIndex > 0 && value === self[elTableDataKey][rowIndex - 1][field]) {
          config.rowspan = 0;
        }
      }
      return config;
    },

  },
}
点击返回顶部
  1. 留言
  2. 联系方式