]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip(ssr): v-for
authorEvan You <yyx990803@gmail.com>
Mon, 3 Feb 2020 23:30:56 +0000 (18:30 -0500)
committerEvan You <yyx990803@gmail.com>
Mon, 3 Feb 2020 23:31:11 +0000 (18:31 -0500)
packages/compiler-core/src/ast.ts
packages/compiler-core/src/codegen.ts
packages/compiler-core/src/index.ts
packages/compiler-core/src/transforms/vFor.ts
packages/compiler-ssr/src/transforms/ssrVFor.ts

index ac8f89c4324058350487ee2198a4bd1db45ce014..d35530d6e1aef6bf0ae833ad32608d071125fe52 100644 (file)
@@ -229,6 +229,7 @@ export interface ForNode extends Node {
   valueAlias: ExpressionNode | undefined
   keyAlias: ExpressionNode | undefined
   objectIndexAlias: ExpressionNode | undefined
+  parseResult: ForParseResult
   children: TemplateChildNode[]
   codegenNode?: ForCodegenNode
 }
@@ -619,7 +620,7 @@ export function createCallExpression<T extends CallExpression['callee']>(
 
 export function createFunctionExpression(
   params: FunctionExpression['params'],
-  returns: FunctionExpression['returns'],
+  returns: FunctionExpression['returns'] = undefined,
   newline: boolean = false,
   isSlot: boolean = false,
   loc: SourceLocation = locStub
index b794f3f82e80346df8d6c319a63ddcfd850e0bd0..726ea38a4b2963c8a09bf6d6a3ccef4b7b59c172 100644 (file)
@@ -439,8 +439,12 @@ function genNodeList(
       genNode(node, context)
     }
     if (i < nodes.length - 1) {
-      comma && push(',')
-      multilines && newline()
+      if (multilines) {
+        comma && push(',')
+        newline()
+      } else {
+        comma && push(', ')
+      }
     }
   }
 }
index 6b63067d13ab8f262e400ad510d8472629a0476e..c9c80e5737249ef5548769b7214d74a599cc5ffe 100644 (file)
@@ -33,7 +33,7 @@ export { transformOn } from './transforms/vOn'
 
 // exported for compiler-ssr
 export { processIfBranches } from './transforms/vIf'
-export { processForNode } from './transforms/vFor'
+export { processForNode, createForLoopParams } from './transforms/vFor'
 export {
   transformExpression,
   processExpression
index 077101ab5ed7e0f14c7c28f1c69633e4c8ca2643..9081cb3fa3e1c68b899860921a6e04ef9b81f680 100644 (file)
@@ -45,7 +45,7 @@ export const transformFor = createStructuralDirectiveTransform(
   'for',
   (node, dir, context) => {
     const { helper } = context
-    return processForNode(node, dir, context, (forNode, parseResult) => {
+    return processForNode(node, dir, context, forNode => {
       // create the loop render function expression now, and add the
       // iterator on exit after all children have been traversed
       const renderExp = createCallExpression(helper(RENDER_LIST), [
@@ -122,7 +122,7 @@ export const transformFor = createStructuralDirectiveTransform(
 
         renderExp.arguments.push(
           createFunctionExpression(
-            createForLoopParams(parseResult),
+            createForLoopParams(forNode.parseResult),
             childBlock,
             true /* force newline */
           )
@@ -137,10 +137,7 @@ export function processForNode(
   node: ElementNode,
   dir: DirectiveNode,
   context: TransformContext,
-  processCodegen?: (
-    forNode: ForNode,
-    parseResult: ForParseResult
-  ) => (() => void) | undefined
+  processCodegen?: (forNode: ForNode) => (() => void) | undefined
 ) {
   if (!dir.exp) {
     context.onError(
@@ -173,6 +170,7 @@ export function processForNode(
     valueAlias: value,
     keyAlias: key,
     objectIndexAlias: index,
+    parseResult,
     children: node.tagType === ElementTypes.TEMPLATE ? node.children : [node]
   }
 
@@ -188,7 +186,7 @@ export function processForNode(
     index && addIdentifiers(index)
   }
 
-  const onExit = processCodegen && processCodegen(forNode, parseResult)
+  const onExit = processCodegen && processCodegen(forNode)
 
   return () => {
     scopes.vFor--
index 49f8e998daa5853bd1b1404df5b015a116729073..8e03edf31eb3575e29d2a7bd3d92c9a6a8749077 100644 (file)
@@ -1,9 +1,18 @@
 import {
   createStructuralDirectiveTransform,
   ForNode,
-  processForNode
+  processForNode,
+  createCallExpression,
+  createFunctionExpression,
+  createForLoopParams,
+  createBlockStatement
 } from '@vue/compiler-dom'
-import { SSRTransformContext } from '../ssrCodegenTransform'
+import {
+  SSRTransformContext,
+  createChildContext,
+  processChildren
+} from '../ssrCodegenTransform'
+import { SSR_RENDER_LIST } from '../runtimeHelpers'
 
 // Plugin for the first transform pass, which simply constructs the AST node
 export const ssrTransformFor = createStructuralDirectiveTransform(
@@ -13,4 +22,17 @@ export const ssrTransformFor = createStructuralDirectiveTransform(
 
 // This is called during the 2nd transform pass to construct the SSR-sepcific
 // codegen nodes.
-export function processFor(node: ForNode, context: SSRTransformContext) {}
+export function processFor(node: ForNode, context: SSRTransformContext) {
+  const renderLoop = createFunctionExpression(
+    createForLoopParams(node.parseResult)
+  )
+  const childContext = createChildContext(context)
+  processChildren(node.children, childContext)
+  renderLoop.body = createBlockStatement(childContext.body)
+  context.pushStatement(
+    createCallExpression(context.helper(SSR_RENDER_LIST), [
+      node.source,
+      renderLoop
+    ])
+  )
+}