From: daiwei Date: Thu, 12 Dec 2024 00:53:51 +0000 (+0800) Subject: chore: avoid merge setStyle and setDynamicProps into existing render effect X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=229acec4c7552734c6e51a7b4ad5b4fad6b69978;p=thirdparty%2Fvuejs%2Fcore.git chore: avoid merge setStyle and setDynamicProps into existing render effect --- diff --git a/packages/compiler-vapor/src/generators/prop.ts b/packages/compiler-vapor/src/generators/prop.ts index 90b39c77c3..f2ef494857 100644 --- a/packages/compiler-vapor/src/generators/prop.ts +++ b/packages/compiler-vapor/src/generators/prop.ts @@ -161,11 +161,11 @@ export function genPropValue( ) } -function getRuntimeHelper( +export function getRuntimeHelper( tag: string, keyName: string, modifier: '.' | '^' | undefined, -) { +): { helperName: VaporHelper; omitKey: boolean } { const tagName = tag.toUpperCase() let helperName: VaporHelper let omitKey = false diff --git a/packages/compiler-vapor/src/transform.ts b/packages/compiler-vapor/src/transform.ts index 6714c03cc3..f8484515c2 100644 --- a/packages/compiler-vapor/src/transform.ts +++ b/packages/compiler-vapor/src/transform.ts @@ -32,10 +32,12 @@ import { type IRSlots, type OperationNode, type RootIRNode, + type SetPropIRNode, type VaporDirectiveNode, } from './ir' import { isConstantExpression } from './utils' import { newBlock, newDynamic } from './transforms/utils' +import { getRuntimeHelper } from './generators/prop' export type NodeTransform = ( node: RootNode | TemplateChildNode, @@ -156,7 +158,8 @@ export class TransformContext { const existing = this.block.effect.find(e => looseEqual(e.identifiers, Array.from(ids)), ) - if (existing) { + const canMerge = isMergeableOperation(operations) + if (existing && canMerge) { existing.operations.push(...operations) } else { this.block.effect.push({ @@ -314,3 +317,33 @@ function extractIdentifiers(ids: Set, node: ExpressionNode) { ids.add((node as SimpleExpressionNode).content) } } + +function getSetPropHelperName(op: SetPropIRNode): string { + const { + prop: { key, modifier }, + tag, + } = op + + const { helperName } = getRuntimeHelper(tag, key.content, modifier) + return helperName +} + +function isMergeableOperation(operations: OperationNode[]): boolean { + // setStyle and setDynamicProps can't be merged into existing render effect, + // because they don't need to cache deps value. the existing render effect may cache deps value. + if (operations.some(op => op.type === IRNodeTypes.SET_DYNAMIC_PROPS)) { + return false + } + + if ( + operations.some( + op => + op.type === IRNodeTypes.SET_PROP && + getSetPropHelperName(op) === 'setStyle', + ) + ) { + return false + } + + return true +}