]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-ssr): should pass necessary tag names for dynamic v-bind
authorEvan You <yyx990803@gmail.com>
Mon, 16 Mar 2020 22:24:26 +0000 (18:24 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 16 Mar 2020 22:24:26 +0000 (18:24 -0400)
packages/compiler-ssr/__tests__/ssrElement.spec.ts
packages/compiler-ssr/src/transforms/ssrTransformElement.ts

index c81d6ccb10e71ac18446cbc9cdd8c007460c0c3c..a3181f4e6638f27a571920a0ec636b84561b6188 100644 (file)
@@ -57,13 +57,27 @@ describe('ssr: element', () => {
           let _temp0
 
           _push(\`<textarea\${
-            _ssrRenderAttrs(_temp0 = _ctx.obj)
+            _ssrRenderAttrs(_temp0 = _ctx.obj, \\"textarea\\")
           }>\${
             _ssrInterpolate((\\"value\\" in _temp0) ? _temp0.value : \\"fallback\\")
           }</textarea>\`)
         }"
       `)
     })
+
+    test('should pass tag to custom elements w/ dynamic v-bind', () => {
+      expect(
+        compile(`<my-foo v-bind="obj"></my-foo>`, {
+          isCustomElement: () => true
+        }).code
+      ).toMatchInlineSnapshot(`
+        "const { ssrRenderAttrs: _ssrRenderAttrs } = require(\\"@vue/server-renderer\\")
+
+        return function ssrRender(_ctx, _push, _parent) {
+          _push(\`<my-foo\${_ssrRenderAttrs(_ctx.obj, \\"my-foo\\")}></my-foo>\`)
+        }"
+      `)
+    })
   })
 
   describe('attrs', () => {
index a23748a370a4b40f71e51dbd788d5f8e076a8392..d56315d4363b08df52a9ba8717b6fc805cdfcecf 100644 (file)
@@ -60,6 +60,9 @@ export const ssrTransformElement: NodeTransform = (node, context) => {
       // element
       // generate the template literal representing the open tag.
       const openTag: TemplateLiteral['elements'] = [`<${node.tag}`]
+      // some tags need to be pasesd to runtime for special checks
+      const needTagForRuntime =
+        node.tag === 'textarea' || node.tag.indexOf('-') > 0
 
       // v-bind="obj" or v-bind:[key] can potentially overwrite other static
       // attrs and can affect final rendering result, so when they are present
@@ -79,10 +82,12 @@ export const ssrTransformElement: NodeTransform = (node, context) => {
             // assign the merged props to a temp variable, and check whether
             // it contains value (if yes, render is as children).
             const tempId = `_temp${context.temps++}`
-            propsExp.arguments[0] = createAssignmentExpression(
-              createSimpleExpression(tempId, false),
-              props
-            )
+            propsExp.arguments = [
+              createAssignmentExpression(
+                createSimpleExpression(tempId, false),
+                props
+              )
+            ]
             const existingText = node.children[0] as TextNode | undefined
             rawChildrenMap.set(
               node,
@@ -125,6 +130,10 @@ export const ssrTransformElement: NodeTransform = (node, context) => {
             }
           }
 
+          if (needTagForRuntime) {
+            propsExp.arguments.push(`"${node.tag}"`)
+          }
+
           openTag.push(propsExp)
         }
       }
@@ -234,10 +243,14 @@ export const ssrTransformElement: NodeTransform = (node, context) => {
                   // dynamic key attr
                   // this branch is only encountered for custom directive
                   // transforms that returns properties with dynamic keys
+                  const args: CallExpression['arguments'] = [key, value]
+                  if (needTagForRuntime) {
+                    args.push(`"${node.tag}"`)
+                  }
                   openTag.push(
                     createCallExpression(
                       context.helper(SSR_RENDER_DYNAMIC_ATTR),
-                      [key, value]
+                      args
                     )
                   )
                 }