]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): patchChildren first in patchElement (#4313)
author <31395977+leaon4@users.noreply.github.com>
Mon, 16 Aug 2021 19:46:27 +0000 (03:46 +0800)
committerGitHub <noreply@github.com>
Mon, 16 Aug 2021 19:46:27 +0000 (15:46 -0400)
packages/runtime-core/src/renderer.ts
packages/runtime-dom/__tests__/patchProps.spec.ts
packages/runtime-test/__tests__/testRuntime.spec.ts

index fb7e6a46c85f5a8f817bd6b753538bf61da654db..17eaaf44d5c63177a81bf569e4f336d310127c71 100644 (file)
@@ -840,6 +840,35 @@ function baseCreateRenderer(
       dynamicChildren = null
     }
 
+    const areChildrenSVG = isSVG && n2.type !== 'foreignObject'
+    if (dynamicChildren) {
+      patchBlockChildren(
+        n1.dynamicChildren!,
+        dynamicChildren,
+        el,
+        parentComponent,
+        parentSuspense,
+        areChildrenSVG,
+        slotScopeIds
+      )
+      if (__DEV__ && parentComponent && parentComponent.type.__hmrId) {
+        traverseStaticChildren(n1, n2)
+      }
+    } else if (!optimized) {
+      // full diff
+      patchChildren(
+        n1,
+        n2,
+        el,
+        null,
+        parentComponent,
+        parentSuspense,
+        areChildrenSVG,
+        slotScopeIds,
+        false
+      )
+    }
+
     if (patchFlag > 0) {
       // the presence of a patchFlag means this element's render code was
       // generated by the compiler and can take the fast path.
@@ -922,35 +951,6 @@ function baseCreateRenderer(
       )
     }
 
-    const areChildrenSVG = isSVG && n2.type !== 'foreignObject'
-    if (dynamicChildren) {
-      patchBlockChildren(
-        n1.dynamicChildren!,
-        dynamicChildren,
-        el,
-        parentComponent,
-        parentSuspense,
-        areChildrenSVG,
-        slotScopeIds
-      )
-      if (__DEV__ && parentComponent && parentComponent.type.__hmrId) {
-        traverseStaticChildren(n1, n2)
-      }
-    } else if (!optimized) {
-      // full diff
-      patchChildren(
-        n1,
-        n2,
-        el,
-        null,
-        parentComponent,
-        parentSuspense,
-        areChildrenSVG,
-        slotScopeIds,
-        false
-      )
-    }
-
     if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {
       queuePostRenderEffect(() => {
         vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1)
index abcfb2c7123728885a115e6d7cf72432d26af4c1..3d00e51ccfed1a714a1939a45a3ffcd6f3fd34cb 100644 (file)
@@ -192,4 +192,26 @@ describe('runtime-dom: props patching', () => {
     patchProp(el, 'size', 100, null)
     expect(el.getAttribute('size')).toBe(null)
   })
+
+  test('patch value for select', () => {
+    const root = document.createElement('div')
+    render(
+      h('select', { value: 'foo' }, [
+        h('option', { value: 'foo' }, 'foo'),
+        h('option', { value: 'bar' }, 'bar')
+      ]),
+      root
+    )
+    const el = root.children[0] as HTMLSelectElement
+    expect(el.value).toBe('foo')
+
+    render(
+      h('select', { value: 'baz' }, [
+        h('option', { value: 'foo' }, 'foo'),
+        h('option', { value: 'baz' }, 'baz')
+      ]),
+      root
+    )
+    expect(el.value).toBe('baz')
+  })
 })
index f3ca6eb2025c8d0b369b8e7c2518575e57e41a62..789ace25446c3784684a5324c1ca591e4cebfad4 100644 (file)
@@ -103,17 +103,17 @@ describe('test renderer', () => {
     expect(updateOps.length).toBe(2)
 
     expect(updateOps[0]).toEqual({
-      type: NodeOpTypes.PATCH,
+      type: NodeOpTypes.SET_ELEMENT_TEXT,
       targetNode: root.children[0],
-      propKey: 'id',
-      propPrevValue: 'test',
-      propNextValue: 'foo'
+      text: 'bar'
     })
 
     expect(updateOps[1]).toEqual({
-      type: NodeOpTypes.SET_ELEMENT_TEXT,
+      type: NodeOpTypes.PATCH,
       targetNode: root.children[0],
-      text: 'bar'
+      propKey: 'id',
+      propPrevValue: 'test',
+      propNextValue: 'foo'
     })
   })