Repository navigation
修复:点了开关显示「已保存」,开关却纹丝不动
Field / BoolField 把 /settings 的响应整个丢掉了,界面只能等下一次轮询
(默认 30 秒)才更新。用户看到的是「已保存」但开关没动,退出重进设置页才显示新值
—— 因为那是重新拉了一次 /state。
文本框是同一个根因,只是症状不同:dirty 一直挂在 true 上,「未保存」不消失。
所有走 /settings 的控件都中招,不只是开关。
修法(两处,缺一不可)
-
/settings回一份完整状态快照(buildState()),不再只回
effective/defaults/ …。派生字段(工作区标题、解析出来的目录、回收站统计、
清理预览)根本不在原来的响应里,所以它们也必须一起回。这样客户端也不必再写
逐字段的合并逻辑 —— 少一处可以漏的地方。 -
面板新增「保存后广播」订阅:保存成功即把响应并回面板状态,并且作废在途的轮询
(否则一个更早发出的/state可能在保存之后才回来,把刚写进去的值盖回旧的
—— 那就变成了「有时候灵有时候不灵」)。
用订阅而不是给每个字段传 prop,是因为「保存后同步界面」这件事每个字段都必须做,
而漏掉一个的症状是静默的。订阅让新增字段自动获得这个行为 —— DangerZone 里嵌套的
那个字段正是传 prop 最容易漏掉的一处。
顺带:保存后显示的是宿主重算过的值
不是本地乐观值。所以非法输入被夹取(pollSeconds 填 99999 → 600)会立刻如实显示,
不用等半分钟;保存失败时开关也不会自己翻过去,而是显示宿主的错误。
测试脚手架修正:迷你 React 改成每个组件一份 hook 状态
以前整棵树共用一个扁平数组,于是「条件渲染掉一个带 hook 的子组件」会让它后面所有组件的
槽位整体前移,读到别的组件的状态 —— 测试里真的崩在 DangerZone 的 typed.trim() 上,
因为 typed 读到了相邻组件的 null。
真实 React 是按组件隔离 hook 的,所以那是脚手架在说谎,不是产品 bug。
但它会挡住正当的测试(比如测 enabled 开关),所以必须修。
测试
| 之前 | 现在 | |
|---|---|---|
| 宿主 | 59 | 59 |
| 客户端 | 20 | 24 |
新增 [J] 保存后界面立即同步(回归):切换开关后界面必须立刻反映新值
(且重渲染不产生额外请求)、保存文本框后要显示宿主夹取后的值且「未保存」消失、
版本小标可见、保存失败时开关保持原状并显示宿主错误。
该回归验证过:把
broadcastSettingsSaved(body)注释掉,测试立刻以
「保存后开关必须立刻反映新值」失败。
升级
插件安装后需要重启 DSH 才加载。升级请先「卸载」再装,然后重启。
重启后插件页标题右侧会显示 v1.0.1 —— 没看到就说明新构建还没生效。
完整变更:v1.0.0...v1.0.1