在 vue.js 中,子组件无法直接通过 props 调用父组件方法;正确做法是子组件通过 `this.$emit()` 触发自定义事件,父组件用 `@event-name` 监听并执行对应方法。
在 Vue 组件开发中,一个常见误区是试图将父组件的方法作为普通 prop 传递给子组件并直接调用(如 this.cancelOrderFunction()),这会导致 “xxx is not a function” 错误。根本原因在于:props 是单向数据流,仅用于向下传递数据或配置,不支持反向执行函数逻辑。Vue 官方推荐的、符合响应式设计原则的解决方案是使用自定义事件机制(Event Emitting)。
当前状态:{{ currentStatus }}
? 注意命名规范:使用 kebab-case(短横线分隔)定义事件名(如 cancel-order),在模板中以 @cancel-order 监听,符合 Vue 惯例且兼容 HTML 特性解析。
确认取消订单? 取消 Confirm Cancel
✅ 关键点说明:
- emits: ['cancel-order'] 是 Vue 3 的显式事件声明语法(Vue 2.7+ 也支持),提升类型安全与 IDE 提示能力;
- this.$emit('cancel-order') 是标准事件触发方式,不可写作 this.cancelOrderFunction();
- 对话框关闭逻辑(dialogVisible = false)应放在 $emit 之后,确保状态同步。

通过以上方式,你不仅能彻底解决 "this.cancelOrderFunction is not a function" 报错,还能构建出清晰、解耦、可测试的父子组件通信结构。