diff --git a/src/platforms/web/server/modules/dom-props.js b/src/platforms/web/server/modules/dom-props.js index 57c18eefc89..6d92badcb85 100644 --- a/src/platforms/web/server/modules/dom-props.js +++ b/src/platforms/web/server/modules/dom-props.js @@ -2,7 +2,7 @@ import VNode from 'core/vdom/vnode' import { renderAttr } from './attrs' -import { isDef, isUndef, extend } from 'shared/util' +import { isDef, isUndef, extend, toString } from 'shared/util' import { propsToAttrMap, isRenderableAttr } from '../util' export default function renderDOMProps (node: VNodeWithData): string { @@ -28,7 +28,7 @@ export default function renderDOMProps (node: VNodeWithData): string { } else if (key === 'textContent') { setText(node, props[key], false) } else if (key === 'value' && node.tag === 'textarea') { - setText(node, props[key], false) + setText(node, toString(props[key]), false) } else { // $flow-disable-line (WTF?) const attr = propsToAttrMap[key] || key.toLowerCase() diff --git a/test/ssr/ssr-string.spec.js b/test/ssr/ssr-string.spec.js index e18ca2aead9..b24f7e024b5 100644 --- a/test/ssr/ssr-string.spec.js +++ b/test/ssr/ssr-string.spec.js @@ -1594,6 +1594,25 @@ describe('SSR: renderToString', () => { renderToString(vueInstance, err => done(err)) }) + + it('undefined v-model with textarea', done => { + renderVmWithOptions({ + render (h) { + return h('div', [ + h('textarea', { + domProps: { + value: null + } + }) + ]) + } + }, result => { + expect(result).toContain( + '
' + ) + done() + }) + }) }) function renderVmWithOptions (options, cb) {