ant vue table表格数据动态合并

这篇具有很好参考价值的文章主要介绍了ant vue table表格数据动态合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

antd 表格动态行合并

合并效果

antd合并单元格和分页,VUE,vue.js,javascript,前端

步骤方法

1.在computed节点下动态计算每次要合并的行数

  computed: {
    columns() {
      return [
        {
          title: "区域",
          dataIndex: "area",
          customRender: (text, row, index) => {
            const obj = {
              children: text !== null ? text : "",
              attrs: {
                rowSpan: 1,
              },
            };
            obj.attrs.rowSpan = this.renderCells(text, this.currentTable, "area",index);
            return obj;
          },
        },
        {
          title: "名称",
          dataIndex: "name",
        },
        {
          title: "数量",
          dataIndex: "count",
        },
        {
          title: "进度",
          dataIndex: "progress",
        },
      ];
    },
  }

2.在methods节点下定义合并单元格的方法

renderCells(text, data, key, index) {
      if (data.length < 1) {
        return 1;
      }
      if (text === "" || text === null) {
        data[index].rowNum = 1;
        return 1;
      }
      // 上一行该列数据是否一样
      if (index !== 0 && text === data[index - 1][key] && index % this.pagination.pageSize != 0) {
        data[index].rowNum = 0;
        return 0;
      }
      let rowSpan = 1;
      // 判断下一行是否相等
      for (let i = index + 1; i < data.length; i++) {
        if (text !== data[i][key]) {
          break;
        }
        rowSpan++;
      }
      data[index].rowNum = rowSpan;
      return rowSpan;
    }

3.如果是一次性获取所有数据进行分页的话,计算columns的时候需要进行修改一下

    columns() {
      return [
        {
          title: "区域",
          dataIndex: "area",
          customRender: (text, row, index) => {
            const obj = {
              children: text !== null ? text : "",
              attrs: {
                rowSpan: 1,
              },
            };
            obj.attrs.rowSpan = this.renderCells(text, this.currentTable, "area", Number(index)+Number(this.pagination.pageSize * (this.pagination.current - 1)));
            return obj;
          },
        },
        {
          title: "名称",
          dataIndex: "name",
        },
        {
          title: "数量",
          dataIndex: "count",
        },
        {
          title: "进度",
          dataIndex: "progress",
        },
      ];
    },

参考文章:ant design vue 动态表格合并

合并效果

如果我们想要实现名称列相同的进行合并,需要在原来的代码上进行修改。合并的前提是区域相同,并且名称相同的情况下我们才进行合并,只需要在计算合并行数的时候需要加一层判断即可。
antd合并单元格和分页,VUE,vue.js,javascript,前端

    renderCells(text, data, key, index) {
      if (data.length < 1) {
        return 1;
      }
      if (text === "" || text === null) {
        data[index].rowNum = 1;
        return 1;
      }
      // 上一行该列数据是否一样
      if (index !== 0 && text === data[index - 1][key] && index % this.pagination.pageSize != 0) {
        if(key === 'name'){
          if(data[index-1]['area'] === data[index]['area']){
            data[index].rowNum = 0
            return 0;
          }
        }else{
          data[index].rowNum = 0;
          return 0;
        }

      }
      let rowSpan = 1;
      // 判断下一行是否相等
      for (let i = index + 1; i < data.length; i++) {
        if(key === 'name' && data[i]['area'] !== data[index]['area']){
          break;
        }
        if (text !== data[i][key] ) {
          break;
        }
        rowSpan++;
      }
      data[index].rowNum = rowSpan;
      return rowSpan;
    },

单元格可编辑

非合并的行

可以参考官方的ant-design-vue可编辑单元格,官方示例如下:

<template>
  <div>
    <a-button class="editable-add-btn" @click="handleAdd">
      Add
    </a-button>
    <a-table bordered :data-source="dataSource" :columns="columns">
      <template slot="name" slot-scope="text, record">
        <editable-cell :text="text" @change="onCellChange(record.key, 'name', $event)" />
      </template>
      <template slot="operation" slot-scope="text, record">
        <a-popconfirm
          v-if="dataSource.length"
          title="Sure to delete?"
          @confirm="() => onDelete(record.key)"
        >
          <a href="javascript:;">Delete</a>
        </a-popconfirm>
      </template>
    </a-table>
  </div>
