]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip(compiler-ssr): v-show
authorEvan You <yyx990803@gmail.com>
Wed, 5 Feb 2020 02:03:16 +0000 (21:03 -0500)
committerEvan You <yyx990803@gmail.com>
Wed, 5 Feb 2020 02:03:16 +0000 (21:03 -0500)
packages/compiler-core/src/codegen.ts
packages/compiler-ssr/__tests__/ssrVShow.spec.ts [new file with mode: 0644]
packages/compiler-ssr/src/transforms/ssrTransformElement.ts
packages/compiler-ssr/src/transforms/ssrVShow.ts

index b0acb69dae6b867abc25436b8e05df48bedc9b53..eba40cb0ce6bf152f0063e4fb2007e10f77acf7a 100644 (file)
@@ -699,10 +699,12 @@ function genConditionalExpression(
   }
   needNewline && indent()
   context.indentLevel++
+  needNewline || push(` `)
   push(`? `)
   genNode(consequent, context)
   context.indentLevel--
   needNewline && newline()
+  needNewline || push(` `)
   push(`: `)
   const isNested = alternate.type === NodeTypes.JS_CONDITIONAL_EXPRESSION
   if (!isNested) {
diff --git a/packages/compiler-ssr/__tests__/ssrVShow.spec.ts b/packages/compiler-ssr/__tests__/ssrVShow.spec.ts
new file mode 100644 (file)
index 0000000..6f7a0b8
--- /dev/null
@@ -0,0 +1,84 @@
+import { compile } from '../src'
+
+describe('ssr: v-show', () => {
+  test('basic', () => {
+    expect(compile(`<div v-show="foo"/>`).code).toMatchInlineSnapshot(`
+      "const { _renderStyle } = require(\\"vue\\")
+
+      return function ssrRender(_ctx, _push, _parent) {
+        _push(\`<div\${_renderStyle((_ctx.foo) ? null : { display: \\"none\\" })}></div>\`)
+      }"
+    `)
+  })
+
+  test('with static style', () => {
+    expect(compile(`<div style="color:red" v-show="foo"/>`).code)
+      .toMatchInlineSnapshot(`
+      "const { _renderStyle } = require(\\"vue\\")
+
+      const _hoisted_1 = {\\"color\\":\\"red\\"}
+
+      return function ssrRender(_ctx, _push, _parent) {
+        _push(\`<div\${_renderStyle([
+          _hoisted_1,
+          (_ctx.foo) ? null : { display: \\"none\\" }
+        ])}></div>\`)
+      }"
+    `)
+  })
+
+  test('with dynamic style', () => {
+    expect(compile(`<div :style="{ color: 'red' }" v-show="foo"/>`).code)
+      .toMatchInlineSnapshot(`
+      "const { _renderStyle } = require(\\"vue\\")
+
+      return function ssrRender(_ctx, _push, _parent) {
+        _push(\`<div\${_renderStyle([
+          { color: 'red' },
+          (_ctx.foo) ? null : { display: \\"none\\" }
+        ])}></div>\`)
+      }"
+    `)
+  })
+
+  test('with static + dynamic style', () => {
+    expect(
+      compile(`<div style="color:red" :style="{ fontSize: 14 }" v-show="foo"/>`)
+        .code
+    ).toMatchInlineSnapshot(`
+      "const { _renderStyle } = require(\\"vue\\")
+
+      const _hoisted_1 = {\\"color\\":\\"red\\"}
+
+      return function ssrRender(_ctx, _push, _parent) {
+        _push(\`<div\${_renderStyle([
+          _hoisted_1,
+          { fontSize: 14 },
+          (_ctx.foo) ? null : { display: \\"none\\" }
+        ])}></div>\`)
+      }"
+    `)
+  })
+
+  test('with v-bind', () => {
+    expect(
+      compile(
+        `<div v-bind="baz" style="color:red" :style="{ fontSize: 14 }" v-show="foo"/>`
+      ).code
+    ).toMatchInlineSnapshot(`
+      "const { mergeProps, _renderAttrs } = require(\\"vue\\")
+
+      const _hoisted_1 = {\\"color\\":\\"red\\"}
+
+      return function ssrRender(_ctx, _push, _parent) {
+        _push(\`<div\${_renderAttrs(mergeProps(_ctx.baz, {
+          style: [
+            _hoisted_1,
+            { fontSize: 14 },
+            (_ctx.foo) ? null : { display: \\"none\\" }
+          ]
+        }))}></div>\`)
+      }"
+    `)
+  })
+})
index bea23c677911071412a512e348f1d6344ee7b6b5..1c1d1157462be8476db0f1c91e6a7c65dc6bc230 100644 (file)
@@ -16,7 +16,8 @@ import {
   CallExpression,
   createArrayExpression,
   ExpressionNode,
-  JSChildNode
+  JSChildNode,
+  ArrayExpression
 } from '@vue/compiler-dom'
 import { escapeHtml, isBooleanAttr, isSSRSafeAttrName } from '@vue/shared'
 import { createSSRCompilerError, SSRErrorCodes } from '../errors'
@@ -210,8 +211,12 @@ function isTextareaWithValue(
 }
 
 function mergeCall(call: CallExpression, arg: string | JSChildNode) {
-  const existing = call.arguments[0] as ExpressionNode
-  call.arguments[0] = createArrayExpression([existing, arg])
+  const existing = call.arguments[0] as ExpressionNode | ArrayExpression
+  if (existing.type === NodeTypes.JS_ARRAY_EXPRESSION) {
+    existing.elements.push(arg)
+  } else {
+    call.arguments[0] = createArrayExpression([existing, arg])
+  }
 }
 
 function removeStaticBinding(
index b5671b51ac604c043d1fef1c8d8a7263beb69122..d46cac737c6fb131b5098de9c583f1518ba44e70 100644 (file)
@@ -1,7 +1,33 @@
-import { DirectiveTransform } from '@vue/compiler-dom'
+import {
+  DirectiveTransform,
+  createCompilerError,
+  DOMErrorCodes,
+  createObjectProperty,
+  createSimpleExpression,
+  createConditionalExpression,
+  createObjectExpression
+} from '@vue/compiler-dom'
 
 export const ssrTransformShow: DirectiveTransform = (dir, node, context) => {
+  if (!dir.exp) {
+    context.onError(createCompilerError(DOMErrorCodes.X_V_SHOW_NO_EXPRESSION))
+  }
   return {
-    props: []
+    props: [
+      createObjectProperty(
+        createSimpleExpression(`style`, true),
+        createConditionalExpression(
+          dir.exp!,
+          createSimpleExpression(`null`, false),
+          createObjectExpression([
+            createObjectProperty(
+              createSimpleExpression(`display`, true),
+              createSimpleExpression(`none`, true)
+            )
+          ]),
+          false /* no newline */
+        )
+      )
+    ]
   }
 }