首页/新闻资讯/正文详情

BlockNote 进阶表格实战:基于 onChange 事件实现带自动计算的表格列

发布时间:2026/9/24 22:36:54 来源:云帆数科 栏目:资讯中心
BlockNote 进阶表格实战:基于 onChange 事件实现带自动计算的表格列
BlockNote 进阶表格实战基于 onChange 事件实现带自动计算的表格列【免费下载链接】BlockNoteA React Rich Text Editor thats block-based (Notion style) and extensible. Built on top of Prosemirror and Tiptap.项目地址: https://gitcode.com/gh_mirrors/bl/BlockNote本指南以 BlockNote 仓库中的进阶表格示例 17-advanced-tables-2 为蓝本讲解如何在 BlockNote 中开启表格高级特性单元格拆分/合并、单元格背景色、单元格文字颜色、表头行列并通过onChange事件监听表格内容变化实现数量 × 单价 小计、自动汇总总计Grand Total的实时计算表格。读完本文你将掌握 BlockNotetables配置项的完整用法、表格块table block的 JSON 数据结构以及如何安全地在事件回调中回写更新后的表格内容而不陷入循环更新。示例功能总览该示例实现了一张订单明细风格的表格完整功能清单如下自动计算Automatic Calculations每一行的Quantity × Price Total总计Grand Total自动计算所有小计之和并写入表格末行实时更新Real-time Updates修改数量或价格后计算结果立即刷新拆分/合并单元格Split cells可对单元格进行拆分与合并操作单元格背景色Cell background color支持给单个单元格着色单元格文字颜色Cell text color支持修改单元格内的文字颜色表头行列Table row and column headers使用表头提升表格的组织性与可读性。从示例的运行效果看App.tsx 中initialContent预置的表格这是一个 5 行 4 列的订单表首行为表头Item / Quantity / Price ($) / Total ($)中间 3 行为数据行末行为 Grand Total 汇总行。预置数据为 Laptop2 × 1200 2400、Mouse5 × 25 125、Keyboard3 × 80 240Grand Total 为 2765——这几个数字正是检验计算逻辑是否正确的现成基准。开启表格高级特性tables 配置项示例的核心前提是在创建编辑器时通过useCreateBlockNote的tables选项启用表格的高级功能const editor useCreateBlockNote({ // This enables the advanced table features tables: { splitCells: true, cellBackgroundColor: true, cellTextColor: true, headers: true, }, // ... });这四个开关在 BlockNoteEditor.ts 中有明确的官方定义与默认值配置项作用默认值splitCells是否允许在表格内拆分与合并单元格falsecellBackgroundColor是否允许修改单元格背景色falsecellTextColor是否允许修改单元格文字颜色falseheaders是否允许把单元格设置为表头false从源码可以看到编辑器构造函数会将这四个选项收敛到settings.tables中BlockNoteEditor.ts后续表格相关的 UI侧边菜单、单元格操作按钮等会据此决定是否渲染对应功能。因此不开启这些选项即使数据里带有colspan、backgroundColor等属性界面上的对应操作入口也不会出现。示例将四项全部置为true以获得完整的表格编辑体验。工作原理onChange 事件驱动计算示例没有使用自定义表格块而是复用 BlockNote 内置的table块在编辑器内容变化时通过onChange回调捕获变更并回写计算结果。整个工作流分为四步表格内容发生任何变化编辑单元格文字、增删行列等时BlockNoteView触发onChange从回调参数中调用getChanges()取出本次的变更列表changes遍历变更筛选出change.type update且change.block.type table的变更对命中的表格块调用calculateTableTotals重新计算再用editor.updateBlock将计算结果写回编辑器。onChange是 BlockNote 编辑器层的公开 API在 BlockNoteView.tsx 中作为组件 prop 透传语义与BlockNoteEditor.onChange一致回调签名包含编辑器实例以及可延迟求值的getChanges用于拿到变更后的块数据。之所以用getChanges()函数而非直接传对象是为了让使用者按需读取本次变更的详细信息如变更类型、涉及哪些块。核心监听代码来自 App.tsxBlockNoteView editor{editor} onChange{(editor, { getChanges }) { const changes getChanges(); if (changes.length 0 || applying.current) { return; } // prevents a double onChange because were updating the block here applying.current true; changes.forEach((change) { if (change.type update change.block.type table) { const updatedRows calculateTableTotals(change.block); if (updatedRows) { editor.updateBlock(change.block, { type: table, content: { ...change.block.content, rows: updatedRows, }, }); } } }); requestAnimationFrame(() (applying.current false)); }} /BlockNoteView两个值得注意的工程细节变更筛选change.type update表示块内容被更新change.block.type table确保只处理表格块避免对普通文本块的编辑也触发计算防循环回写editor.updateBlock写入表格后编辑器内容再次变化会再次触发onChange若不加保护将形成无限循环。示例用useRef(false)维护一个applying标志进入回写流程时置为true跳过后续回调并通过requestAnimationFrame在下一帧重置保证计算回写只生效一次。计算逻辑calculateTableTotals 逐行剖析calculateTableTotals接收一个table类型的块Block返回更新后的行数组。其处理规则如下App.tsx类型与行数守卫非table块直接返回rows.length 2至少需要表头 1 行数据时直接返回跳过特殊行第 0 行是表头最后一行是 Grand Total 行均不参与小计计算但最后一行会在后面单独更新汇总值提取单元格文本getCellText辅助函数兼容两种单元格形态——纯字符串或包含content[0].text的对象结构取不到数值时兜底为0计算小计quantity parseFloat(quantityText) || 0、price parseFloat(priceText) || 0total quantity * price并累加到grandTotal回写小计单元格把该行第 4 个单元格索引 3替换为带bold: true样式、绿色背景backgroundColor: green、白色文字的新tableCell内容为total.toString()条件标注若total 4000在商品名称后追加 (eligible for discount)标注示例中 Laptop 单价 1200、数量 2 时未达阈值此分支可用于验证更高金额场景更新总计行最后一行第 4 个单元格更新为grandTotal背景色为红色red、白色文字与绿色小计格形成视觉区分。数据行中每个单元格都是标准tableCell对象例如初始内容中的 Total 列{ type: tableCell, content: [{ type: text, text: 2400, styles: { bold: true } }], props: { colspan: 1, rowspan: 1, backgroundColor: green, textColor: white, textAlignment: center } }colspan/rowspan是表格块支持的核心结构属性其默认值均为 1。在 BlockNote 中表格块基于 prosemirror-tables 实现表头单元格与普通单元格分别映射为th/td节点见 blocks/Table/block.ts。跨行跨列会让单元格的逻辑坐标与物理坐标产生映射关系BlockNote 在 api/blockManipulation/tables/tables.ts 中专门处理相对/绝对索引的换算因此你在手动读写rows时务必保持colspan、rowspan与cells数组结构一致否则表格结构可能错乱。表格初始内容的 JSON 结构示例通过initialContent直接预置了完整表格这是理解表格数据模型的最佳入口。表格块的基本骨架为{ id: cbf287c6-770b-413a-bff5-ad490a0b562a, type: table, props: { textColor: default }, content: { type: tableContent, columnWidths: [150, 120, 120, 120], // 四列宽度像素 headerRows: 1, // 前 1 行作为表头 rows: [ /* row 对象数组 */ ], }, children: [], }关键字段说明columnWidths每列宽度数组长度需与列数一致示例为 4 列headerRows表头行数示例为 1即首行渲染为表头对应源码中的tableHeader节点与th标签rows行数组每行包含cells单元格数组单元格内是tableCell类型其content为内联内容文本props声明colspan、rowspan、backgroundColor、textColor、textAlignment。预置数据中已经演示了完整的样式用法表头单元格使用灰色背景gray加粗居中Total 列表头用蓝色背景白字数据行小计用绿色背景白字加粗Grand Total 行用黄色背景、最终汇总格用红色背景白字。这些backgroundColor/textColor的取值即来自tables.cellBackgroundColor/tables.cellTextColor开关所启用的样式能力。运行与调试该示例是标准的 Vite React 工程package.json依赖blocknote/core、blocknote/react、blocknote/mantine表格 UI 组件来自 Mantine 包装React 19 与 Vite 8。进入示例目录后执行npm install npm run dev # 启动开发服务器等价于 npm start生产构建与预览npm run build:prod # tsc 类型检查 vite build npm run preview # 本地预览构建产物调试建议修改任意数据行的 Quantity 或 Price 后观察 Total 列与 Grand Total 是否同步刷新——若未刷新检查是否误触发了applying.current保护例如连续快速输入时requestAnimationFrame尚未重置标志尝试合并两个单元格splitCells: true已开启后确认getCellText对合并单元格内容的提取仍然正确若需在表格外监听计算可改用编辑器实例的editor.onChangeAPI其回调同样提供getChanges()方便与其他业务逻辑如保存草稿、同步后端集成。小结本示例展示了 BlockNote 表格能力的两层用法配置层通过tables选项一次性开启单元格拆分/合并、背景色、文字颜色与表头四大特性逻辑层通过onChangegetChanges监听表格变更用updateBlock回写计算结果并借助 ref 标志规避回写造成的循环触发。这套事件监听—计算—回写的模式完全独立于表格 UI可直接迁移到报价单、库存表、预算表等任何需要公式化列计算的场景而对colspan/rowspan与tableContent数据结构的理解则是安全读写 BlockNote 表格数据的基础。【免费下载链接】BlockNoteA React Rich Text Editor thats block-based (Notion style) and extensible. Built on top of Prosemirror and Tiptap.项目地址: https://gitcode.com/gh_mirrors/bl/BlockNote创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Spring Boot公考学习平台:从源码拆解到调试跑通全记录
Spring Boot公考学习平台:从源码拆解到调试跑通全记录

