【vue3 之 emits & $emit() 讲解 】监听子组件事件、emit事件验证、options写法、composition setup写法

这篇具有很好参考价值的文章主要介绍了【vue3 之 emits & $emit() 讲解 】监听子组件事件、emit事件验证、options写法、composition setup写法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:不懂在父组件里对子组件 @xxxx 声明自定义事件,就不用看本篇文章了。本篇对此内容不做任何说明。这是与 emits 结合使用的必备知识!

<childComp @emitEvnentName='deleteFn'></childComp>

emits

场景说明:

组件功能封装:
        组件封装了一系列 emit 事件,并返回数据、回调函数等,或单纯执行某个操作后,触发父组件的事件响应。
        外部要用时,使用 @xxxx 来接收使用、响应。

  • 类型:Array<string> | Object

  • 详细:

    emits 可以是数组或对象,从组件触发自定义事件,emits 可以是简单的数组,也可以是对象,后者允许配置事件验证。

    在对象语法中,每个 property 的值可以为 null 或验证函数。验证函数将接收传递给 $emit 调用的其他参数。如果 this.$emit('foo',1) 被调用,foo 的相应验证函数将接收参数 1。验证函数应返回布尔值,以表示事件参数是否有效。

数组写法:// emits:['emitEvnentName']

对象写法:// emits:{}
        { eventName:null }
        { eventName:()=>{} }


细节说明:

1、数组形式和对象形式的值为null,表示该emit事件无验证函数。
2、对象形式且值为函数表示该 emit 配置了事件验证
        验证函数必须有 return 真假值,真值表示通过验证,假值则 vue 会自动抛出 warn 警告!不 return 值默认当做失败,抛出 warn 警告!
        验证函数主要就是验证参数是否正确,并不会在 return false 时中断 emit() 事件!

// 子组件
<template>
    <el-button type="success" plain @click='trigger'>emits测试</el-button>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
  // 定义自定义事件
  // emits:['emitEvnentName'], // 数组写法都默认无验证函数!!
  emits: {
    noVerification: null, // 无验证函数

    emitEvnentName: ({ email, password },data2,dataX) => { 
      console.log('定义自定义事件-myEvent',email, password,data2,dataX);
      if (email && password) {

        // 验证函数应返回布尔值,以表示事件参数是否有效。
        return true

      } else {
        console.error('Invalid submit event payload!')
        return false
      }
    }
  },
  methods:{
    trigger(){
      let email = 1
      let password = null
      this.$emit('emitEvnentName',{email, password},'data2',['data3','data4'])
    }
  }
})
</script>

$emit

  • 参数:

    • {string} eventName
    • [...args]

    触发当前实例上的事件。附加参数都会传给监听器回调。

父组件自定义的事件名作为$emit的第一个参数,第二个参数开始就是传给绑定事件的参数,可以传多个参数。
其他没啥好说的了。。就只是触发事件罢了。

使用方法:(结合上面代码片段的案例,且父组件声明了 @emitEvnentName 自定义事件)
this.$emit('emitEvnentName',{email, password},'data2',['data3','data4'])



# composition Api 写法:defineEmits

在 <script setup> 中必须使用 defineProps 和 defineEmits API 来声明 props 和 emits ,它们具备完整的类型推断并且在 <script setup> 中是直接可用的:

<script setup>
const emit = defineEmits(['change', 'delete'])
</script>

defineEmits 是只在 <script setup> 中才能使用的编译器宏。他们不需要导入且会随着 <script setup> 处理过程一同被编译掉。

defineEmits 在选项传入后,会提供恰当的类型推断。

传入到 defineProps 和 defineEmits 的选项会从 setup 中提升到模块的范围。因此,传入的选项不能引用在 setup 范围中声明的局部变量。这样做会引起编译错误。但是,它可以引用导入的绑定,因为它们也在模块范围内。

以下为错误写法!!

let enFn = (val) => { 
    console.log('定义自定义事件-delete',val);
    if (val) {
      return true
    } else {
      console.error('Invalid submit event payload!')
      return false
    }
  }
const emit = defineEmits({
  noVerification: null, // 无验证函数
  delete: enFn // 会编译报错
})

defineEmits 也接收 emits 选项相同的值。效果跟options emits里的{} 一样,此处只展示写法,功能讲解的内容,忘了就请回看上面的 options 写法里的讲解!!

<script setup>
const emit = defineEmits({
  noVerification: null, // 无验证函数

  delete: (val) => { 
    console.log('定义自定义事件-myEvent',val);
    if (val) {
      return true

    } else {
      console.error('Invalid submit event payload!')
      return false
    }
  }
})
console.log(emit);

setTimeout(() => {
  emit('delete','测试')
}, 1000*10);
</script>

如果使用了 Typescript,使用纯类型声明来声明 prop 和 emits 也是可以的。 



# ts 类型声明写法:

defineProps 或 defineEmits 只能是要么使用运行时声明,要么使用类型声明。同时使用两种声明方式会导致编译报错。

讲解:左边的相当于函数参数名,第一个参数的值就是emit事件名,后面的任意多个参数都是emit事件的传递参数内容。剩下的就是TS相关内容,此处不对TS进行深入讲解,不懂的自己去学。


