vue3实现的多维表格编辑器,小白也能轻松构建复杂数据报表!

👆点击趣谈AI>点击右上角“···”>设为星标🌟

嗨,大家好,我是徐小夕。 
曾任职多家上市公司,多年架构经验,打造过上亿用户规模的产品,目前全职创业,聚集于“Dooring AI零代码”和“flowmixAI多模态办公软件”。

最近推出了《架构师精选专栏,我会分享一线企业技术实践和架构经验,并和大家拆解可视化搭建平台,AI产品,办公协同软件的源码实现。

图片

今天继续聊聊多维表格编辑器。(Pro版2天后上线)

之前在 趣谈AI 公众号和大家分享了我花3个月编写的代码量接近 1w 行的多维表格,也收到了非常多粉丝的反馈:

支持买断+二开!这款多维表格编辑器,助你低成本构建复杂数据报表

体验地址:http://mute.turntip.cn

很多朋友想让我实现一版Vue的多维表格,于是我花了一周时间, 基于我之前设计多维表格的经验,终于写了一版,上图的演示动画就是Vue版本的多维表格。

说实话,用Vue写真的很痛苦,当然并不是因为框架本身不好用, 而是为了保证代码的架构优雅,以及Vue实现的渲染性能问题,其实需要考虑很多细节上的设计。

同时,多维表格因为其自身结构上的复杂性,我们需要满足诸如下面的功能:

  • 大数据量的渲染性能

  • 表格结构的不确定性

  • 表格字段的动态可配置性(比如添加字段,设置字段格式, 字段校验等)

  • 行和列的排序

  • 列拖拽调整宽度问题

  • 表格的数据结构映射设计

当然还有很多业务上可扩展的需求,也需要在设计多维表格的整个架构上做思考。所以我花了大概3天时间考虑上面的问题,并熟悉Vue高级API,力求让代码足够优雅和具有先进性。

好在最终实现了Vue版本,接下来就和大家分享一下具体的实现细节。

大数据渲染能力支持——虚拟列表实现

目前列表的渲染我采用了虚拟滚动的方式,以便可以支持海量数据的加载,具体的使用方式如下:

VirtualRow 就是我封装的虚拟行组件,实现原理就是利用可视高度和行的高度计算下次渲染的时机,同时减少一次加载大量 dom 节点。我会用一个空白占位符来监控滚动高度变化:

感兴趣的朋友可以参考一下。

多维表格的行和列拖拽排序

在支持虚拟滚动之后, 表格的行和列再支持拖拽排序功能, 同时要保证每一个单元格都可编辑,这个需要非常多的设计考量和模块化拆分。

接下来分享一下行和列的拖拽核心实现:

// 列拖拽const startColumnDrag = (event: DragEvent, index: number) => {  if (event.dataTransfer) {    event.dataTransfer.setData('text/plain', index.toString())    event.dataTransfer.effectAllowed = 'move'  }}// 行拖拽const startRowDrag = (event: DragEvent, record: Record, index: number) => {  if (event.dataTransfer) {    event.dataTransfer.setData('application/json', JSON.stringify({ record, index }))    event.dataTransfer.effectAllowed = 'move'  }}// 水平滚动条拖拽const startHorizontalDrag = (event: MouseEvent) => {  event.preventDefault()  const startX = event.clientX  const startScrollLeft = scrollLeft.value  const containerWidth = containerRef.value?.clientWidth || 0  const maxScroll = totalWidth.value - containerWidth
  const handleMouseMove = (e: MouseEvent) => {    const deltaX = e.clientX - startX    const scrollRatio = deltaX / (containerWidth - horizontalThumbWidth.value)    const newScrollLeft = Math.max(0, Math.min(maxScroll, startScrollLeft + scrollRatio * maxScroll))
    if (scrollContainerRef.value) {      scrollContainerRef.value.scrollLeft = newScrollLeft    }  }
  const handleMouseUp = () => {    document.removeEventListener('mousemove', handleMouseMove)    document.removeEventListener('mouseup', handleMouseUp)  }
  document.addEventListener('mousemove', handleMouseMove)  document.addEventListener('mouseup', handleMouseUp)}

下面是列排序拖拽的功能:

多维表格的单元格编辑功能

单元格编辑需要支持不同类型的编辑能力,同时大家还可以基于自身需求拖拽更多编辑类型。目前支持的表格编辑类型有:

  • 文本框

  • 下拉列表

  • 日期框

  • 复选框

  • 标签

为了更好的维护性,我将单元格单独封装成了 CellRender 组件,以便更好的扩展和维护。

多维表格的字段管理功能

字段管理是多维表格的核心能力之一,我们可以动态新增字段,删除字段,对字段进行二次编辑,排序等,同时还能设置校验规则:

 字段管理功能我也花了很多时间来设计,最终采用了优雅的IOC模式来实现了数据的实时同步。

状态管理我统一维护在了 store.ts 文件中,同时使用 vue coder 们最熟悉的pina状态库。

多维表格的性能监控面板

之所以设计这个功能,是为了实时监控多维表格的性能,并统计各项指标数据。

多维表格的数据导出功能

我们可以把多维表格数据一键导出为json,大家可以方便的分析json数据,并基于多维表格数据进行可视化的图表渲染和分析。这里和大家分享一下我设计的多维表格的数据结构:

[  {      "id": "mctvxg1hvd79ofd8tqe",      "createdAt": "2025-07-08T02:02:25.781Z",      "updatedAt": "2025-07-08T02:02:25.781Z",      "title": "新任务",      "details": "",      "assignee": "",      "status": "待开始",      "startDate": "2025-07-08",      "endDate": "",      "isOverdue": false,      "completedDate": "",      "priority": "重要不紧急"    },    {      "id": "mctvxg72m4dtcu5vcnl",      "createdAt": "2025-07-08T02:02:25.982Z",      "updatedAt": "2025-07-08T02:02:25.982Z",      "title": "新任务",      "details": "",      "assignee": "",      "status": "待开始",      "startDate": "2025-07-08",      "endDate": "",      "isOverdue": false,      "completedDate": "",      "priority": "重要不紧急"    },    {      "id": "mctvxgc66urxeq25wat",      "createdAt": "2025-07-08T02:02:26.166Z",      "updatedAt": "2025-07-08T02:02:26.166Z",      "title": "新任务",      "details": "",      "assignee": "",      "status": "待开始",      "startDate": "2025-07-08",      "endDate": "",      "isOverdue": false,      "completedDate": "",      "priority": "重要不紧急"    },    {      "id": "mctvxggupvbir9eywds",      "createdAt": "2025-07-08T02:02:26.334Z",      "updatedAt": "2025-07-08T02:02:26.334Z",      "title": "新任务",      "details": "",      "assignee": "",      "status": "待开始",      "startDate": "2025-07-08",      "endDate": "",      "isOverdue": false,      "completedDate": "",      "priority": "重要不紧急"    }]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值