基于Spring Boot的公考知识学习平台:从源码拆解到调试跑通的完整实操记录接手这个项目的时候,第一感受是"公考学习平台"这个题目在毕业设计里确实够典型——既有用户端、管理端的清晰业务边界,又能把登录鉴权、题库管理、刷题判分、… · 2026/9/24 22:36:54

Java程序运行机制全解析:从字节码到JVM内存与垃圾回收
Java程序运行机制全解析:从字节码到JVM内存与垃圾回收

Java程序运行机制这个话题,说实话是每个Java开发绕不开的核心。不管是刚入门准备面试的新人,还是工作了几年想回头补基础的老手,只要想把这门语言吃透,就必须把这些机制弄明白。网上关于这块的文章不少,但大多是零散知… · 2026/9/24 22:36:48

可持续绩效体系设计:从碳预算到ESG考核的落地路径
可持续绩效体系设计:从碳预算到ESG考核的落地路径

把“可持续”和“绩效体系”放在同一个框架里管起来,这个动作本身,比大多数人想象的要复杂得多。我在给企业做管理诊断时,见过太多公司把环保指标做完合规检查就锁进抽屉,而雪佛龙(Chevron)这套可持续绩效体… · 2026/9/24 22:36:48

AI Agent 驱动 Elasticsearch 查询优化:基准测试框架与实战
AI Agent 驱动 Elasticsearch 查询优化:基准测试框架与实战

