From 93eafa2d2b4f4799091ff7a2716aae2dd31ac06f Mon Sep 17 00:00:00 2001 From: daiwei Date: Sat, 8 Feb 2025 14:07:01 +0800 Subject: [PATCH] chore: update --- .../__tests__/rendererComponent.spec.ts | 2 +- .../runtime-core/src/componentRenderUtils.ts | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/__tests__/rendererComponent.spec.ts b/packages/runtime-core/__tests__/rendererComponent.spec.ts index ca77789ad3b..75b0a5de457 100644 --- a/packages/runtime-core/__tests__/rendererComponent.spec.ts +++ b/packages/runtime-core/__tests__/rendererComponent.spec.ts @@ -476,7 +476,7 @@ describe('renderer: component', () => { ).toHaveBeenWarned() }) - test('should not update child component without changes', async () => { + test('should not update child component if style is not changed', async () => { const text = ref(0) const spy = vi.fn() diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index f093cc328e8..d8563835b5a 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -19,6 +19,7 @@ import { PatchFlags, ShapeFlags, isModelListener, + isObject, isOn, looseEqual, } from '@vue/shared' @@ -405,7 +406,7 @@ export function shouldUpdateComponent( for (let i = 0; i < dynamicProps.length; i++) { const key = dynamicProps[i] if ( - !looseEqual(nextProps![key], prevProps![key]) && + hasPropValueChanged(nextProps!, prevProps!, key) && !isEmitListener(emits, key) ) { return true @@ -447,7 +448,7 @@ function hasPropsChanged( for (let i = 0; i < nextKeys.length; i++) { const key = nextKeys[i] if ( - !looseEqual(nextProps[key], prevProps[key]) && + hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emitsOptions, key) ) { return true @@ -456,6 +457,19 @@ function hasPropsChanged( return false } +function hasPropValueChanged( + nextProps: Data, + prevProps: Data, + key: string, +): boolean { + const nextProp = nextProps[key] + const prevProp = prevProps[key] + if (key === 'style' && isObject(nextProp) && isObject(prevProp)) { + return !looseEqual(nextProp, prevProp) + } + return nextProp !== prevProp +} + export function updateHOCHostEl( { vnode, parent }: ComponentInternalInstance, el: typeof vnode.el, // HostNode