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 00000000..c64c72b4 Binary files /dev/null and "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" differ 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(); + }); });