]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): avoid hoisted vnodes retaining detached DOM nodes
authorEvan You <yyx990803@gmail.com>
Tue, 27 Sep 2022 08:20:43 +0000 (16:20 +0800)
committerEvan You <yyx990803@gmail.com>
Tue, 27 Sep 2022 08:20:52 +0000 (16:20 +0800)
fix #6591

packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts
packages/compiler-core/src/transforms/hoistStatic.ts
packages/runtime-core/src/vnode.ts

index 2c4421aeb3b42e973cff7531037d76e65142eb7d..eec5a76d3637313742bf17dbaa085bfe9418c0f4 100644 (file)
@@ -13,7 +13,6 @@ import {
 import {
   FRAGMENT,
   RENDER_LIST,
-  CREATE_TEXT,
   NORMALIZE_CLASS
 } from '../../src/runtimeHelpers'
 import { transformElement } from '../../src/transforms/transformElement'
@@ -378,36 +377,6 @@ describe('compiler: hoistStatic transform', () => {
     expect(generate(root).code).toMatchSnapshot()
   })
 
-  test('hoist static text node between elements', () => {
-    const root = transformWithHoist(`<div>static<div>static</div></div>`)
-    expect(root.hoists).toMatchObject([
-      {
-        callee: CREATE_TEXT,
-        arguments: [
-          {
-            type: NodeTypes.TEXT,
-            content: `static`
-          }
-        ]
-      },
-      {
-        type: NodeTypes.VNODE_CALL,
-        tag: `"div"`
-      },
-      {
-        type: NodeTypes.JS_ARRAY_EXPRESSION,
-        elements: [
-          {
-            type: NodeTypes.TEXT_CALL
-          },
-          {
-            type: NodeTypes.ELEMENT
-          }
-        ]
-      }
-    ])
-  })
-
   describe('prefixIdentifiers', () => {
     test('hoist nested static tree with static interpolation', () => {
       const root = transformWithHoist(
@@ -618,7 +587,9 @@ describe('compiler: hoistStatic transform', () => {
     })
 
     test('should NOT hoist SVG with directives', () => {
-      const root = transformWithHoist(`<div><svg v-foo><path d="M2,3H5.5L12"/></svg></div>`)
+      const root = transformWithHoist(
+        `<div><svg v-foo><path d="M2,3H5.5L12"/></svg></div>`
+      )
       expect(root.hoists.length).toBe(2)
       expect(generate(root).code).toMatchSnapshot()
     })
index 848052581ed7dd134aa42d89f362874e450b897b..b2b7f871c0a1cba707947ec549267ddb2e8eaabe 100644 (file)
@@ -97,12 +97,6 @@ function walk(
           }
         }
       }
-    } else if (
-      child.type === NodeTypes.TEXT_CALL &&
-      getConstantType(child.content, context) >= ConstantTypes.CAN_HOIST
-    ) {
-      child.codegenNode = context.hoist(child.codegenNode)
-      hoistedCount++
     }
 
     // walk further
index 6a43d97d7d761e5e5092154e162f556c1d2b09cf..b731dc0b51f3887847a0a514aed7730ab1743688 100644 (file)
@@ -737,7 +737,10 @@ export function normalizeVNode(child: VNodeChild): VNode {
 
 // optimized normalization for template-compiled render fns
 export function cloneIfMounted(child: VNode): VNode {
-  return child.el === null || child.memo ? child : cloneVNode(child)
+  return (child.el === null && child.patchFlag !== PatchFlags.HOISTED) ||
+    child.memo
+    ? child
+    : cloneVNode(child)
 }
 
 export function normalizeChildren(vnode: VNode, children: unknown) {