From 3b2f5e67b1ceee3dac9bf8a918545a14d8d90366 Mon Sep 17 00:00:00 2001 From: daiwei Date: Fri, 15 Nov 2024 10:02:00 +0800 Subject: [PATCH 1/3] fix(ssr): handle initial selected state for select with v-model + v-for option --- .../compiler-ssr/__tests__/ssrVModel.spec.ts | 22 +++++++++++++++++++ .../compiler-ssr/src/transforms/ssrVModel.ts | 16 +++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/packages/compiler-ssr/__tests__/ssrVModel.spec.ts b/packages/compiler-ssr/__tests__/ssrVModel.spec.ts index f2c04f0a5e8..a989de7f8d1 100644 --- a/packages/compiler-ssr/__tests__/ssrVModel.spec.ts +++ b/packages/compiler-ssr/__tests__/ssrVModel.spec.ts @@ -52,6 +52,28 @@ describe('ssr: v-model', () => { }" `) + expect( + compileWithWrapper( + ``, + ).code, + ).toMatchInlineSnapshot(` + "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs, ssrRenderList: _ssrRenderList } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + _push(\`\`) + }" + `) + expect( compileWithWrapper( ``, diff --git a/packages/compiler-ssr/src/transforms/ssrVModel.ts b/packages/compiler-ssr/src/transforms/ssrVModel.ts index 9a645397e1a..ba0c0a15c67 100644 --- a/packages/compiler-ssr/src/transforms/ssrVModel.ts +++ b/packages/compiler-ssr/src/transforms/ssrVModel.ts @@ -5,6 +5,7 @@ import { type ExpressionNode, NodeTypes, type PlainElementNode, + type TemplateChildNode, createCallExpression, createConditionalExpression, createDOMCompilerError, @@ -162,11 +163,16 @@ export const ssrTransformModel: DirectiveTransform = (dir, node, context) => { checkDuplicatedValue() node.children = [createInterpolation(model, model.loc)] } else if (node.tag === 'select') { - node.children.forEach(child => { - if (child.type === NodeTypes.ELEMENT) { - processOption(child as PlainElementNode) - } - }) + const processChildren = (children: TemplateChildNode[]) => { + children.forEach(child => { + if (child.type === NodeTypes.ELEMENT) { + processOption(child as PlainElementNode) + } else if (child.type === NodeTypes.FOR) { + processChildren(child.children) + } + }) + } + processChildren(node.children) } else { context.onError( createDOMCompilerError( From 32cc83da0ba0ad02f1bbc732ed3e25443e4c0282 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 15 Nov 2024 22:17:56 +0800 Subject: [PATCH 2/3] Update ssrVModel.ts --- packages/compiler-ssr/src/transforms/ssrVModel.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/compiler-ssr/src/transforms/ssrVModel.ts b/packages/compiler-ssr/src/transforms/ssrVModel.ts index ba0c0a15c67..80e3839318b 100644 --- a/packages/compiler-ssr/src/transforms/ssrVModel.ts +++ b/packages/compiler-ssr/src/transforms/ssrVModel.ts @@ -169,6 +169,8 @@ export const ssrTransformModel: DirectiveTransform = (dir, node, context) => { processOption(child as PlainElementNode) } else if (child.type === NodeTypes.FOR) { processChildren(child.children) + } else if (child.type === NodeTypes.IF) { + child.branches.forEach(b => processChildren(b.children)) } }) } From ea204aadbd72ba39bbe3bdc102b386dfe368d7f0 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 15 Nov 2024 22:19:10 +0800 Subject: [PATCH 3/3] test: add v-if option ssr v-model test case --- .../compiler-ssr/__tests__/ssrVModel.spec.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/compiler-ssr/__tests__/ssrVModel.spec.ts b/packages/compiler-ssr/__tests__/ssrVModel.spec.ts index a989de7f8d1..0bf7673d00d 100644 --- a/packages/compiler-ssr/__tests__/ssrVModel.spec.ts +++ b/packages/compiler-ssr/__tests__/ssrVModel.spec.ts @@ -74,6 +74,30 @@ describe('ssr: v-model', () => { }" `) + expect( + compileWithWrapper( + ``, + ).code, + ).toMatchInlineSnapshot(` + "const { ssrRenderAttr: _ssrRenderAttr, ssrIncludeBooleanAttr: _ssrIncludeBooleanAttr, ssrLooseContain: _ssrLooseContain, ssrLooseEqual: _ssrLooseEqual, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + _push(\`\`) + }" + `) + expect( compileWithWrapper( ``,