在Vue中当执行this.$emit() 时发生了什么?this.$emit() 的调用是异步的吗?

2023-11-17

当在Vue组件中调用this. e m i t ( ) 时 , 实 际 上 是 调 用 了 ‘ V u e . p r o t o t y p e . emit()时,实际上是调用了 `Vue. prototype. emit()Vue.prototype.emit` 方法。
下面我们来看看Vue.$emit方法的定义

Vue.$emit 的方法源码位于 Vue源码目录下的src/core/instance/event.js

Vue.prototype.$emit = function (event: string): Component {
    const vm: Component = this
    if (process.env.NODE_ENV !== 'production') {
      const lowerCaseEvent = event.toLowerCase()
      if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
        tip(``)
      }
    }
    let cbs = vm._events[event]
    if (cbs) {
      cbs = cbs.length > 1 ? toArray(cbs) : cbs
      const args = toArray(arguments, 1)
      const info = `event handler for "${event}"`
      for (let i = 0, l = cbs.length; i < l; i++) {
        invokeWithErrorHandling(cbs[i], vm, args, vm, info)
      }
    }
    return vm
  }

从源码中可以看出$emit的执行是同步的,当 $emit执行之后会去遍历注册的事件数组

也就是说 this.$emit 之后的代码会在 $emit执行完成之后执行

那了解这个机制有什么用呢?可以用在什么地方呢?

答案是

可以用于子组件与父组件之间的联动也就是便于子组件实时获取父组件的数据,这个数据可通过Prop传递。

假设子组件中的this.$emit 执行之后要进行网络请求,这个网络请求依赖于父组件的中某个可变的数据或者依赖于父组件几个数据经过一定运算后得出的结果,这个时候就非常有用了。

你可能会说,这种情况可以通过提前把关联的变量都传给子组件来解决。这样是可以解决问题但是不够灵活,当你一个页面有几十个组件联动都有类似的需求后,这种方式就会变得非常的麻烦且很难维护。也有同学可能会说既让几十个组件都有需求那就直接用inject注入的方式来复制就好了,这种方式也可以但是组件的复用会变得麻烦,因为你需要在每个用到子组件的地方都注入数据。

下面我们用一个例子来演示这种情况。

  • 首先定义一个子组件
<template>
    <div class="child-container">
        <div>我是子组件</div>
        <div>子组件获取父组件数据进行列表展示</div>
        <button @click="onSearch">获取父组件参数后进行数据更新</button>
        <ul>
            <li v-for="(item,key) in list" :key="key">Hello{{key}}</li>
        </ul>
    </div>
</template>
<script>
    export default {
        name: "EmitComponent",
        props:{
            searchParam:{
                type:Object,
                default:()=>{}
            }
        },
        data(){
            return{
                list:[]
            }
        },
        methods:{
            onSearch(){
                this.$emit('getParam')
                if(this.searchParam.value === 10){
                    for (let i = 0; i < 10; i++) {
                        this.list.push(i)
                    }
                }else{
                    this.list.push(1)
                }
            }
        }

    }
</script>

在子组件中通过发送getParam 参数来获取父组件中传递的值来决定页面的展示当同步且正确的获取时,会展示10项列表数据,当获取失败时只展示1个

下面是父组件中的代码:

<template>
    <div>
        <div>$emit function 同步测试</div>
        <EmitComponent
            :search-param="childParam"
            @getParam="getParam"
        ></EmitComponent>
    </div>
</template>
<script>
    import EmitComponent from './_component/EmitComponent'
    export default {
        name: "TestEmit",
        components:{EmitComponent},
        data(){
            return{
                childParam:{
                    value:1
                }
            }
        },
        methods:{
            getParam(){
                this.childParam.value = 10
            }
        }
    }
</script>

父组件的逻辑很简单就是改变传给子组件Prop的值来模拟子组件从父组件获取指定运算数据的情况。

来看一下演示结果:
在这里插入图片描述
结果与预期的一致。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Vue中当执行this.$emit() 时发生了什么?this.$emit() 的调用是异步的吗? 的相关文章

