Skip to content

Commit

Permalink
feat: renderError
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Feb 20, 2017
1 parent a1d5b22 commit 1861ee9
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 4 deletions.
3 changes: 2 additions & 1 deletion flow/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ declare type ComponentOptions = {
// DOM
el?: string | Element;
template?: string;
render: () => VNode;
render: (h: () => VNode) => VNode;
renderError?: (h: () => VNode, err: Error) => VNode;
staticRenderFns?: Array<() => VNode>;
// lifecycle
beforeCreate?: Function;
Expand Down
11 changes: 9 additions & 2 deletions src/core/instance/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,15 @@ export function renderMixin (Vue: Class<Component>) {
vnode = render.call(vm._renderProxy, vm.$createElement)
} catch (e) {
handleError(e, vm, `render function`)
// return previous vnode to prevent render error causing blank component
vnode = vm._vnode
// return error render result,
// or previous vnode to prevent render error causing blank component
if (process.env.NODE_ENV !== 'production') {
vnode = vm.$options.renderError
? vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e)
: vm._vnode
} else {
vnode = vm._vnode
}
}
// return empty vnode in case the render function errored out
if (!(vnode instanceof VNode)) {
Expand Down
4 changes: 3 additions & 1 deletion test/unit/features/error-handling.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ describe('Error handling', () => {
expect(args[1]).toBe(vm.$refs.child) // vm
expect(args[2]).toContain('render function') // description

assertRootInstanceActive(vm).then(done)
assertRootInstanceActive(vm).then(() => {
Vue.config.errorHandler = null
}).then(done)
})
})

Expand Down
28 changes: 28 additions & 0 deletions test/unit/features/options/renderError.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import Vue from 'vue'

describe('Options renderError', () => {
it('should be used on render errors', done => {
Vue.config.errorHandler = () => {}
const vm = new Vue({
data: {
ok: true
},
render (h) {
if (this.ok) {
return h('div', 'ok')
} else {
throw new Error('no')
}
},
renderError (h, err) {
return h('div', err.toString())
}
}).$mount()
expect(vm.$el.textContent).toBe('ok')
vm.ok = false
waitForUpdate(() => {
expect(vm.$el.textContent).toBe('Error: no')
Vue.config.errorHandler = null
}).then(done)
})
})

0 comments on commit 1861ee9

Please sign in to comment.