@@ -4,7 +4,7 @@ import config from '../config'
44import VNode , { emptyVNode } from '../vdom/vnode'
55import { normalizeChildren } from '../vdom/helpers'
66import {
7- warn , bind , isObject , toObject ,
7+ warn , formatComponentName , bind , isObject , toObject ,
88 nextTick , resolveAsset , _toString , toNumber
99} from '../util/index'
1010
@@ -48,19 +48,38 @@ export function renderMixin (Vue: Class<Component>) {
4848 _parentVnode
4949 } = vm . $options
5050
51- if ( staticRenderFns && ! this . _staticTrees ) {
52- this . _staticTrees = [ ]
51+ if ( staticRenderFns && ! vm . _staticTrees ) {
52+ vm . _staticTrees = [ ]
5353 }
5454 // set parent vnode. this allows render functions to have access
5555 // to the data on the placeholder node.
56- this . $vnode = _parentVnode
56+ vm . $vnode = _parentVnode
5757 // resolve slots. becaues slots are rendered in parent scope,
5858 // we set the activeInstance to parent.
5959 if ( _renderChildren ) {
6060 resolveSlots ( vm , _renderChildren )
6161 }
6262 // render self
63- let vnode = render . call ( vm . _renderProxy , vm . $createElement )
63+ let vnode
64+ try {
65+ vnode = render . call ( vm . _renderProxy , vm . $createElement )
66+ } catch ( e ) {
67+ if ( process . env . NODE_ENV !== 'production' ) {
68+ warn ( `Error when rendering ${ formatComponentName ( vm ) } :` )
69+ }
70+ /* istanbul ignore else */
71+ if ( config . errorHandler ) {
72+ config . errorHandler . call ( null , e , vm )
73+ } else {
74+ if ( config . _isServer ) {
75+ throw e
76+ } else {
77+ setTimeout ( ( ) => { throw e } , 0 )
78+ }
79+ }
80+ // return previous vnode to prevent render error causing blank component
81+ vnode = vm . _vnode
82+ }
6483 // return empty vnode in case the render function errored out
6584 if ( ! ( vnode instanceof VNode ) ) {
6685 if ( process . env . NODE_ENV !== 'production' && Array . isArray ( vnode ) ) {
0 commit comments