pref(runtime-vapor): refactor apiCreateIf

This commit is contained in:
daiwei 2024-12-30 17:20:07 +08:00
parent ef6986fbc3
commit 8ca43b5c93
2 changed files with 20 additions and 18 deletions

View File

@ -13,7 +13,7 @@ export function genIf(
const { condition, positive, negative, once } = oper
const [frag, push] = buildCodeFragment()
const conditionExpr: CodeFragment[] = [
const codes: CodeFragment[] = [
'() => (',
...genExpression(condition, context),
')',
@ -23,23 +23,27 @@ export function genIf(
let negativeArg: false | CodeFragment[] = false
if (negative) {
positiveArg.unshift(' ? ')
negativeArg = [' : ']
if (negative.type === IRNodeTypes.BLOCK) {
negativeArg = genBlock(negative, context)
negativeArg.push(...genBlock(negative, context))
} else {
negativeArg = ['() => ', ...genIf(negative!, context, true)]
negativeArg.push(...genIf(negative!, context, true))
}
} else {
positiveArg.unshift(' && (')
positiveArg.push(')')
}
if (!isNested) push(NEWLINE, `const n${oper.id} = `)
push(
...genCall(
helper('createIf'),
conditionExpr,
positiveArg,
negativeArg,
once && 'true',
),
)
codes.push(...positiveArg)
if (negativeArg) codes.push(...negativeArg)
if (isNested) {
push(...codes)
} else {
push(NEWLINE, `const n${oper.id} = `)
push(...genCall(helper('createIf'), codes, once && 'true'))
}
return frag
}

View File

@ -2,17 +2,15 @@ import { type BlockFn, DynamicFragment } from './block'
import { renderEffect } from './renderEffect'
export function createIf(
condition: () => any,
b1: BlockFn,
b2?: BlockFn,
ifBlockFn: () => BlockFn,
once?: boolean,
// hydrationNode?: Node,
): DynamicFragment {
const frag = __DEV__ ? new DynamicFragment('if') : new DynamicFragment()
if (once) {
frag.update(condition() ? b1 : b2)
frag.update(ifBlockFn())
} else {
renderEffect(() => frag.update(condition() ? b1 : b2))
renderEffect(() => frag.update(ifBlockFn()))
}
return frag
}