From e89681af84cb2a6ef708d414fb963f58b449b30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9=20Larivi=C3=A8re?= Date: Mon, 19 Feb 2024 16:53:39 +0100 Subject: [PATCH] Destroy component on arg change --- src/Fabulous/MvuComponent.fs | 15 +++++++++++++++ src/Fabulous/View.fs | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/Fabulous/MvuComponent.fs b/src/Fabulous/MvuComponent.fs index a93978a72..502e278c5 100644 --- a/src/Fabulous/MvuComponent.fs +++ b/src/Fabulous/MvuComponent.fs @@ -1,5 +1,6 @@ namespace Fabulous +open System open System.Runtime.CompilerServices [] @@ -88,6 +89,20 @@ module MvuComponent = let Data = Attributes.defineSimpleScalar "MvuComponent_Data" ScalarAttributeComparers.noCompare (fun _ _ _ -> ()) + + let canReuseMvuComponent (prev: Widget) (curr: Widget) = + let prevData = + match prev.ScalarAttributes with + | ValueSome attrs when attrs.Length > 0 -> attrs[0].Value :?> MvuComponentData + | _ -> failwith "Component widget must have a body" + + let currData = + match curr.ScalarAttributes with + | ValueSome attrs when attrs.Length > 0 -> attrs[0].Value :?> MvuComponentData + | _ -> failwith "Component widget must have a body" + + // NOTE: Somehow using = here crashes the app and prevents debugging... + Object.Equals(prevData.Arg, currData.Arg) /// Delegate used by the MvuComponentBuilder to compose a component body /// It will be aggressively inlined by the compiler leaving no overhead, only a pure function that returns a WidgetBuilder diff --git a/src/Fabulous/View.fs b/src/Fabulous/View.fs index bd0813e1f..08acdaa96 100644 --- a/src/Fabulous/View.fs +++ b/src/Fabulous/View.fs @@ -8,6 +8,8 @@ module ViewHelpers = false else if (prevKey = Memo.MemoWidgetKey) then Memo.canReuseMemoizedWidget prevWidget currWidget + else if (prevKey = MvuComponent.WidgetKey) then + MvuComponent.canReuseMvuComponent prevWidget currWidget else true