</template>
<script>
const EditableCell = {
  template: `
      <div class="editable-cell">
        <div v-if="editable" class="editable-cell-input-wrapper">
          <a-input :value="value" @change="handleChange" @pressEnter="check" /><a-icon
            type="check"
            class="editable-cell-icon-check"
            @click="check"
          />
        </div>
        <div v-else class="editable-cell-text-wrapper">
          {{ value || ' ' }}
          <a-icon type="edit" class="editable-cell-icon" @click="edit" />
        </div>
      </div>
    `,
  props: {
    text: String,
  },
  data() {
    return {
      value: this.text,
      editable: false,
    };
  },
  methods: {
    handleChange(e) {
      const value = e.target.value;
      this.value = value;
    },
    check() {
      this.editable = false;
      this.$emit('change', this.value);
    },
    edit() {
      this.editable = true;
    },
  },
};
export default {
  components: {
    EditableCell,
  },
  data() {
    return {
      dataSource: [
        {
          key: '0',
          name: 'Edward King 0',
          age: '32',
          address: 'London, Park Lane no. 0',
        },
        {
          key: '1',
          name: 'Edward King 1',
          age: '32',
          address: 'London, Park Lane no. 1',
        },
      ],
      count: 2,
      columns: [
        {
          title: 'name',
          dataIndex: 'name',
          width: '30%',
          scopedSlots: { customRender: 'name' },
        },
        {
          title: 'age',
          dataIndex: 'age',
        },
        {
          title: 'address',
          dataIndex: 'address',
        },
        {
          title: 'operation',
          dataIndex: 'operation',
          scopedSlots: { customRender: 'operation' },
        },
      ],
    };
  },
  methods: {
    onCellChange(key, dataIndex, value) {
      const dataSource = [...this.dataSource];
      const target = dataSource.find(item => item.key === key);
      if (target) {
        target[dataIndex] = value;
        this.dataSource = dataSource;
      }
    },
    onDelete(key) {
      const dataSource = [...this.dataSource];
      this.dataSource = dataSource.filter(item => item.key !== key);
    },
    handleAdd() {
      const { count, dataSource } = this;
      const newData = {
        key: count,
        name: `Edward King ${count}`,
        age: 32,
        address: `London, Park Lane no. ${count}`,
      };
      this.dataSource = [...dataSource, newData];
      this.count = count + 1;
    },
  },
};
</script>

antd合并单元格和分页,VUE,vue.js,javascript,前端

动态合并可编辑单元格

实际运用过程中,可能会遇到需要动态合并可编辑的单元格,已知scopedSlots可以帮助我们实现编辑单元格,customRender中可以自定义动态合并单元格。但是经过实践发现这两者无法同时使用。参考ant-design-vue表格动态合并可编辑单元格的解决方法发现可以通过JSX语法来解决scopedSlots和customRender冲突的问题

  computed: {
    columns() {
      return [
        {
          title: "区域",
          dataIndex: "area",
          scopedSlots: { customRender: 'area' },
          customRender: (text, row, index) => {
            const obj = {
              children: <editable-cell text={text} onChange={(val) => this.onCellChange(row.id,'area',val)}></editable-cell>,
              attrs: {
                rowSpan: 1,
              },
            };
            obj.attrs.rowSpan = this.mergeCells(text, this.currentTable, "area", Number(index)+Number(this.pagination.pageSize * (this.pagination.current - 1)));
            return obj;
          },
        },
        {
          title: "名称",
          dataIndex: "name",
         
        },
        {
          title: "数量",
          dataIndex: "count",
        },
        {
          title: "进度",
          dataIndex: "progress",
        },
      ];
    },
  },
实现效果

antd合并单元格和分页,VUE,vue.js,javascript,前端文章来源地址https://www.toymoban.com/news/detail-686109.html

