- 前端
- UI组件
【免费下载链接】ce
Jspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.
Meta Information(元信息)是 Jspreadsheet 提供的一种“单元格隐藏数据”机制:你可以在表格初始化时或运行期间,为任意单元格附加任意自定义数据(如内部 ID、业务状态、校验标记),这些数据对用户完全不可见,也不会出现在单元格显示值中,却可以随时通过 API 读取和更新。阅读本文后,你将掌握meta初始化参数、getMeta/setMeta方法的全部调用形态,并理解其底层存储结构与单元格移动/合并时的同步逻辑,可直接用于构建携带业务附属信息的交互式数据表格。
一、什么是 Meta Information:为何需要它
在真实业务中,表格单元格往往需要携带“看不见”的附加信息。例如:
- 单元格显示的是国家名称,但其背后需要绑定国家代码(如
US、BR); - 单元格显示的是商品名称,但需要附带内部 ID、库存编号等业务字段;
- 需要在单元格上记录审核状态、来源渠道、校验标记等仅在程序中使用的数据。
Jspreadsheet v4 的 Meta Information 正是为此设计的:它允许你在初始化时或运行期间,为单元格附加任意结构的数据,这些数据对用户隐藏、不影响单元格显示,但可通过 API 随时存取。正如官方文档 meta-information.md 所描述的:"This feature helps you keep important information about the cells hidden from users"(该特性帮助你保留单元格的重要信息,且对用户隐藏)。
从数据结构上看,meta 是一张以单元格坐标(如A1、B2)为键、以任意对象为值的映射表,与单元格的值(value)、样式(style)、批注(comments)完全解耦,互不干扰。
二、初始化时定义 Meta:meta配置参数
在初始化表格时,你可以通过配置对象的meta属性,一次性为多个单元格预置元信息。其结构为:
meta: { A1: { myMeta: 'this is just a test', otherMetaInformation: 'other test' }, A2: { info: 'test' }, }即:键是 Excel 风格坐标(如A1),值是任意对象(键值对可以自由定义,数量和名称不限)。官方 Quick Reference 中将其类型定义为object,与style(单元格样式)、mergeCells(合并单元格)等参数并列,属于表格初始化配置的组成部分。
在源码层面,meta 数据被存储于工作表的options.meta属性中(src/utils/meta.js的所有读写都围绕obj.options.meta展开),初始化时传入的对象会原样成为options.meta的初始值。测试用例 test/meta.js 中'Get meta information'用例验证了这一点:
const instance = jspreadsheet(root, { worksheets: [{ data: [ /* ... */ ], meta: { A1: { myMeta: 'this is just a test', otherMetaInformation: 'other test' }, D2: { info: 'test' }, }, }], }); expect(instance[0].getMeta()).to.eql({ A1: { myMeta: 'this is just a test', otherMetaInformation: 'other test' }, D2: { info: 'test' }, });三、编程方式读写 Meta:setMeta与getMeta
初始化之后,你可以通过工作表实例的setMeta和getMeta两个公开方法随时读写元信息。这两个方法在 worksheets.js 中被注册为工作表的公开 API,因此可以直接通过table.setMeta(...)/table.getMeta(...)调用。
3.1setMeta:写入元信息(两种调用形态)
setMeta支持两种调用方式:
形态一:对象批量设置(一次设置多个单元格或多个键)
table.setMeta({ C1: { id: '1', y: '2019' }, C2: { id: '2' } });传入一个以坐标为键、以属性对象为值的对象。从 meta.js 的setMeta实现可以看到,这种形态会遍历对象的所有键,并以“合并”的方式写入:如果某单元格已有 meta 对象,则新增/覆盖其中的属性,而不是整体替换。测试用例'Set meta information using an object'验证了合并语义:
instance[0].setMeta({ B1: { id: '1', y: '2019' }, C2: { test: '2' } }); instance[0].setMeta({ C2: { something: '35' } }); // 结果:C2 变为 { test: '2', something: '35' },原有属性保留形态二:单个键值设置(为指定单元格的指定属性赋值)
table.setMeta('B2', 'myMetaData', prompt('myMetaData:'));第一个参数是单元格坐标字符串,第二个是属性名,第三个是属性值。对应的源码逻辑为:若options.meta尚未初始化则先创建空对象;若该单元格尚无 meta 对象则先创建;随后执行options.meta[cell][key] = value写入。
两种形态在写入后都会触发onchangemeta事件(详见下文第五节)。
3.2getMeta:读取元信息(三种返回值)
getMeta的调用形态与返回值由参数决定(对应 meta.js 的getMeta实现):
| 调用方式 | 返回值 |
|---|---|
table.getMeta() | 返回整张表的全部 meta 对象(options.meta本身) |
table.getMeta('A1') | 返回A1单元格的整个 meta 对象;若该单元格无 meta,返回null |
table.getMeta('A1', 'myMeta') | 返回A1单元格中myMeta属性的值;不存在时返回null |
注意:
getMeta还支持第二参数key(源码签名getMeta(cell, key)),用于直接读取某单元格的单个属性值,这在 Quick Reference 中亦有体现。这一细节在原文档示例中未直接演示,但属于该 API 的完整能力,值得掌握。
测试用例'Get meta information'验证了getMeta()(全部)、getMeta('A1')(单格对象)以及无 meta 单元格返回null的行为。
四、源码级解析:Meta 的存储、合并与联动
4.1 存储结构与写入逻辑
Meta 的完整实现集中在 src/utils/meta.js,核心逻辑如下:
getMeta(cell, key):无参返回options.meta全量;传入坐标且不传 key 时返回该单元格 meta 对象;传入坐标和 key 时返回属性值,任一环节缺失即返回null。setMeta(o, k, v):k与v同时存在时走“单键写入”分支;否则走“对象批量合并”分支。批量分支中,外层遍历坐标、内层遍历属性,采用options.meta[cell][prop] = value的合并赋值,因此重复设置不会清除已有属性。updateMeta(affectedCells):这是内部维护函数,用于在行/列插入、删除、移动等结构性变更后,同步重排 meta 中的单元格坐标。它遍历options.meta的所有坐标键,若该坐标在affectedCells映射中存在新位置,则将 meta 迁移到新坐标(newMeta[affectedCells[key]] = meta[key]),否则原样保留。
updateMeta的调用点位于 src/utils/internal.js,与公式更新(updateFormulas)在同一批内部刷新流程中执行。这意味着:当你插入、删除或移动行/列时,meta 信息会跟随单元格一起迁移到新位置,而不是残留在旧坐标。这一点是从源码结构可以确认的实现事实(src/utils/internal.js的updatePosition相关逻辑会生成affectedTokens,随后交给updateMeta处理)。
4.2 公开 API 的注册
工作表公开方法列表定义于 src/utils/worksheets.js:
[ 'getMeta', function (cell) { return getMeta.call(this, cell); }, ], ['setMeta', setMeta],getMeta被包装为仅暴露第一参数cell的公开方法,而setMeta直接引用meta.js中的原始实现。二者均以this绑定工作表实例,因此可链式地在实例上调用。
五、onchangemeta事件:监听元信息变化
每当setMeta写入成功,都会触发onchangemeta事件(见 meta.js 中的dispatch.call(obj, 'onchangemeta', obj, data)),回调收到的参数是本次变更的 meta 数据:
- 单键写入时,事件载荷为
{ [cell]: { [key]: value } }; - 批量写入时,事件载荷为整个传入对象
o。
你可以在初始化配置中注册该事件来监听元信息变化:
let table = jspreadsheet(document.getElementById('spreadsheet'), { data: [ /* ... */ ], onchangemeta: function (instance, data) { console.log('Meta changed:', data); }, });这一点在官方 Quick Reference 的 Events 表中也有明确记载(onchangemeta: When a setMeta is called)。
六、完整可运行示例
以下为官方文档 meta-information.md 提供的完整示例,集成了上述全部 API:初始化时预置 meta、四个按钮分别演示“批量设置”“单键设置”“读取单格 meta”“读取全部 meta”。该示例同样可在仓库测试 test/meta.js 中找到对应的行为断言。
<html> <script src="https://bossanova.uk/jspreadsheet/v4/jspreadsheet.js"></script> <script src="https://jsuites.net/v5/jsuites.js"></script> <link rel="stylesheet" href="https://bossanova.uk/jspreadsheet/v4/jspreadsheet.css" type="text/css" /> <link rel="stylesheet" href="https://jsuites.net/v5/jsuites.css" type="text/css" /> <div id="spreadsheet"></div> <div id="console"></div> <script> let table = jspreadsheet(document.getElementById('spreadsheet'), { data: [ ['US', 'Apples', 'Yes', '2019-02-12'], ['CA;US;UK', 'Carrots', 'Yes', '2019-03-01'], ['CA;BR', 'Oranges', 'No', '2018-11-10'], ['BR', 'Coconuts', 'Yes', '2019-01-12'], ], columns: [ { type: 'dropdown', title: 'Product Origin', width: '300px', url: '/jspreadsheet/countries', autocomplete: true, multiple: true }, { type: 'text', title: 'Description', width: '200px' }, { type: 'dropdown', title: 'Stock', width: '100px', source: ['No','Yes'] }, { type: 'calendar', title: 'Best before', width: '100px' }, ], meta:{ A1: { myMeta: 'this is just a test', otherMetaInformation: 'other test' }, A2: { info: 'test' } } }); document.getElementById("setForMultiple").onclick = () => table.setMeta({ C1: { id:'1', y:'2019' }, C2: { id:'2' } }); document.getElementById("setForB2").onclick = () => table.setMeta('B2', 'myMetaData', prompt('myMetaData:')); document.getElementById("getFromA1").onclick = () => document.getElementById('console').innerHTML = JSON.stringify(table.getMeta('A1')); document.getElementById("getAll").onclick = () => document.getElementById('console').innerHTML =JSON.stringify(table.getMeta()); </script> <br/> <button type="button" id="setForMultiple">Set meta data for multiple columns</button> <button type="button" id="setForB2">Set a meta information for B2</button> <button type="button" id="getFromA1">Get the meta information from A1</button> <button type="button" id="getAll">Get all meta information</button> </html>示例要点回顾:
- 初始化预置:
meta: { A1: {...}, A2: {...} }在表格创建时即为A1、A2附上隐藏信息; - 批量设置:点击 “Set meta data for multiple columns” 会为
C1、C2同时写入多属性 meta(合并语义,可反复追加); - 单键设置:点击 “Set a meta information for B2” 会弹出输入框,将用户输入值写入
B2的myMetaData属性; - 读取验证:点击 “Get the meta information from A1” 与 “Get all meta information” 会把对应 meta 以 JSON 形式输出到页面上的
#console区域。
七、进阶实践与注意事项
- Meta 与显示值相互独立:写入 meta 不会改变单元格显示内容,也不会触发
onchange数据变更事件(它触发的是独立的onchangemeta事件)。若需要在 meta 变化时联动刷新界面,请自行在onchangemeta回调中处理。 - 与
style、comments的区分:style控制单元格外观(CSS),comments用于用户可见的批注(带 UI 交互),而meta是纯程序内部数据,三者存储于options的不同字段,互不冲突,可按需组合使用(对应源码:src/utils/style.js、src/utils/comments.js与src/utils/meta.js)。 - 结构性操作后坐标自动迁移:基于
updateMeta的联动逻辑,插入/删除/移动行或列后,meta 会随单元格迁移到新坐标,你无需手动重设。这是从 internal.js 与 meta.js 的调用关系可以确认的行为。 - 不存在的坐标返回
null:getMeta('不存在meta的单元格')返回null而非抛错,读取前可放心使用,无需额外判空防御(有测试用例expect(instance[0].getMeta('A2')).to.equal(null)佐证)。 - meta 不参与导出:meta 属于隐藏信息,不会出现在 CSV 下载、复制粘贴等导出行为中,适合存放“仅供程序内部使用”的数据。
八、验证与测试
仓库在 test/meta.js 中提供了完整的 Meta 功能测试,覆盖三条核心行为链路:
Set meta information using an object:验证对象批量设置的合并语义(后设的属性追加到已有对象上,不覆盖旧属性);Set meta information using strings:验证setMeta('A1', key, value)单键写入,以及同一单元格多属性累积;Get meta information:验证初始化meta参数的读取,包括全量读取、单格读取与无 meta 单元格返回null。
这些测试与官方示例互为印证,可作为你集成 Meta 功能时的行为契约参考。
小结
Jspreadsheet v4 的 Meta Information 提供了一套轻量、灵活的“单元格隐藏数据”方案:通过meta初始化参数预置数据,通过setMeta(对象批量 / 单键两种形态)动态写入,通过getMeta全量或定点读取,并通过onchangemeta事件感知变化。其底层实现(src/utils/meta.js)以options.meta为唯一数据源,与单元格值、样式、批注完全解耦,且在行列结构变更时会自动完成坐标迁移,适合作为业务数据的隐形载体,是构建复杂交互表格时的实用利器。
- 前端
- UI组件
【免费下载链接】ce
Jspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.
相关推荐
Jspreadsheet 单元格元数据(Cell Meta Information)完全指南:隐藏数据的管理、事件与实战
Jspreadsheet 单元格元数据(Cell Meta Information)完全指南:隐藏数据的管理、事件与实战 Jspreadsheet 的单元格元数
前端UI组件Jspreadsheet v3 单元格元信息(Meta Information)实战指南:getMeta / setMeta 隐藏数据管理
Jspreadsheet v3 单元格元信息(Meta Information)实战指南:getMeta / setMeta 隐藏数据管理 Jspreadshe
前端UI组件Jspreadsheet 单元格元数据(Meta Information)管理指南:setMeta 与 getMeta 的完整实践
Jspreadsheet 单元格元数据(Meta Information)管理指南:setMeta 与 getMeta 的完整实践 本文聚焦 Jspreadsh
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考