学习unigui【48】lucksheet表格的显示object


结论:[object Object] 这次不是普通的数据格式错误,根因是 V20 填报页运行在 iframe 中,父窗口传入的 Luckysheet JSON 对象和 iframe 内部 Luckysheet 运行时不在同一个 JS 对象域。
问题现象
V20 填报页打开报表时,部分单元格本应显示正常文本或公式结果,却显示成 [object Object]。
同时会出现几个误导点:
- 后端传来的 JSON 看起来是正常对象。
- 前端 typeof cell === 'object' 也成立。
- 手工把 m/v 转成字符串,短时间似乎能缓解。
- 但刷新公式、重绘 canvas、切换运行时缓存后,问题仍可能复现。
所以它表现像“某些单元格值没有格式化”,但实际不是简单的显示格式问题。
问题根因
关键点来自 Luckysheet issue dream-num/Luckysheet#1334 的启发:iframe 跨 JS realm 会导致对象身份判断失效。
V20 的数据流是:
父窗口/宿主页面生成 payload
-> 通过直接调用或消息传给 iframe
-> iframe 内的 Luckysheet 使用这些对象初始化
这里的坑是:
- 父窗口里的 Object 和 iframe 里的 Object 不是同一个构造器。
- 一个对象从父窗口传进 iframe 后,typeof value === 'object' 仍然为真。
- 但在 iframe 内执行 value instanceof Object 可能为假。
- Luckysheet 内部若依赖这类判断,就可能不把单元格对象当作对象处理。
- 最后对象被当作普通值渲染,字符串化后就变成 [object Object]。
这也是为什么之前一直在 m/v、celldata、flowdata、canvas 刷新上补丁,很难彻底解决。那些都是结果层修补,不是入口处修正对象域。
解决思路
正确收口点是在 luckysheet.create(...) 之前,把宿主传进来的 Luckysheet JSON 重新落到 iframe 当前 JS realm 内。
当前处理是:
function rehomeLuckysheetDataForIframe(data) {
if (!data || typeof data !== 'object') return data;
try {
return JSON.parse(JSON.stringify(data));
} catch (e) {
console.warn('[V20] iframe data rehome failed:', e);
return data;
}
}调用位置:
sheets = rehomeLuckysheetDataForIframe(sheets);它的意义不是业务清洗,也不是格式转换,而是“对象重新归属”:让传入 Luckysheet 的所有普通 JSON 对象都变成 iframe 自己上下文里的对象。
防回归要点
- 不要再把 [object Object] 首先当作 m/v 字符串问题。
- 不要在 workbookCreateAfter 后做全表运行时 normalize 作为常态路径。
- 不要靠二次 refreshFormula()、canvas 强刷、全量扫描来兜底。
- rehomeLuckysheetDataForIframe() 是 iframe 版 V20 的关键入口保护,不应删除。
- 公式链仍保留 calcChain / refreshFormula(),但避免向 setCellValue 写 { f: formula } 这类对象值。
一句话总结:
[object Object] 的根因是 iframe 跨对象域导致 Luckysheet 识别单元格对象失败;解决方式是在 Luckysheet 初始化前,把宿主传入的 JSON 深拷贝成 iframe 当前对象域里的数据。
浙公网安备 33010602011771号