到了这里,关于ant vue table表格数据动态合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue中Element-ui 表格 (Table)合并行、列单元格

    先在el-table里加个属性:span-method绑定方法objectSpanMethod(),这个用来把你想合并的列根据你写的逻辑来合并,再写个getSpanArr(),这个写合并的逻辑。 加一个属性两个方法,然后在获取表格数据的时候调用一下getSpanArr(),示例代码写了四个逻辑,根据id相同合并,根据id和其他字段

    2024年02月10日
    浏览(49)
  • Ant Design Vue Table 嵌套子表格的数据刷新方法

    父子组件各自负责,在table中嵌套了子表格后,首次加载表格时,父组件会实例化子组件并传递参数,折叠后再次展开时,只会传递参数,子组件的数据刷新就属于子表格了。如 @@@code template #expandedRowRender=\\\"{ record }\\\" originIndex style= \\\"margin-left: 55px; margin-right: 50px; background-color:

    2024年02月09日
    浏览(37)
  • 前端vue+elementui导出复杂(单元格合并,多级表头)表格el-table转为excel导出

    需求 :前端对el-table表格导出 插件 : npm install xlsx -S npm install file-saver --save 原理 :直接导出el-table的表格里面的数据,这样就会存在缺点,只会导出当前页面的数据,如果需要导出全部数据,可以自己重新渲染一个全部数据不可见的el-table表格,来导出就可以了 扩展 :经过

    2024年02月04日
    浏览(66)
  • vue3 antd项目实战——table表格的自定义筛选【纯前端filters过滤、自定义筛选table表格数据】

    文章内容 文章链接 vue3 antd table 表格的基础搭建 https://blog.csdn.net/XSL_HR/article/details/128072745 ant design vue 组件库的引入与使用 https://blog.csdn.net/XSL_HR/article/details/127396384 在 后台管理系统 中,我们需要 对大量的数据进行展示、处理和操作 ,table表格也因此无处不在。而 ant design

    2024年01月25日
    浏览(57)
  • 【Vue/element】 el-table实现表格动态新增/插入/删除 表格行,可编辑单元格

    效果如下: 点击“新增一行”可以在表格最后新增一行,单元格内容可编辑 点击绿色+按钮,可在指定行的后面插入一行 点击红色-按钮,可以删除指定行 原理:表格 el-table 是通过动态循环 tableData 生成,只要对 tableData 数组进行增加删除元素,就可以达到效果 这里用了ele

    2024年02月16日
    浏览(63)
  • table表格 ---合并单元格

            第一种方法                 利用table的 :header-cell-style属性           第二种方法                 利用官网提供的el-table-column互相嵌套           利用table的:span-method属性

    2024年02月07日
    浏览(36)
  • Vue+Element-UI 中 el-table 动态合并单元格 :span-method 方法

    记录一下工作时遇到的 el-table 合并单元格的需求,超详细😊 el-table官方提供了合并单元格的方法与返回格式 如下: 根据叙述有了如下思路: 因为后端返回的数据非统一, 可能不是按照类别排好的😨, 所以官网的例子满足不了所有的需求所以我们通过遍历table的数据比较前后两

    2024年02月12日
    浏览(66)
  • vue element ui 表格有相同数据合并单元格

    先看效果     前提是你的数据是扁平的数据因为要根据上下数据是否一样才合并的  如果是子级数据需要改一下数据格式了 下面是数据的样式    合并单元格的重点属性就是 :summary-method=\\\"\\\" 这个是关键 完整代码

    2024年02月11日
    浏览(54)
  • Ant Design Vue表格(Table)及分页(Pagination )使用

    最近在写一个新项目,UI框架用的是 Ant Design Vue ,因为之前一直用的 Element UI ,没有用过这个组件库,没想到二者区别这么大,因此踩了不少坑,其中就有 Table 和 Pagination ,花了一会时间才弄明白,在此记录并分享一下此次经历。 注意:是 Vue3 项目。 Table 的使用相对比较简

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包