任天堂的看家游戏机NS最大的特性就是可以方便携带外出游玩,不过近日任天堂官方贴心的提醒玩家暑假外出谨防丢失,因为NS不支持远程网络锁机,引发玩家极度不...
2025-07-28 0
大家好,我是徐小夕。
架构师,曾任职多家上市公司,多年架构经验,打造过上亿用户规模的产品,目前全职创业,主要聚集于“Dooring AI零代码搭建平台”和“flowmixAI多模态办公软件”
今天继续聊聊多维表格编辑器。
之前在 趣谈AI 和大家分享了我花3个月编写的代码量接近 1w 行的多维表格,也收到了非常多粉丝的反馈。
很多朋友想让我实现一版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": "重要不紧急" }]
好啦,今天就分享到这,如果大家对多维表格感兴趣,也欢迎随时和我交流。
相关文章
任天堂的看家游戏机NS最大的特性就是可以方便携带外出游玩,不过近日任天堂官方贴心的提醒玩家暑假外出谨防丢失,因为NS不支持远程网络锁机,引发玩家极度不...
2025-07-28 0
操作系统是绝对的“根技术”,关乎国家科技命脉与独立自主。西方长期垄断此领域,甚至将其当做围堵中国科技发展的利器。鸿蒙的诞生,是中国向核心技术发起的一次...
2025-07-28 0
2025年世界互联网大会数字丝路发展论坛近日在中国泉州落下帷幕。来自全球49个国家和地区,及13个国际组织的600余名嘉宾参会。大家聚焦哪些议题?热议...
2025-07-28 0
先前有报道称Switch 2在美国6月5日首发一个星期后,销量达到了恐怖的110万台。而Circana最新的统计数据显示,任天堂Switch 2整个6...
2025-07-28 0
泰山财经记者 曹鑫鑫近日,泰山财经获悉,国内知名游戏制作方“叠纸游戏”旗下上海叠纸互动网络科技有限公司(简称“叠纸互动”)、上海叠纸互娱网络科技有限公...
2025-07-28 0
不久前,水月雨发布了自家第二款999元有线开放式头戴耳机,Horizon(水平线)。与三年前“监听开放式动圈耳机”Void(空鸣)不同,这次定位是“专...
2025-07-28 0
C114讯 北京时间7月25日消息(艾斯)爱立信官网最新消息显示,该公司近日在澳洲电讯(Telstra)位于北悉尼的50多个5G Advanced商用...
2025-07-28 0
发表评论