From 6003f7569be919685db1cdfd2150e12e56b1801c Mon Sep 17 00:00:00 2001 From: "ian.lxl" Date: Thu, 24 Jul 2025 20:22:48 +0800 Subject: [PATCH] fix: basic shapes update --- packages/f-engine/src/canvas/render/index.ts | 6 ++- ...75\242\346\233\264\346\226\260-1-snap.png" | Bin 0 -> 3473 bytes .../test/canvas/render/vnodeUpdate.test.tsx | 37 ++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 "packages/f-engine/test/canvas/render/__image_snapshots__/vnode-update-test-tsx-vnode-\346\233\264\346\226\260-\345\237\272\347\241\200\345\233\276\345\275\242\346\233\264\346\226\260-1-snap.png" diff --git a/packages/f-engine/src/canvas/render/index.ts b/packages/f-engine/src/canvas/render/index.ts index 35a8fbc7..f1381c6a 100644 --- a/packages/f-engine/src/canvas/render/index.ts +++ b/packages/f-engine/src/canvas/render/index.ts @@ -188,14 +188,16 @@ function createElement(parent: VNode, element: JSX.Element): VNode | VNode[] | n function destroyElement(vNode: VNode | VNode[] | null) { Children.map(vNode, (node: VNode | null) => { if (!node) return; - const { component, children } = node; + const { component, children, shape, tag } = node; if (component) { component.willUnmount(); destroyElement(children); component.didUnmount(); component.destroy(); - } else { + } else if (children) { destroyElement(children); + } else if (tag === Shape && shape) { + shape.destroy(); } }); } diff --git "a/packages/f-engine/test/canvas/render/__image_snapshots__/vnode-update-test-tsx-vnode-\346\233\264\346\226\260-\345\237\272\347\241\200\345\233\276\345\275\242\346\233\264\346\226\260-1-snap.png" "b/packages/f-engine/test/canvas/render/__image_snapshots__/vnode-update-test-tsx-vnode-\346\233\264\346\226\260-\345\237\272\347\241\200\345\233\276\345\275\242\346\233\264\346\226\260-1-snap.png" new file mode 100644 index 0000000000000000000000000000000000000000..c64c72b415e5c189913208864f4ece439d28d8c6 GIT binary patch literal 3473 zcmeH~>o?o!7RTc^Kb2}-+K#45D_wKSQAUahf{?aU(dslr+#;+VQ&VlVB6STRYep@4 z%;|BdYpaS%g!Dq1xP)qtkqCMricr^-Opr!gBTisagFf`{u-X5m{62oQU^js17NQZn)V&lM6 zogrEDo*|qrZTi{V$1nS=v8k}`d;OR$Q95rH$bBoWrL+SMzw&+4THA?kd0Q6~#cN7Vx1`H|QLxtjfW8jL zP%(MX0CZfL{(m7_fF~;q1feUr)Cgs7UED(u3N4JGLNY4$8P->zaQgWWtF_ zkU3~y%g@*khX*xi0buf33`<`gfKE^jY>){Di@0v=20<>pu_S!Ku1YbF`-r%rN3Io?Px+7Dk|)dr=I zmU3Sh(}qm$YA1$oeK49GKce6_!^X|96{H2CVAh_UKl^+sX07Jk~48&&Gqou_t4 zcNACTB^`?lH`|jaW;%hue>KPRs^HX*sb}teSrO2(JmXirT?9x;ZvN!+w9%w8ZvNf( ztLJS>(?r_`vXmWe#h5+XDm_O2Gg8l^9A6wWrlK}^b>h818H&%(BCdDrYcsWRRw8B# zIShgE(umk~aTO~P?DFb1bAIIOdMIN$?4h!A#Dt;aV@WY^-RX>z4VkRDJCYywQxst$ zCJA4ZR7+NC-J*X`RzD&?E|j*!bHZ6nz;PKMEB*6qCpck$KMV_#Gov-YLDl=BxQxnxV3f7 zmGZA^Z*2)Tj5CfJMPFyFZpTC@$_5K~EgMfLChKQKo(kEd*sMj~Bzd8dM&_yIw}!hz z9u{<74ZniJQ7$5fAB?PYeWwPuDl1;kWv>$v>sPO|Hq`!J-4YxJcok%?q0crk!B96US3E?HZf7| zite=J;l}6AV~Vj>zZk^;%*DVycugq3?3!h@pvb$DF{B;Sz5FPYfhCN#W^RY(QR=Mv zWbFPOZ;6qdTo+r4vP&c2P4j8+fnNaTo}s?U$~g`r7=MF{QcXK}NmWSq|B==*O-i#S z+??zjwxVV7mtZpCA+B?w)w4HX!(Tz`B`t0T_#~8pKGv1ORA}*9KNWTFzQ)bnQzw1VWzIOO$$?ED5RU)!%r!fg7Dr>hk#h?frbb@ zL50gcbbFfyAi_dIeBz#(IM zmhc5x=6$kz{>vkgVXn&_#@nCySdp@@xN6#Lo=zj31i2o61r%Ft^SotpcCSvw&Nd?U z3E!V4?H(5$7iD$92XKH)cW8M)P@SLffFx?<3sS~E;w+{f|GZ;)F9r`(2v(Rfy>@9-e3iuT=dAi&fuv=C1$#4T@u+|WNg&qwKr zDM)8$AoiFh&7{dE?uKA;i00-?6$(vZIwt}`mz8E|mw`K5n!0s051}caU{qjAgs~cH z2%7p7IxfeEv=MIx z)Oqx9`fW za8%R|i6A8Te`C=ew97BCF3fH@G5F;4fBMk7)+ic6o6lcpC_!;=xm*Xp@pdXNvMrmS zxa>+9oOwnM$SIYuGkZs+*x38@Em1itd7`SbAL&Q!I0b@ILqtwr==%>*x9X%MDYy5@ zCVjrz#(ve!wuwniWX)F#;_d0@(QrB<^Z)3S27Ukl literal 0 HcmV?d00001 diff --git a/packages/f-engine/test/canvas/render/vnodeUpdate.test.tsx b/packages/f-engine/test/canvas/render/vnodeUpdate.test.tsx index 09137be0..6e444c7e 100644 --- a/packages/f-engine/test/canvas/render/vnodeUpdate.test.tsx +++ b/packages/f-engine/test/canvas/render/vnodeUpdate.test.tsx @@ -42,4 +42,41 @@ describe('vnode 更新', () => { expect(ref.current._vNode.props.update).toBe(true); }); + it('基础图形更新', async () => { + const context = createContext(); + const { props } = ( + + + + ); + + const canvas = new Canvas(props); + await canvas.render(); + + const { props: nextProps } = ( + + + + ); + await delay(500); + await canvas.update(nextProps); + + await delay(200); + expect(context).toMatchImageSnapshot(); + }); });