由 domain:ui @ objectui 派发席开出。证据是 objectui#8534 / PR #8825 为了选机制而做的那次测量的副产品 —— 那次测量本来是问「prop 会不会反映重排」,顺带把这个缺口量清楚了。此前没有任何人量过它。⛔ 未认领。
实测
domain:ui 的 dev 在真实 ObjectKanban 上通过真实 onDragEnd 驱动,用一个记录器捕获板子每次被渲染时收到的 columns prop:
| 读数 |
结果 |
| 亮对照 —— 跨列移动(已知会变) |
backlog:Beta | in_progress:Alpha —— 出现了新的 prop 快照 ⇒ 仪器接通 |
| 被测 —— 同列重排 |
prop 快照:backlog: → backlog: → backlog:Alpha,Beta,从不是 backlog:Beta,Alpha。DOM 显示 [Beta, Alpha],update() 被调用 0 次 |
⇒ DOM 变了,而没有任何东西被通知。
两条独立的代码路径印证该读数(派发席复测其一)
packages/plugin-kanban/src/ObjectKanban.tsx
:1081 _newIndex: number,
:1083 void _newIndex; ← 顺序索引被显式丢弃
handleDragEnd 的同列分支不调用任何回调;
handleCardMove 在 fromColumnId === toColumnId 时提前返回,并丢弃 newIndex。
⇒ 卡片顺序的真相只存在于组件本地 state 里。 列成员会回流(那正是点亮上面对照的东西),顺序从不。
后果
用户在一列内把卡片拖到新位置 ⇒ 它当场就动了(乐观更新,这一半是好的)⇒ 但没有任何东西被持久化 ⇒ 下一次 prop 变化(刷新、轮询、任何一次数据回流)会把它退回原样。
⚠️ 形状像数据丢失:用户做了一个动作、看见了它生效、之后它在没有任何提示的情况下消失。⛔ 不报错、不提示、不回滚动画。
⇒ 定级 p2:无数据损坏(顺序本来就没被存过),但用户可见、静默、且违背用户刚刚看到的反馈。⛔ 不抬 p1:没有落库的错值,重排本来就从未被声称会持久化。
⚠️ 这是产品缺口,不是回归
⛔ 长期如此,与 PR #8825 无关。 #8825 刻意原样保留了它 —— 动它正是那张卡的裁决明令围死的「不得为了同帧属性而破坏乐观重排」。⇒ ⛔ 承接者不要把本卡读成 #8825 的后续修复。
待判定(⛔ 派发席不代决)
- 同列顺序应不应该被持久化? 若应该,存到哪 —— 一个显式的排序字段?视图级的顺序覆盖?
- 若不应该,那么乐观更新就不该发生:今天的行为是「让用户以为成功了,然后悄悄撤销」,而一个当场就弹回、或者根本不允许同列拖拽的界面,虽然更笨但诚实。⚠️ 这一条是本卡真正的分叉点。
- 跨列移动会回流成员但不回流顺序 —— 落到目标列的哪个位置,是不是也在丢?(⚠️ 未测,承接者需自己量。)
⚠️ 承接约束
Dedup
⚠️ 派发席没有为本卡跑带亮对照的查重 ⇒ 上面没有「未见重复」的断言,承接者请自行查重。已知相邻:objectui#8534 / PR #8825(证据来源)· objectui#4138(被拒绝移动的回滚)。
来源
objectui#8534 · PR #8825 的 验收备注 第三条与其机制测量 · ObjectKanban.tsx:1079-1083
由
domain:ui @ objectui派发席开出。证据是 objectui#8534 / PR #8825 为了选机制而做的那次测量的副产品 —— 那次测量本来是问「prop 会不会反映重排」,顺带把这个缺口量清楚了。此前没有任何人量过它。⛔ 未认领。实测
domain:ui的 dev 在真实ObjectKanban上通过真实onDragEnd驱动,用一个记录器捕获板子每次被渲染时收到的columnsprop:backlog:Beta | in_progress:Alpha—— 出现了新的 prop 快照 ⇒ 仪器接通backlog:→backlog:→backlog:Alpha,Beta,从不是backlog:Beta,Alpha。DOM 显示[Beta, Alpha],update()被调用 0 次⇒ DOM 变了,而没有任何东西被通知。
两条独立的代码路径印证该读数(派发席复测其一)
handleDragEnd的同列分支不调用任何回调;handleCardMove在fromColumnId === toColumnId时提前返回,并丢弃newIndex。⇒ 卡片顺序的真相只存在于组件本地 state 里。 列成员会回流(那正是点亮上面对照的东西),顺序从不。
后果
用户在一列内把卡片拖到新位置 ⇒ 它当场就动了(乐观更新,这一半是好的)⇒ 但没有任何东西被持久化 ⇒ 下一次 prop 变化(刷新、轮询、任何一次数据回流)会把它退回原样。
⇒ 定级
p2:无数据损坏(顺序本来就没被存过),但用户可见、静默、且违背用户刚刚看到的反馈。⛔ 不抬 p1:没有落库的错值,重排本来就从未被声称会持久化。⛔ 长期如此,与 PR #8825 无关。 #8825 刻意原样保留了它 —— 动它正是那张卡的裁决明令围死的「不得为了同帧属性而破坏乐观重排」。⇒ ⛔ 承接者不要把本卡读成 #8825 的后续修复。
待判定(⛔ 派发席不代决)
KanbanImpl的镜子同步时机:那是 objectui#8534 / PR fix(plugin-kanban): align the columns mirror during render, not in an effect #8825 的,已落地。Dedup
来源
objectui#8534 · PR #8825 的
验收备注第三条与其机制测量 ·ObjectKanban.tsx:1079-1083