valueAlias: ExpressionNode | undefined
keyAlias: ExpressionNode | undefined
objectIndexAlias: ExpressionNode | undefined
+ parseResult: ForParseResult
children: TemplateChildNode[]
codegenNode?: ForCodegenNode
}
export function createFunctionExpression(
params: FunctionExpression['params'],
- returns: FunctionExpression['returns'],
+ returns: FunctionExpression['returns'] = undefined,
newline: boolean = false,
isSlot: boolean = false,
loc: SourceLocation = locStub
genNode(node, context)
}
if (i < nodes.length - 1) {
- comma && push(',')
- multilines && newline()
+ if (multilines) {
+ comma && push(',')
+ newline()
+ } else {
+ comma && push(', ')
+ }
}
}
}
// exported for compiler-ssr
export { processIfBranches } from './transforms/vIf'
-export { processForNode } from './transforms/vFor'
+export { processForNode, createForLoopParams } from './transforms/vFor'
export {
transformExpression,
processExpression
'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), [
renderExp.arguments.push(
createFunctionExpression(
- createForLoopParams(parseResult),
+ createForLoopParams(forNode.parseResult),
childBlock,
true /* force newline */
)
node: ElementNode,
dir: DirectiveNode,
context: TransformContext,
- processCodegen?: (
- forNode: ForNode,
- parseResult: ForParseResult
- ) => (() => void) | undefined
+ processCodegen?: (forNode: ForNode) => (() => void) | undefined
) {
if (!dir.exp) {
context.onError(
valueAlias: value,
keyAlias: key,
objectIndexAlias: index,
+ parseResult,
children: node.tagType === ElementTypes.TEMPLATE ? node.children : [node]
}
index && addIdentifiers(index)
}
- const onExit = processCodegen && processCodegen(forNode, parseResult)
+ const onExit = processCodegen && processCodegen(forNode)
return () => {
scopes.vFor--
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(
// 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
+ ])
+ )
+}