使用 Composition API 在 Vue 中处理子项和父项中的提交事件

Posted

技术标签:

【中文标题】使用 Composition API 在 Vue 中处理子项和父项中的提交事件【英文标题】:Handle submit event in child then parent in Vue using Composition API 【发布时间】:2020-11-24 19:08:56 【问题描述】:

Vue.js 新手,尝试在表示表单的组件中处理提交事件,该表单将检查子组件的有效性,如果一切正常,则将处理传递给父组件中的事件处理程序。

我收到此错误... [Vue 警告]:v-on 处理程序中的错误:“TypeError: undefined is not an object (evalating '$event.preventDefault')” 在发现 ---> 在 src/components/MyForm.vue 在 src/App.vue

子组件是 MyForm...

<template lang="pug">
  form(@submit.prevent='onFormSubmit', novalidate, autocomplete='on')
    slot Content needed in MyForm
</template>

<script lang="ts">
import  defineComponent  from "@vue/composition-api"
export default defineComponent(
  name: "MyForm",
  setup(_,  emit ) 
    const onFormSubmit = () => 
      console.log("MyForm:onFormSubmit() - called first")
      // Validate child components, if invalid, STOP, otherwise continue...
      emit("submit") // errors
    
  ,
)

父组件(App)...

<template lang="pug">
#app
  .container
    MyForm(@submit.prevent='onSubmit')
      ...other components
</template>

<script lang="ts">
import  defineComponent  from "@vue/composition-api"
import MyForm from "@/components/MyForm.vue"

export default defineComponent(
  name: "App",
  components: 
    MyForm,
  ,
  setup() 
    const onSubmit = (): void => 
      console.log("App.vue:onSubmit() - called second")
    
    return  onSubmit 
  
</script>

或者,将 App 的 onSubmit() 函数作为道具传递给 MyForm 会更好吗?我可以在 MyForm 中进行验证然后调用传入的函数吗?

【问题讨论】:

您也应该发布该错误。您不需要父组件中的@submit 中的.prevent,因为您处理的不是表单提交而是自定义组件事件。因此,只需在您的父母中执行 @submit="onSubmit" 即可。不知道这是否可以解决错误,因为我不知道您的错误是什么。为了让事情更清楚,您可以将发出的事件重命名为 validSubmit 谢谢马蒂亚斯!问题是父级的 .prevent 。为了使我的问题更完整,我包含了上面的错误。您想将您的建议作为解决方案发布,以便我将其标记为正确吗? 【参考方案1】:

TL;DR:

从您的父应用中删除 .prevent

解释:

如 cmets 中所述,您自己的父组件中不需要 .prevent。事件上的.prevent 基本上可以防止默认事件传播。因此,例如,在您的form(@submit.prevent='onFormSubmit' 中,当您的表单正常提交时(例如通过按 Enter),正常的提交事件被阻止,而是调用您的方法 onFormSubmit。

但在您的父组件中,没有要阻止的默认 javascript 事件。 这就解释了为什么你有错误TypeError: undefined is not an object (evaluating '$event.preventDefault') - 没有$event,所以它是undefined。而undefined 不是对象。

【讨论】:

以上是关于使用 Composition API 在 Vue 中处理子项和父项中的提交事件的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的错误:[vue-composition-api] 必须在使用任何函数之前调用 Vue.use(plugin)

如何跨多个文件中的多个 Vue 实例正确使用 Vue 3 composition-api

如何在 Vue3 Composition API 上使用 Vue2 插件?

为啥在 Vue 3 的 Composition API 中使用“API”这个词?

集成使用 @vue/composition-api 的组件库的运行时错误:'您必须在“setup()”方法中使用此函数'

如何使用 @vue/composition-api 和 nuxt.js 获取 vue-apollo 实例