Browse Source

fix: Suspense should include into dynamic children (#653)

fix #649
likui 6 năm trước cách đây
mục cha
commit
ec63623fe8

+ 34 - 1
packages/runtime-core/__tests__/vnode.spec.ts

@@ -232,7 +232,7 @@ describe('vnode', () => {
   })
 
   describe('dynamic children', () => {
-    test('single call openBlock', () => {
+    test('with patchFlags', () => {
       const hoist = createVNode('div')
       let vnode1
       const vnode = (openBlock(),
@@ -259,5 +259,38 @@ describe('vnode', () => {
       expect(vnode.dynamicChildren).toStrictEqual([vnode1, vnode2])
       expect(vnode2.dynamicChildren).toStrictEqual([vnode3])
     })
+
+    test('with stateful component', () => {
+      const hoist = createVNode('div')
+      let vnode1
+      const vnode = (openBlock(),
+      createBlock('div', null, [
+        hoist,
+        (vnode1 = createVNode({}, null, 'text'))
+      ]))
+      expect(vnode.dynamicChildren).toStrictEqual([vnode1])
+    })
+
+    test('with functional component', () => {
+      const hoist = createVNode('div')
+      let vnode1
+      const vnode = (openBlock(),
+      createBlock('div', null, [
+        hoist,
+        (vnode1 = createVNode(() => {}, null, 'text'))
+      ]))
+      expect(vnode.dynamicChildren).toStrictEqual([vnode1])
+    })
+
+    test('with suspense', () => {
+      const hoist = createVNode('div')
+      let vnode1
+      const vnode = (openBlock(),
+      createBlock('div', null, [
+        hoist,
+        (vnode1 = createVNode(() => {}, null, 'text'))
+      ]))
+      expect(vnode.dynamicChildren).toStrictEqual([vnode1])
+    })
   })
 })

+ 1 - 0
packages/runtime-core/src/vnode.ts

@@ -274,6 +274,7 @@ export function createVNode(
     shouldTrack > 0 &&
     currentBlock !== null &&
     (patchFlag > 0 ||
+      shapeFlag & ShapeFlags.SUSPENSE ||
       shapeFlag & ShapeFlags.STATEFUL_COMPONENT ||
       shapeFlag & ShapeFlags.FUNCTIONAL_COMPONENT)
   ) {