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

This commit is contained in:
三咲智子 Kevin Deng 2024-05-12 18:13:25 +08:00
parent 76595deefb
commit 75314f2695
No known key found for this signature in database
5 changed files with 13 additions and 33 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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'

View File

@ -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)
}

View File

@ -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
}
}