From ffd6ac5289d13a52379a9a4427556fd7e0e47ad1 Mon Sep 17 00:00:00 2001 From: laoyang Date: Thu, 5 Nov 2026 12:45:43 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=A1=8C=E7=A8=8B=E5=8A=A0?= =?UTF-8?q?=E9=99=84=E4=BB=B6=EF=BC=9A=E7=94=A8=E5=BA=8F=E5=8F=B7=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E9=87=8D=E5=BB=BA=E6=B5=AE=E5=B1=82=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=9B=9E=E5=A1=AB=E4=B8=8D=E5=85=A8=20(#55)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:@Param editing 在 V2 里是单向同步 —— 父组件改 editNode 后子组件 的 editing 会更新,但 aboutToAppear 只在首次创建时跑一次。 ⇒ 换一条行程再点编辑时,editing 变了但回填不重跑 ⇒ photos 保留上次的值。 修法:加 nodeSheetSeq,点编辑时 +1,组件用 .id(nodeSheet_N) 绑定序号。 序号变化时 ArkUI 销毁旧组件、创建新组件 ⇒ aboutToAppear 必然重跑。 顺带:返回键关闭时也清 editNode,避免下次走到复用路径拿到上一条的 editing。 --- .../main/ets/pages/trips/FbTripDetailPage.ets | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/entry/src/main/ets/pages/trips/FbTripDetailPage.ets b/entry/src/main/ets/pages/trips/FbTripDetailPage.ets index c736015..5767f3c 100644 --- a/entry/src/main/ets/pages/trips/FbTripDetailPage.ets +++ b/entry/src/main/ets/pages/trips/FbTripDetailPage.ets @@ -386,6 +386,20 @@ export struct FbTripDetailPage { @Local editOpen: boolean = false; /** 「加一段行程」浮层:>0 = 开着,值 = 要往哪一趟加 */ @Local nodeSheetTripId: number = 0; + /** + * 行程浮层的**重建序号**(#55)。 + * + * 🔴 用户:「修改编辑行程,图片和视频带进来都不全。」 + * + * 根因:`@Param editing` 在 V2 里是单向同步 —— 父组件改了 `editNode`, + * 子组件的 `editing` 会更新,但 **`aboutToAppear` 只在首次创建时跑一次**。 + * ⇒ 换一条行程再点编辑时,`editing` 变了但**回填不会重跑** + * ⇒ `this.photos` 保留上一次的值(可能为空)⇒ 附件带不全。 + * + * ⇒ 用 `.id('nodeSheet_' + seq)` 让序号变化时 ArkUI **销毁旧组件、创建新组件** + * ⇒ `aboutToAppear` 必然重跑。这是"强制重建"最可靠的做法。 + */ + @Local nodeSheetSeq: number = 0; /** 加行程浮层的预选阶段('plan' / 'actual') */ @Local nodeSheetStage: string = 'plan'; /** @@ -459,6 +473,9 @@ export struct FbTripDetailPage { } if (this.nodeSheetTripId > 0) { this.nodeSheetTripId = 0; + /* #55:顺手清掉 editNode —— 否则下次打开若走到"复用"路径, + 会拿到上一条行程的 editing。 */ + this.editNode = null; return true; } if (this.vehiclesOpen) { @@ -729,6 +746,8 @@ export struct FbTripDetailPage { this.onNodeSaved(); } }) + /* #55:序号变化 ⇒ 强制重建 ⇒ 回填必然重跑 */ + .id('nodeSheet_' + this.nodeSheetSeq.toString()) .transition(fbSheetTransition()) } @@ -1224,7 +1243,10 @@ export struct FbTripDetailPage { 应该像网页端一样,做成两个按钮,颜色也尽可能保持一致。」) ⇒ 改成**胶囊按钮**:有底色、圆角、内边距,与网页端 `.btn-ghost` 同观感。 */ this.pillBtn('编辑', '#B8862B', false, (): void => { + /* ⚠️ 顺序:先给数据,再递增序号,最后开浮层。 + 序号 +1 ⇒ 组件 id 变化 ⇒ 强制重建 ⇒ aboutToAppear 重跑 ⇒ 回填生效。 */ this.editNode = n; + this.nodeSheetSeq = this.nodeSheetSeq + 1; this.nodeSheetTripId = this.tripId; this.nodeSheetStage = n.stage; })