这里函数的参数名叫什么不重要,重要的是`ts类型`!第一个参数的ts类型值是`emit 事件名`,后面的参数 ts类型 则是emit传递的参数类型验证!提供编辑器报错功能。

<script setup lang='ts'>
const emit = defineEmits<{
  (e: 'change', id: number): void
  (e: 'delete', value: string, vlaue2:number ,value3?:boolean): void
}>()

setTimeout(() => {
  emit('delete', '123', 5666)
}, 1000*4);
</script>

使用类型声明的时候,静态分析会自动生成等效的运行时声明,以消除双重声明的需要并仍然确保正确的运行时行为。


场景说明:

组件功能封装:
        组件封装了一系列 emit 事件,并返回数据、回调函数等,或单纯执行某个操作后,触发父组件的事件响应。
        外部要用时,使用 @xxxx 来接收使用、响应。


QQ交流群:522976012  ,欢迎来玩

聚焦vue3,但不限于vue,任何前端问题,究其本质,值得讨论,研究与学习。文章来源地址https://www.toymoban.com/news/detail-407685.html

到了这里,关于【vue3 之 emits & $emit() 讲解 】监听子组件事件、emit事件验证、options写法、composition setup写法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue前端框架10 组件的组成、组件嵌套关系、组件的注册方式、组件传递数据(props $emit)、数组传递多种数据类型、组件传递props校验、组件事件

    组件最大的优势就是可复用性 通常将组件定义在.vue中,也就是SFC单文件组件 组件的基本组成: 组件允许我们将UI划分为独立的、可重用的部分,并且对每个部分单独思考 实际应用中组件常常被组件成层层嵌套的树状结构 Vue组件使用前要注册,注册有两种方式:全局注册和

    2024年02月09日
    浏览(50)
  • 【web3j】java通过web3j监听并解析合约中的事件(event/emit)

    ① 查询链上数据用的rpc(本示例是binance的,测试网可以使用:https://data-seed-prebsc-2-s2.binance.org:8545) ② 自己还要有一个测试链上部署好的合约,合约中要有一个方法emit了事件。 ③ java依赖 一、 通过自己合约的abi和bin生成一个java文件,abi和bin可以在remix的compiler模块中获取,

    2024年02月09日
    浏览(50)
  • VUE-组件间通信(二)$emit

    $emit 1、单向绑定 子组件向父组件传值 2、使用示例 父组件 子组件 效果

    2024年03月20日
    浏览(36)
  • Vue3----props和emit的使用

    用途:当有一种类型的组件需要被使用多次,每一次的调用都只是特定的地方不同,就好像一张个人简介表,每次填的人的信息都不同,但是结构都是一样的。 在父组件里面引入子组件,通过子组件的标签属性传递参数,在子组件里面定义一个props选项进行接收使用,要注意

    2023年04月11日
    浏览(39)
  • 【vue3】vue3接收props以及emit的用法

    技术 :vue3.2.40 UI框架 :arco-design 2.44.7 css技术 :less 4.1.3 实现 :子组件接收props以及通过emit方法传值父组件 vue3使用的组合式API,我这里使用的是defineComponent 1.setup里如果需要接收props和使用emit,只需要带参数 setup(props, { emit }) 2.setup里面只需要带emit(‘handleCancel’),不需要带

    2024年02月15日
    浏览(37)
  • vue3中emit(‘update:modelValue‘)使用

    父 子(setup语法糖) 子(常规写法)

    2024年02月06日
    浏览(33)
  • Vue子组件向父组件传值(this.$emit()方法)

    首先必须在父组件中引用子组件,然后实现传值 第一步 在父组件中引入子组件 使用import引入组件 声明 使用 第二步 子组件向父组件传值 1.  在子组件中需要向父组件传值处使用this.$emit(\\\"function\\\",param);    //其中function为父组件定义函数,param为需要传递参数 2.  在父组件中子

    2024年02月10日
    浏览(32)
  • 父组件明明使用了v-model,子组件竟然可以不用定义props和emit抛出事件,快来看看吧

    vue3.4增加了 defineModel 宏函数,在子组件内修改了 defineModel 的返回值,父组件上 v-model 绑定的变量就会被更新。大家都知道 v-model 是 :modelValue 和 @update:modelValue 的语法糖,但是你知道为什么我们在子组件内没有写任何关于 props 的定义和 emit 事件触发的代码吗?还有在 template

    2024年04月08日
    浏览(80)
  • vue前端开发自学,子组件传递数据给父组件,使用$emit

    vue前端开发自学,子组件传递数据给父组件,使用$emit 父子组件之间互相传递数据的情况非常常见,下面为大家介绍的是,来自子组件,给父组件传递数据的情况。 如图,以上代码是父组件的代码情况,ComponentEvent.vue。 可以看出来,里面的特殊点,在于,有个子组件的引用和标

    2024年01月23日
    浏览(42)
  • Vue3的Props与Emit一目了然,直观使用

    父页面 子页面 父页面 子页面 有问题欢迎大家指教,谢谢~

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包