Meituan-Dianping/mpvue · error

v-on without argument expects an Object value

Error message

v-on without argument expects an Object value

What it means

Raised by the bindObjectListeners render helper, which implements the object syntax v-on="value" (e.g. <div v-on="listeners">). The bound expression's value is truthy but isPlainObject(value) is false — a string, number, array or other non-object was passed where a map of event names to handlers is required. The helper then skips merging, so those listeners are silently dropped from the VNode.

Solutions

  1. Pass an object mapping event names to handlers: v-on="{ click: onClick, input: onInput }"
  2. Ensure the bound variable/computed actually evaluates to a plain object at render time (check its initial value and any conditional logic)
  3. Use the normal v-on:event syntax if you only need a single handler
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at src/core/instance/render-helpers/bind-object-listeners.js:8 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Meituan-Dianping/mpvue@6c5d78ee04 (2026-09-02). Data as JSON: /api/errors/30a674537f73135e. Report an issue: GitHub.

Appendix: source

Thrown at src/core/instance/render-helpers/bind-object-listeners.js:8

/* @flow */

import { warn, extend, isPlainObject } from 'core/util/index'

export function bindObjectListeners (data: any, value: any): VNodeData {
  if (value) {
    if (!isPlainObject(value)) {
      process.env.NODE_ENV !== 'production' && warn(
        'v-on without argument expects an Object value',
        this
      )
    } else {
      const on = data.on = data.on ? extend({}, data.on) : {}
      for (const key in value) {
        const existing = on[key]
        const ours = value[key]
        on[key] = existing ? [].concat(ours, existing) : ours
      }
    }
  }
  return data
}

View on GitHub (pinned to 6c5d78ee04)