首页 > 其他分享 >Vue3实战笔记(47)— 一探emit奥秘——组件间通信的艺术与实践

Vue3实战笔记(47)— 一探emit奥秘——组件间通信的艺术与实践

时间:2024-05-27 21:04:51浏览次数:16  
标签:Vue handleChildEvent 47 Vue3 emit 间通信 child 组件 event

文章目录


前言

Vue封装了自定义组件之后,如果子组件想要向父组件传递数据该怎么办?

Vue.js 中的 emit 方法就是主要用于组件间的通信,特别是父组件与子组件之间的通信机制。它是 Vue 组件内部触发自定义事件并向父级组件传递数据的一种方式。


一、Vue 2 中的emti

在 Vue 组件中,当你想要向父组件传递信息或通知父组件某个状态发生了改变时,可以使用 $emit。通常情况下,子组件无法直接修改父组件的数据,而是通过定义并触发一个自定义事件,由父组件监听并在回调函数中作出响应。

但是要注意,Vue2和Vue3的用法略有不同。
Vue 2 示例:

<!-- 父组件(parent-component.vue) -->
<template>
  <div>
    <child-component @child-event="handleChildEvent" />
  </div>
</template>
 
<script>
import ChildComponent from './child-component.vue';
 
export default {
  components: { ChildComponent },
  methods: {
    handleChildEvent(data) {
      console.log('接收到的数据:', data);
    }
  }
}
</script>
<!-- 子组件(child-component.vue) -->
<template>
  <div>
    <button @click="sendData">发送数据</button>
  </div>
</template>
 
<script>
export default {
  methods: {
    sendData() {
      this.$emit('child-event', '这是发送的数据');
    }
  }
}
</script>

在这个例子中,子组件 child-component.vue 使用 $emit 方法触发了一个名为 child-event 的自定义事件,并传入了一个参数 data。父组件 parent-component.vue 通过监听 child-event 事件并定义一个处理函数 handleChildEvent 来接收数据。当子组件中的按钮被点击时,会触发 child-event 事件,父组件会接收到数据并在控制台中打印出来。

二、Vue 3的emit

Vue 3 示例:


<!-- 父组件(parent-component.vue) -->
<template>
  <div>
    <child-component ref="childRef" />
  </div>
</template>
 
<script>
import ChildComponent from './child-component.vue';
 
export default {
  components: { ChildComponent },
  setup() {
    const childRef = ref(null);
 
    function handleChildEvent(data) {
      console.log('接收到的数据:', data);
    }
 
    onMounted(() => {
      childRef.value.$on('child-event', handleChildEvent);
    });
 
    onUnmounted(() => {
      childRef.value.$off('child-event', handleChildEvent);
    });
 
    return { childRef };
  }
}
</script>

<!-- 子组件(child-component.vue) -->
<template>
  <div>
    <button @click="sendData">发送数据</button>
  </div>
</template>
 
<script>
export default {
  methods: {
    sendData() {
      this.$emit('child-event', '这是发送的数据');
    }
  }
}
</script>

在这个例子中,父组件 parent-component.vue 使用 ref 属性创建了一个引用,并将其分配给子组件。在 setup 函数中,定义了一个处理函数 handleChildEvent 用于处理自定义事件。在 onMounted 钩子中,使用子组件引用的 $on 方法监听 child-event 事件。在 onUnmounted 钩子中,使用子组件引用的 $off 方法取消对 child-event 事件的监听。当子组件中的按钮被点击时,会触发 child-event 事件,父组件会接收到数据并在控制台中打印出来。


总结

做一个积极向上的人,给自己和他人带来阳光。

标签:Vue,handleChildEvent,47,Vue3,emit,间通信,child,组件,event
From: https://blog.csdn.net/loveshenhaitao/article/details/139224200

相关文章

  • vue3计算属性
    基础示例模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象:我们想根据author是否已有一些书籍来展示不同的信息:这里的模板看起来有些复杂。我们必须认真看好一会儿才能明白......
  • 升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0 uniapp、vue、android、web 框
    升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0uniapp、vue、android、web框架:Vue3+SpringBoot3),界面功能(一)  升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0uniapp、vue、android、web框架:Vue3+SpringBoot3),界面功能(一) 1.登录与申请试用界......
  • 快充催NB群 974764414
    现在手机电池容量是按多少v计算啊,3.8v还是5v。比如说充入10wh,对应多少ah 3.85,满电4.35@天梦 “满电4.35”是什么意思@ 字面意思,充满4.35 @天梦 那官方宣传的5000mAh是按3.85v还是4.35v啊,比如说“小米13Ultra手机搭载5000mAh容量电池”  @天梦 那官方宣传的5000......
  • 【Linux学习】进程间通信 (2) —— 信号
    下面是有关进程通信中信号的相关介绍,希望对你有所帮助!小海编程心语录-CSDN博客目录1.信号 1.1概念 1.2信号的产生 1.3信号的处理方式 2.函数 2.1kill()函数 2.2 signal()函数 2.3 sigaction()函数 2.4 sigprocmask()函数 2.5sigqueue()函数......
  • Vue3.4+版本中的 defineModel 宏的用法示例
    关于defineModel,Vue官方给出了较为详细的解释,具体请看文档说明下面是整理出的一个简易示例:子元素代码://Comp.vue<scriptsetup>constmsg=defineModel('msg',{type:String,default:''});constscore=defineModel('score',{type:Number,default:0})......
  • 进程间通信(管道)、多线程理论、开设多线程的两种方式、threading介绍、线程之间共享数
    【一】进程间通信(管道)借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取出。这种通信方式是非阻塞的,即发送进程不需要等待接收进程的响应即可继续执行。multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的进程间通信(IPC)有两种方式:队列......
  • 互斥锁、进程间通信(IPC)、队列(queue)模块、队列实现进程间通信、生产者和消费者模型
    【一】互斥锁【1】什么是进程同步(互斥锁)互斥锁(Mutex)是一种用于多线程编程中控制对共享资源访问的机制。其作用是保证在同一时刻只有一个线程在访问共享资源,从而避免多个线程同时读写数据造成的问题。互斥锁的基本原理是在对共享资源进行访问前加锁,使得其他线程无法访问该......
  • Vue3标签组件绘制--自定义按钮组件
    不知道怎么的,突然想绘制一个标签,比如el-button什么的。今天研究一下吧,不知道能不能整出来以后就可以绘制自己的组件,弄自己的组件库了。不知道有朝一日能不能让越组件青史留名?嘻嘻,百日梦做差不多了,接着去查查资料。文章分为三个部分:1.按钮组件实现(根据查阅的一个文章实现基......
  • Codeforces Round #947 题解 (A~G)
    目录A.BazokaandMocha'sArrayB.378QAQandMocha'sArrayC.ChamoandMocha'sArrayD.PainttheTreeE.ChainQueriesF.SetG.ZimphaFanClubA.BazokaandMocha'sArray枚举每个循环移位判断.B.378QAQandMocha'sArray首先最小的数肯定得选,删掉最小的数的倍数......
  • Codeforces Round 947 (Div. 1 + Div. 2) E. Chain Queries
    本来决定开摆养生不打的,但11点半的时候点进去看到这个题是个疑似DS,写题的欲望瞬间高涨,然后就40min写了这个题然而赛中并不能提交,只好等到第二天早上再交一发,没想到还WA了一发才过首先这题如果我们能确定当前黑色点集的链的两个端点\(x,y\)的话,这个题就非常显然了只需要求出\((x......