我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue3中emits与attrs的区别分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue3中emits与attrs的区别分析

结论

当在父组件自定义事件,若没有在子组件中声明时,将自动绑定在父组件的$attrs上;而当在子组件声明时,则不会在父组件的$attrs上出现

实践分析

为了验证emits和attrs的区别,我们构造这样的组件结构


<div>
<com-one-vue/>
</div>
<div>
<com-one-vue/>
</div>

其具体的Vue文件及代码为(注意,以下语法均采用 setup语法糖 ):

App.vue


<template>
<div>
组件1(加上fun事件,但不在emits中声明)
<com-one-vue @fun = 'call'/>
</div>
<div>
组件1(加上fun2事件,在emits中声明)
<com-one-vue @fun2 = 'call'/>
</div>
</template>
​
<script setup>
import { provide, ref } from '@vue/runtime-core';
import comOneVue from './components/comOne.vue';
import comTwoVue from './components/comTwo.vue';
import comThreeVue from './components/comThree.vue';
const call = () => {
  console.log('xx')
}
</script>

comOne.vue


<template>
    <button @click="f">heihei</button>
</template>
​
<script setup>
import {useAttrs } from "@vue/runtime-core";
const emits = defineEmits(['fun2'])
const {onFun} = useAttrs()
const f = () => {
    if(onFun)
    onFun()
    emits('fun2')
}
console.log(useAttrs())
</script> 

那么此时,打开控制台,我们可以发现:

在两个组件1中,由于第一个组件1的自定义方法fun没有在emits中声明,所以在其的$attrs上出现了onFun,其类型是一个方法。

而在第二个的组件1上,我们定义了自定义方法fun2,由于在一开始我们已经在子组件中定义了fun2,所以在第二个组件1上没有将fun2添加到$attrs上。

注意,这里虽然这两个组件都是组件1,但是其的自定义事件是不会互相影响的,这也是fun自定义方法没有出现在第二个组件1上的$attrs上的原因。

同时,我们点击两个按钮,可以发现,fun和fun2方法都打印出了结果

所以,在这种情况下,这两种用法带来的效果是没有什么不同的。

扩展

通过刚才的Demo,我们了解了emits和attrs的用法差异和一些细节,但是在多数情况下,其实两者的功能是没有差异的,那么我们应该如何使用呢?

首先,emits是首先在子组件声明,父组件引用,而attrs则是先由父组件在子组件上自定义事件,子组件通过查看父组件的attrs来使用。这样的差异让我们可以根据一个事件的使用方式和特点来决定使用哪种方法:

  • 当一个组件经常需要通过自定义事件和父组件通信时,可以使用emits
  • 当一个父组件可能需要通过自定义事件和子组件通讯且并不是经常时,可以使用attrs。但是注意,由于父组件可能不会通过自定义事件和子组件通信,所以需要判断是否存在相应的attrs(不判断会出现undefined的错误)

再来看一下官方对这两种用法的看法:

强烈建议使用 emits 记录每个组件所触发的所有事件。
这尤为重要,因为我们移除了 .native 修饰符。任何未在 emits 中声明的事件监听器都会被算入组件的 $attrs,并将默认绑定到组件的根节点上。

在Vue3中,移除.native修饰符后,所有的事件其实都会记录在都组件的attrs上,无论是不是自定义组件。如下:

所以,如果需要区分自己的自定义事件和原生事件,最好还是使用emits来定义每一个组件触发的事件。同时,其实所有的事件,只要不在emits中声明,都会默认绑定在父组件的attrs上,并不仅限于自定义的事件。

总结

到此这篇关于Vue3中emits与attrs区别的文章就介绍到这了,更多相关Vue3中emits与attrs区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue3中emits与attrs的区别分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue3中watch与watchEffect的区别

vue3新增的CompositionAPI中的watchEffect和watch都可在setup()函数中使用,本文重点介绍vue3中watch与watchEffect的区别,感兴趣的朋友一起看看吧
2023-02-17

python中input()与raw_input()的区别分析

我们来看input的源码 def input(prompt): return eval(raw_input(prompt)) 其实input也是调用了raw_input,只是做了eval处理 而eval有什么作用呢? input:会根据
2022-06-04

TypeScript与JavaScript的区别分析

TypeScript可以使用JavaScript中的所有代码和编程概念,TypeScript是为了使JavaScript的开发变得更加容易而创建的。推荐先精通JS的的前提下再学习TS,这样更有利于同时学习两门语言。
2022-12-30

Vue3中toRef与toRefs的区别是什么

这篇文章主要讲解了“Vue3中toRef与toRefs的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3中toRef与toRefs的区别是什么”吧!作用:创建一个ref对象,
2023-06-29

Android中gravity与layout_gravity的使用区别分析

android:gravity:设置的是控件自身上面的内容位置 android:layout_gravity:设置控件本身相对于父控件的显示位置。 看下如下代码段 代码如下:
2022-06-06

如何分析git中fork与branch的区别

本篇文章给大家分享的是有关如何分析git中fork与branch的区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。区别:1、fork是一个GitHub操作,可以克隆出一个仓库
2023-06-26

JS中Require与Import区别对比分析

这篇文章主要为大家介绍了JS中Require与Import区别对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-02

Vue3中Vite和Vue-cli的特点与区别详解

vue-cli是Vue早期推出的一款脚手架,使用webpack创建Vue项目,可以选择安装需要的各种插件,比如Vuex、VueRouter,下面这篇文章主要给大家介绍了关于Vue3中Vite和Vue-cli的特点与区别的相关资料,需要的朋友可以参考下
2022-12-28

编程热搜

目录