随机推荐

  • 初始C语言——数组的行和列互换

    define CRT SECURE NO WARNINGS 1 防止visual studio2013以上版本scanf报错 vc6 0环境可忽略 include
  • 小案例:页面滚动事件以及导航栏点击

    HTML html实现方法一 导航栏a标签href 要与下列div中id属性对应 点击a标签即可滑动到对应id的div div class navbar 导航栏 ul class rightheader li a class page sc
  • 5G承载网络技术发展趋势

    导读 随着5G建设的日渐加快 5G与云网融合共生互促 推动承载网络技术不断发展演进 云网融合必将成为行业高质量发展的必然趋势 当前云网融合面临着新需求与新挑战 5G承载网络技术在确定性保障 定制化服务和智能管控运维等技术方面也面临着新的发展
  • 5个最流行的可用于移动开发的嵌入式数据库简介

    嵌入式数据库是轻量级的 独立的库 没有服务器组件 无需管理 一个小的代码尺寸 以及有限的资源需求 目前有几种嵌入式数据库 你可以在移动应用程序中使用 让我们来看看这些最流行的数据库 数据库 数据类型存储 License 支持平台 Berke
  • 【2019.11.12】C语言中求最大值和最小值的两种方法

    C语言中求最大值和最小值的两种方法 编写完整的程序 输入三个数 输出其中的最大数 最小数 输入说明 两个整数N1 N2 N3 输出说明 最大数 最小数 输入样例 5 4 9 输出样例 9 4 方法一 include
  • C++学习教程大纲

    以下是C 学习教程的大纲 第一部分 基础知识 C 简介 什么是C C 的历史 C 的特点和优势 开发环境的搭建 安装C 编译器 配置开发环境 第一个C 程序 Hello World程序 程序的结构 编译和运行程序 数据类型和变量 基本数据类
  • jQuery的三种$()

    号是jQuery 类 的一个别称 构造了一个jQuery对象 所以 可以叫做jQuery的构造函数 个人观点 呵呵 1 可以是 expresion 即css选择器 Xpath或html元素 也就是通过上述表达式来匹配目标元素 比如 a 构造
  • 应急响应篇:windows入侵排查

    前言 应急响应 Incident Response Service IRS 是当企业系统遭受病毒传播 网络攻击 黑客入侵等安全事件导致信息业务中断 系统宕机 网络瘫痪 数据丢失 企业声誉受损 并对组织和业务运行产生直接或间接的负面影响时 急
  • 《码上行动:零基础学会Python编程》书籍分享

    Python是一种高级的 面向对象的编程语言 由Guido van Rossum于1991年开发 它具有简洁 易读和可维护的语法 被广泛用于科学计算 Web开发 数据分析 人工智能等领域 以下是Python的一些特点和优势 简洁易读 Pyt
  • 还对Flutter理解不透?看完这些迟早成为大佬~

    Flutter是什么 Flutter简介 Flutter是谷歌的移动UI框架 可以快速在iOS和Android上构建高质量的原生用户界面 一份代码可以同时生成iOS和Android两个高性能 高保真的应用程序 Flutter目标是使开发人员
  • 2023年最火副业:Python爬虫兼职,一周赚7800元,一天只要两小时 !

    现在学习python的人越来越多了 跟大家简单如何利用python搞副业赚钱的 想要利用 Python 赚钱的方式还是比较多的 其中接单和投稿算是两种比较简单的方式了 如果你是业余学python爬虫 可以去淘宝上加了找了几个店铺直接问需要爬
  • 数据结构和算法(4):栈与队列

    栈 ADT 及实现 栈 stack 是存放数据对象的一种特殊容器 其中的数据元素按线性的逻辑次序排列 故也可定义首 末元素 尽管栈结构也支持对象的插入和删除操作 但其操作的范围仅限于栈的某一特定端 也就是说 若约定新的元素只能从某一端插入其
  • 文本域左边的文字处理

    文本域左边文字默认是bottom 如果想要左边文字与文本域顶部平齐 那么只需要设置label的vertical align的属性值为top即可 设置前 设置后
  • 代码分析(一)

    2021SC SDUSC 分析前言 对于APIJSON的代码分析首先就是 看一下该项目的作用以及如何进行 看一下原来不部署这个项目的正常流程 再来看一下部署上APIJSON后项目的流程走向 接下来开始按照这个流程对相应的代码进行分析 Abs
  • windows xcopy 复制文件夹命令 覆盖 或 跳过

    xcopy 拓展的复制命令 复制目录和下面的文件 保持目录结构 不能复制系统文件 隐藏文件 xcopy 源路径 目标路径 常用 复制并且覆盖 xcopy y srcPath dstPath 复制目录和目录下文件并且对目录下的子目录和子目录的
  • 一款好用的国产软件源代码缺陷分析平台 — CodeSense

    CodeSense是新一代的软件源代码缺陷深度分析平台 包含多个自研的代码分析引擎 同时提供开放的方案 支持多种商业 开源分析引擎集成并对结果进行集中展示 与目前市面的国外商业工具对比 在语言种类 功能 标准 缺陷分类数量上 已达到一致 额
  • 论文阅读-Training a Helpful and Harmless Assistant withReinforcement Learning from Human Feedback

    一 论文信息 论文名称 Training a Helpful and Harmless Assistant withReinforcement Learning from Human Feedback Github GitHub anthr
  • JavaWeb - 仿小米商场(4):首页商品分类展示

    JavaWeb 仿小米商场 4 首页线路分类展示 1 功能描述 接上篇JavaWeb 仿小米商场 3 登录与退出本篇博客将分析和实现旅游线路分类内容的查询和展示 此功能旨在控制 banner 顶部的展示内容 如以下H5页面所示 2 功能分析
  • Uniapp零基础开发学习笔记(9) -媒体组件音视频摄像头等的练习使用

    Uniapp零基础开发学习笔记 9 媒体组件音视频摄像头等的练习使用 基础组件部分 最后就只剩余媒体组件以及地图 和画布Canvas 以及浏览器组件web view 此次先看看媒体组件 重点学习前面几个 链接如下 https uniapp
  • 在Vue中当执行this.$emit() 时发生了什么?this.$emit() 的调用是异步的吗?

    当在Vue组件中调用this e m i t 时 实 际