From: Evan You Date: Tue, 4 Feb 2025 05:11:51 +0000 (+0800) Subject: wip(vapor): optimize vapor interop update X-Git-Tag: v3.6.0-alpha.1~16^2~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f09e34396289f88deede3f6063be2db556a4f00f;p=thirdparty%2Fvuejs%2Fcore.git wip(vapor): optimize vapor interop update --- diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 8083e9d198..a81c6b433b 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -189,7 +189,7 @@ export interface VaporInVDOMInterface { anchor: any, parentComponent: ComponentInternalInstance | null, ): GenericComponentInstance // VaporComponentInstance - update(n1: VNode, n2: VNode): void + update(n1: VNode, n2: VNode, shouldUpdate: boolean): void unmount(vnode: VNode, doRemove?: boolean): void move(vnode: VNode, container: any, anchor: any): void } diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 182d8a99a7..0a745a90b8 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -1158,7 +1158,11 @@ function baseCreateRenderer( parentComponent, ) } else { - getVaporInterface(parentComponent).update(n1, n2) + getVaporInterface(parentComponent).update( + n1, + n2, + shouldUpdateComponent(n1, n2, optimized), + ) } } else if (n1 == null) { if (n2.shapeFlag & ShapeFlags.COMPONENT_KEPT_ALIVE) { diff --git a/packages/runtime-vapor/src/vdomInterop.ts b/packages/runtime-vapor/src/vdomInterop.ts index a515c853d6..aed0365cf4 100644 --- a/packages/runtime-vapor/src/vdomInterop.ts +++ b/packages/runtime-vapor/src/vdomInterop.ts @@ -1,7 +1,5 @@ import { - type GenericComponentInstance, type Plugin, - type VNode, type VaporInVDOMInterface, currentInstance, shallowRef, @@ -16,12 +14,7 @@ import { import { insert } from './block' const vaporInVDOMInterface: VaporInVDOMInterface = { - mount( - vnode: VNode, - container: ParentNode, - anchor: Node, - parentComponent: GenericComponentInstance | null, - ) { + mount(vnode, container, anchor, parentComponent) { const selfAnchor = (vnode.anchor = document.createComment('vapor')) container.insertBefore(selfAnchor, anchor) const prev = currentInstance @@ -37,19 +30,20 @@ const vaporInVDOMInterface: VaporInVDOMInterface = { return instance }, - update(n1: VNode, n2: VNode) { + update(n1, n2, shouldUpdate) { n2.component = n1.component - // TODO if has patchFlag, do simple diff to skip unnecessary updates - ;(n2.component as any as VaporComponentInstance).rawPropsRef!.value = - n2.props + if (shouldUpdate) { + ;(n2.component as any as VaporComponentInstance).rawPropsRef!.value = + n2.props + } }, - unmount(vnode: VNode, doRemove?: boolean) { + unmount(vnode, doRemove) { const container = doRemove ? vnode.anchor!.parentNode : undefined unmountComponent(vnode.component as any, container) }, - move(vnode: VNode, container: ParentNode, anchor: Node) { + move(vnode, container, anchor) { insert(vnode.component as any, container, anchor) insert(vnode.anchor as any, container, anchor) },