From: 三咲智子 Kevin Deng Date: Sat, 27 Jan 2024 19:28:27 +0000 (+0800) Subject: fix(compiler-vapor): don't mutate ast X-Git-Tag: v3.6.0-alpha.1~16^2~648 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3baff92b1fb033a1411223a009a8bf68c432037;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-vapor): don't mutate ast --- diff --git a/packages/compiler-vapor/src/transform.ts b/packages/compiler-vapor/src/transform.ts index 0c81c5e4c4..69b3573acd 100644 --- a/packages/compiler-vapor/src/transform.ts +++ b/packages/compiler-vapor/src/transform.ts @@ -404,14 +404,8 @@ export function createStructuralDirectiveTransform( return } const exitFns = [] - for (let i = 0; i < props.length; i++) { - const prop = props[i] + for (const prop of props) { if (prop.type === NodeTypes.DIRECTIVE && matches(prop.name)) { - // structural directives are removed to avoid infinite recursion - // also we remove them *before* applying so that it can further - // traverse itself in case it moves the node around - props.splice(i, 1) - i-- const onExit = fn(node, prop as VaporDirectiveNode, context) if (onExit) exitFns.push(onExit) } diff --git a/packages/compiler-vapor/src/transforms/vIf.ts b/packages/compiler-vapor/src/transforms/vIf.ts index a3c69307e9..d3f47fb375 100644 --- a/packages/compiler-vapor/src/transforms/vIf.ts +++ b/packages/compiler-vapor/src/transforms/vIf.ts @@ -65,16 +65,25 @@ export function createIfBranch( node.tagType !== ElementTypes.TEMPLATE ) { node = extend({}, node, { + type: NodeTypes.ELEMENT, + tag: 'template', + props: [], tagType: ElementTypes.TEMPLATE, - children: [node], - } as TemplateNode) + children: [ + extend({}, node, { + props: node.props.filter( + (p) => p.type !== NodeTypes.DIRECTIVE && p.name !== 'if', + ), + } as TemplateChildNode), + ], + } as Partial) context.node = node } const branch: BlockFunctionIRNode = { type: IRNodeTypes.BLOCK_FUNCTION, loc: dir.loc, - node: node, + node, templateIndex: -1, dynamic: { id: null,