]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
chore: update edison/fix/12770 12825/head
authordaiwei <daiwei521@126.com>
Sat, 8 Feb 2025 06:07:01 +0000 (14:07 +0800)
committerdaiwei <daiwei521@126.com>
Sat, 8 Feb 2025 06:07:01 +0000 (14:07 +0800)
packages/runtime-core/__tests__/rendererComponent.spec.ts
packages/runtime-core/src/componentRenderUtils.ts

index ca77789ad3bc14c2ab6d1d93de23b5fa5adca182..75b0a5de457fb8d65cf4a5903758b5134f935897 100644 (file)
@@ -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()
 
index f093cc328e81422ad27a0189e3c2ef8cab865225..d8563835b5a38e3b53f9a35a66acc128fcf64fca 100644 (file)
@@ -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