1. 为什么我们要让 AI agent 来碰 Elasticsearch 的查询优化Elasticsearch 的性能调优这件事,做过的人都知道,它属于那种"看起来有章可循,实际上处处是坑"的活。官方文档给了一堆参数,什么refresh_interval、translog.d… · 2026/9/24 23:11:31

LSTM气温预测实战:从56KB资源包到多步预测的完整拆解
LSTM气温预测实战:从56KB资源包到多步预测的完整拆解

简介:这份资源面向具备一定深度学习基础、希望用LSTM完成气温时间序列预测的学习者与开发者,提供一套可直接运行的完整实现方案。压缩包共3个文件,包含2个Python脚本与1个CSV数据文件,整体约9KB,其中脚本分别承担模型搭… · 2026/9/24 23:11:31

Windows上安装PyQt6从零到跑通第一个窗口完整指南
Windows上安装PyQt6从零到跑通第一个窗口完整指南

这段时间好几个读者私信问我同一个问题:Windows上到底怎么装PyQt6?有的卡在Python环境,有的装完了运行报错,还有的不知道PyQt6跟PyQt5到底该选哪个。我干脆把从零到跑通第一个窗口的完整过程整理出来,尽量说人话&#… · 2026/9/24 23:11:31

Agent开发核心指南:从执行循环到生产落地的工程实践
Agent开发核心指南:从执行循环到生产落地的工程实践

1. Agent 开发的核心认知与整体设计思路1.1 为什么“八股”在 Agent 开发里依然成立“八股”这个词在技术圈一直带着点调侃意味,但做过几年开发的人都明白,它本质上是把高频出现、反复被验证过的知识结构固化下来,形成一套可以快速调用的思维… · 2026/9/24 23:11:31

个人开发者如何高效啃下12种工控协议?掌握共性是关键
个人开发者如何高效啃下12种工控协议?掌握共性是关键

最近有朋友问我,一个人做项目,一下子要对接 12 种工控协议,靠不靠谱?我的答案很直接:靠谱,但前提是你得换一种姿势去啃。假如你把这 12 种协议当成 12 个孤零零的东西,一个个去背文档、记报文格… · 2026/9/24 23:11:31

矿井传送带异物检测YOLO数据集实战指南
矿井传送带异物检测YOLO数据集实战指南

简介:本资源是面向计算机视觉工程师、煤矿智能化研究人员及AI安全检测学习者的专业级目标检测数据集,聚焦矿井煤仓传送带异物(如石块、金属碎片)的实时识别任务,助力高鲁棒性YOLO模型训练与工业落地验证。压缩包共73个… · 2026/9/24 23:11:18

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码