返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3中emits与attrs的区别分析
  • 371
分享到

Vue3中emits与attrs的区别分析

2024-04-02 19:04:59 371人浏览 安东尼
摘要

目录结论实践分析扩展总结结论 当在父组件自定义事件,若没有在子组件中声明时,将自动绑定在父组件的$attrs上;而当在子组件声明时,则不会在父组件的$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区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue3中emits与attrs的区别分析

本文链接: https://lsjlt.com/news/137609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue3中emits与attrs的区别分析
    目录结论实践分析扩展总结结论 当在父组件自定义事件,若没有在子组件中声明时,将自动绑定在父组件的$attrs上;而当在子组件声明时,则不会在父组件的$attrs上出现 实践分析 ...
    99+
    2024-04-02
  • Vue3中ref与toRef的区别浅析
    1. ref是复制,视图会更新 如果利用ref将某一个对象中的某一个属性值变成响应式数据 我们修改响应式数据是不会影响原始数据的; 同时视图会跟新。 ref就是复制 复制是不会影响原...
    99+
    2024-04-02
  • vue$attrs和$listeners的使用与区别
    首先让我们看一下这张图,表示了一个多级关联的组件嵌套 为什么要用$attrs 和 $listeners 先让我们来想一种情况,就是组件A跟组件C怎么通信,我们可以有多少中解决方案?...
    99+
    2024-04-02
  • Vue3中toRef与toRefs的区别
    作用:创建一个ref对象,其value值指向另外一个对象中的某个属性。这样在模板中就可以直接使用属性名而不用麻烦的再加对象名前缀了。 语法: const name = toRef(p...
    99+
    2024-04-02
  • vue3中watch与watchEffect的区别
    目录vue3中watch与watchEffect的区别watch refwatch reactivewatchEffect对比扩展:vue3中的 watchEffect 和 watc...
    99+
    2023-02-17
    vue3 watch与watchEffect的区别 vue3 watch与watchEffect用法 vue3 watch与watchEffect
  • vue3中$attrs的变化与inheritAttrs的使用详解
    目录在vue3中的$attrs的变化在vue2中的$attrs父组件的属性直接渲染在根节点上在vue3中的$attrs的变化 $listeners已被删除合并到$attrs中。 $a...
    99+
    2022-11-13
    vue3 $attrs与inheritAttrs的使用 vue3 inheritAttrs使用
  • python中input()与raw_input()的区别分析
    我们来看input的源码 def input(prompt): return eval(raw_input(prompt)) 其实input也是调用了raw_input,只是做了eval处理 而eval...
    99+
    2022-06-04
    区别 python input
  • TypeScript与JavaScript的区别分析
    目录TypeScript优势TypeScript 与 JavaScript 的区别TypeScript基本语法TypeScript原始类型1.字符串2.数字3.布尔值4.S...
    99+
    2022-12-30
    TypeScript JavaScript
  • Vue3中toRef与toRefs的区别是什么
    这篇文章主要讲解了“Vue3中toRef与toRefs的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3中toRef与toRefs的区别是什么”吧!作用:创建一个ref对象,...
    99+
    2023-06-29
  • Android中gravity与layout_gravity的使用区别分析
    android:gravity:设置的是控件自身上面的内容位置 android:layout_gravity:设置控件本身相对于父控件的显示位置。 看下如下代码段 代码如下:&...
    99+
    2022-06-06
    layout_gravity gravity Android
  • MySQL中create table as 与like的区别分析
    这篇文章主要介绍了MySQL中create table as 与like的区别,结合实例分析了二者在使用中的具体区别与主要用途,需要的朋友可以参考下,具体如下:对于mysql的复制相同表结构方法,有crea...
    99+
    2024-04-02
  • 如何分析git中fork与branch的区别
    本篇文章给大家分享的是有关如何分析git中fork与branch的区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。区别:1、fork是一个GitHub操作,可以克隆出一个仓库...
    99+
    2023-06-26
  • vue3与vue2的区别是什么
    这篇“vue3与vue2的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue3与vue2的区别是什么”文章吧。1...
    99+
    2023-06-29
  • JS中Require与Import区别对比分析
    require 和 import对比区别 在 JavaScript 中,require 和 import 都是用来导入模块的。require 是 Node.js内置的方法,而 i...
    99+
    2023-03-02
    JS Require对比Import区别 Require Import区别
  • 浅析php中==与===的区别
    在PHP中,有时候我们需要比较两个变量是否相等。为了实现这个功能,我们可以使用等于操作符“==”或者全等操作符“===”。虽然两个操作符都可以完成相等比较,但是它们之间还是存在一些差别。在本文中,我们将分别介绍“==”和“===”的具体作用...
    99+
    2023-05-14
    === == php
  • 如何分析ecmascript与js的区别
    如何分析ecmascript与js的区别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。区别:1、js需要通过document、...
    99+
    2024-04-02
  • css与html的区别实例分析
    这篇“css与html的区别实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“css与...
    99+
    2024-04-02
  • 详细分析PHP7与PHP5区别
    1、php标量类型和返回类型声明 #主要分为两种模式,强制性模式和严格模式 declare(strict_types=1) #1表示严格类型校验模式,作用于函数调用和返回语句;0...
    99+
    2024-04-02
  • CommonJS与ES6 Module的使用区别分析
    目录前言1. CommonJS1.1 导出1.2 导入2. ES6 Module2.1 导出2.2 导入3. CommonJS 与 ES6 Module 的区别3.1 区别一3.2 ...
    99+
    2024-04-02
  • 分析概述IPv6与IPv4的应用与区别
    网购、网游、网聊、网络直播、网上… 这个年代要是没有了这张“网” 我们的生活几乎无法运行 你有想过网络互通如何实现的吗? 虚拟世界如何确定网上的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作