瀏覽代碼

fix(compiler-vapor): don't cache `v-once`

三咲智子 Kevin Deng 1 年之前
父節點
當前提交
75314f2695

+ 2 - 2
packages/compiler-vapor/__tests__/transforms/vIf.spec.ts

@@ -5,16 +5,16 @@ import {
   transformChildren,
   transformComment,
   transformElement,
-  transformOnce,
   transformText,
   transformVIf,
+  transformVOnce,
   transformVText,
 } from '../../src'
 import { NodeTypes } from '@vue/compiler-core'
 
 const compileWithVIf = makeCompile({
   nodeTransforms: [
-    transformOnce,
+    transformVOnce,
     transformVIf,
     transformText,
     transformElement,

+ 2 - 2
packages/compiler-vapor/src/compile.ts

@@ -14,7 +14,7 @@ import {
 } from './transform'
 import { type VaporCodegenResult, generate } from './generate'
 import { transformChildren } from './transforms/transformChildren'
-import { transformOnce } from './transforms/vOnce'
+import { transformVOnce } from './transforms/vOnce'
 import { transformElement } from './transforms/transformElement'
 import { transformVHtml } from './transforms/vHtml'
 import { transformVText } from './transforms/vText'
@@ -102,7 +102,7 @@ export function getBaseTransformPreset(
 ): TransformPreset {
   return [
     [
-      transformOnce,
+      transformVOnce,
       transformVIf,
       transformVFor,
       transformSlotOutlet,

+ 1 - 1
packages/compiler-vapor/src/index.ts

@@ -41,7 +41,7 @@ export { transformText } from './transforms/transformText'
 export { transformVBind } from './transforms/vBind'
 export { transformVHtml } from './transforms/vHtml'
 export { transformVOn } from './transforms/vOn'
-export { transformOnce } from './transforms/vOnce'
+export { transformVOnce } from './transforms/vOnce'
 export { transformVShow } from './transforms/vShow'
 export { transformVText } from './transforms/vText'
 export { transformVIf } from './transforms/vIf'

+ 2 - 20
packages/compiler-vapor/src/transforms/transformChildren.ts

@@ -1,10 +1,4 @@
-import {
-  type ElementNode,
-  ElementTypes,
-  NodeTypes,
-  type RootNode,
-  type TemplateChildNode,
-} from '@vue/compiler-dom'
+import { type ElementNode, ElementTypes, NodeTypes } from '@vue/compiler-dom'
 import {
   type NodeTransform,
   type TransformContext,
@@ -22,11 +16,7 @@ export const transformChildren: NodeTransform = (node, context) => {
   if (!isFragment && node.type !== NodeTypes.ELEMENT) return
 
   for (const [i, child] of node.children.entries()) {
-    const childContext = createContext(
-      child,
-      context as TransformContext<RootNode | ElementNode>,
-      i,
-    )
+    const childContext = context.create(child, i)
     transformNode(childContext)
 
     if (isFragment) {
@@ -96,11 +86,3 @@ function processDynamicChildren(context: TransformContext<ElementNode>) {
     })
   }
 }
-
-function createContext<T extends TemplateChildNode>(
-  node: T,
-  parent: TransformContext<RootNode | ElementNode>,
-  index: number,
-): TransformContext<T> {
-  return parent.create(node, index)
-}

+ 6 - 8
packages/compiler-vapor/src/transforms/vOnce.ts

@@ -1,14 +1,12 @@
 import { NodeTypes, findDir } from '@vue/compiler-dom'
 import type { NodeTransform } from '../transform'
 
-const seen = new WeakSet()
-
-export const transformOnce: NodeTransform = (node, context) => {
-  if (node.type === NodeTypes.ELEMENT && findDir(node, 'once', true)) {
-    if (seen.has(node) || context.inVOnce /* || context.inSSR */) {
-      return
-    }
-    seen.add(node)
+export const transformVOnce: NodeTransform = (node, context) => {
+  if (
+    // !context.inSSR &&
+    node.type === NodeTypes.ELEMENT &&
+    findDir(node, 'once', true)
+  ) {
     context.inVOnce = true
   }
 }