]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
pref(runtime-vapor): refactor apiCreateIf
authordaiwei <daiwei521@126.com>
Mon, 30 Dec 2024 09:20:07 +0000 (17:20 +0800)
committerdaiwei <daiwei521@126.com>
Mon, 30 Dec 2024 09:20:07 +0000 (17:20 +0800)
packages/compiler-vapor/src/generators/if.ts
packages/runtime-vapor/src/apiCreateIf.ts

index f4a3e599fab5ff9b8c282f5f3784d92321d7e1fa..d59d8661814ccb5742e75589b61de704cebb69f3 100644 (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
 }
index e4035313931877375d28345f851ad91d47974084..bcf01e96eac0d18e6b9905e6ad18abff86e20d04 100644 (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
 }