一、问题概述
NocoBase V2.0.30 中,当主表配置了「隐藏所有子表」的字段联动规则,子表内配置了字段联动(无论 JS 赋值还是原生字段赋值)时,快速连续输入子表内的数字字段,会触发子表独立重渲染,完全覆盖主表设置的子表隐藏状态,导致原本被隐藏的其他子表全部异常显示。
二、环境信息
- NocoBase 版本:V2.0.30
- 部署方式:Docker(通用场景)
- 浏览器:Chrome / Edge 最新版(多浏览器均复现)
三、100% 复现步骤
- 创建一个主表,添加多个子表组件(如子表 A、子表 B、子表 C)
- 在主表的「字段联动规则」中,配置一条置顶规则:
- 条件:恒成立(如「当前记录 ID 不为空」,确保表单加载即执行)
- 动作:隐藏所有子表(A、B、C 全部勾选)
- 给其中一个子表(如子表 A)配置字段联动:
- 条件:子表 A 内的「金额」数字字段 不为空
- 动作:字段赋值,将「金额」字段的值赋值给子表 A 内的「大写人民币」文本字段(无论使用原生赋值还是自定义 JS 代码赋值,均会触发)
- 保存表单配置,进入表单编辑页面
- 操作测试:
- 单字符输入子表 A 的「金额」字段:其他子表(B、C)保持隐藏,符合预期
- 快速连续输入 2 个及以上数字(如连续输入「12」):原本被隐藏的子表 B、C 全部异常显示,主表的隐藏规则完全失效
四、关键现象与验证(排除无关因素)
- 与 JS 代码完全无关:即使将子表联动的赋值方式改为原生「字段赋值」(无任何自定义 JS),该问题依然 100% 复现
- 与事件流、CSS 等无关:关闭所有事件流、无自定义 CSS,仅保留主表隐藏联动 + 子表字段联动,问题依然存在
- 触发源明确:通过浏览器控制台日志可见,连续输入时会触发大量子表独立的
beforeRender/formValuesChange事件,主表的隐藏联动规则未被触发,子表重渲染时直接恢复为设计时的默认显示状态,覆盖主表的隐藏状态 - 输入频率是关键:单字符输入(无连续触发)正常,连续输入(连续触发子表重渲染)必现问题
五、根因分析(用户侧可验证结论)
- 主表的「子表隐藏」联动规则,仅在主表字段变更时触发,子表内的字段变更不会触发主表联动执行
- 子表内的任何字段联动(无论原生还是 JS),每一次字段值变更都会触发子表独立重渲染
- 子表独立重渲染时,完全无视主表之前设置的子表隐藏状态,直接恢复子表在表单设计时的默认显示状态(即显示)
- 快速连续输入数字时,子表字段连续多次变更,触发连续多次子表独立重渲染,主表隐藏规则全程无机会执行,最终导致所有隐藏子表全部显示