Skip to content

Commit 1bb7cba

Browse files
committed
improve event warning with component information (close #3831)
1 parent 2ee6ef2 commit 1bb7cba

File tree

6 files changed

+15
-10
lines changed

6 files changed

+15
-10
lines changed

src/core/instance/events.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export function initEvents (vm: Component) {
1010
const on = bind(vm.$on, vm)
1111
const off = bind(vm.$off, vm)
1212
vm._updateListeners = (listeners, oldListeners) => {
13-
updateListeners(listeners, oldListeners || {}, on, off)
13+
updateListeners(listeners, oldListeners || {}, on, off, vm)
1414
}
1515
if (listeners) {
1616
vm._updateListeners(listeners)

src/core/instance/state.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,13 @@ function initMethods (vm: Component) {
142142
const methods = vm.$options.methods
143143
if (methods) {
144144
for (const key in methods) {
145-
if (methods[key] != null) {
146-
vm[key] = bind(methods[key], vm)
147-
} else if (process.env.NODE_ENV !== 'production') {
148-
warn(`Method "${key}" is undefined in options.`, vm)
145+
vm[key] = methods[key] == null ? noop : bind(methods[key], vm)
146+
if (process.env.NODE_ENV !== 'production' && methods[key] == null) {
147+
warn(
148+
`method "${key}" has an undefined value in the component definition. ` +
149+
`Did you reference the function correctly?`,
150+
vm
151+
)
149152
}
150153
}
151154
}

src/core/vdom/helpers.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,17 @@ export function updateListeners (
8585
on: Object,
8686
oldOn: Object,
8787
add: Function,
88-
remove: Function
88+
remove: Function,
89+
vm: Component
8990
) {
9091
let name, cur, old, fn, event, capture
9192
for (name in on) {
9293
cur = on[name]
9394
old = oldOn[name]
9495
if (!cur) {
9596
process.env.NODE_ENV !== 'production' && warn(
96-
`Handler for event "${name}" is undefined.`
97+
`Invalid handler for event "${name}": got ` + String(cur),
98+
vm
9799
)
98100
} else if (!old) {
99101
capture = name.charAt(0) === '!'

src/platforms/web/runtime/modules/events.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function updateDOMListeners (oldVnode, vnode) {
1515
const remove = vnode.elm._v_remove || (vnode.elm._v_remove = (event, handler) => {
1616
vnode.elm.removeEventListener(event, handler)
1717
})
18-
updateListeners(on, oldOn, add, remove)
18+
updateListeners(on, oldOn, add, remove, vnode.context)
1919
}
2020

2121
export default {

test/unit/features/directives/on.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ describe('Directive v-on', () => {
230230
data: { none: null },
231231
template: `<div @click="none"></div>`
232232
})
233-
expect(`Handler for event "click" is undefined`).toHaveBeenWarned()
233+
expect(`Invalid handler for event "click": got null`).toHaveBeenWarned()
234234
expect(() => {
235235
triggerEvent(vm.$el, 'click')
236236
}).not.toThrow()

test/unit/features/options/methods.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ describe('Options methods', () => {
2222
hello: undefined
2323
}
2424
})
25-
expect(`Method "hello" is undefined in options`).toHaveBeenWarned()
25+
expect(`method "hello" has an undefined value in the component definition`).toHaveBeenWarned()
2626
})
2727
})

0 commit comments

Comments
 (0)