当前位置: 首页 > news >正文

关于Vue23的$emit和$on发布订阅模式

关于Vue2&3的$emit和$on发布订阅模式

  • Vue 2 中 $emit 和 $on 的使用
  • Vue 3 中 $emit 和 $on 的使用
    • 1. $emit
    • 2. $on

$emit$onVue.js 中用于实现组件间通信的方法,不过它们在 Vue 2 和 Vue 3 中的使用场景和方式略有不同,下面分别进行介绍

Vue 2 中 $emit 和 $on 的使用

  1. emit
    作用emit 主要用于子组件向父组件传递数据
    子组件通过触发自定义事件,并携带数据,父组件监听这个自定义事件来接收数据
    子组件:在子组件中使用 this.$emit('eventName', data) 触发自定义事件
<!-- Child.vue -->
<template>
  <button @click="sendData">发送数据给父组件</button>
</template>

<script>
export default {
  methods: {
    sendData() {
      const data = '这是子组件传递的数据';
      this.$emit('customEvent', data);
    }
  }
};
</script>

父组件:在父组件中使用 v-on 指令监听子组件触发的自定义事件

<!-- Parent.vue -->
<template>
  <div>
    <Child @customEvent="handleEvent" />
    <p>接收到的数据: {{ receivedData }}</p>
  </div>
</template>

<script>
import Child from './Child.vue';

export default {
  components: {
    Child
  },
  data() {
    return {
      receivedData: ''
    };
  },
  methods: {
    handleEvent(data) {
      this.receivedData = data;
    }
  }
};
</script>
  1. on
    作用:on 用于监听自定义事件,通常结合事件总线(Event Bus)实现非父子组件间的通信
    事件总线是一个空的 Vue实例,充当事件的发布者和订阅者之间的桥梁
    创建事件总线
// eventBus.js
import Vue from 'vue';
export const eventBus = new Vue();

发送事件:在发送数据的组件中引入事件总线,并使用 $emit 触发自定义事件

<!-- Sender.vue -->
<template>
  <button @click="sendMessage">发送消息</button>
</template>

<script>
import { eventBus } from './eventBus.js';

export default {
  methods: {
    sendMessage() {
      const message = '这是一条消息';
      eventBus.$emit('messageEvent', message);
    }
  }
};
</script>

接收事件:在接收数据的组件中引入事件总线,并使用 $on 监听自定义事件

<!-- Receiver.vue -->
<template>
  <p>接收到的消息: {{ receivedMessage }}</p>
</template>

<script>
import { eventBus } from './eventBus.js';

export default {
  data() {
    return {
      receivedMessage: ''
    };
  },
  created() {
    eventBus.$on('messageEvent', (message) => {
      this.receivedMessage = message;
    });
  }
};
</script>

Vue 3 中 $emit 和 $on 的使用

1. $emit

作用:和 Vue 2 一样,用于子组件向父组件传递数据,但在 Vue 3 的组合式 API 中,使用 defineEmits 来声明要触发的事件

子组件

<template>
  <button @click="sendData">发送数据给父组件</button>
</template>

<script setup>
import { defineEmits } from 'vue';

const emits = defineEmits(['customEvent']);

const sendData = () => {
  const data = '这是子组件传递的数据';
  emits('customEvent', data);
};
</script>

父组件:和 Vue 2 类似,使用 v-on 指令监听自定义事件

<template>
  <div>
    <Child @customEvent="handleEvent" />
    <p>接收到的数据: {{ receivedData }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import Child from './Child.vue';

const receivedData = ref('');

const handleEvent = (data) => {
  receivedData.value = data;
};
</script>

2. $on

说明:在 Vue 3 中,官方推荐使用 mitt 或 EventEmitter 等第三方库来替代 Vue 2 中的事件总线。不过,如果你使用的是选项式 API,仍然可以使用类似 Vue 2 的方式创建事件总线并使用 $on 和 $emit。如果使用组合式 API,通常会使用第三方库来实现非父子组件间的通信

安装 mitt 试例

npm install mitt

创建事件总线

// eventBus.js
import mitt from 'mitt';
export const eventBus = mitt();

发送事件

<template>
  <button @click="sendMessage">发送消息</button>
</template>

<script setup>
import { eventBus } from './eventBus.js';

const sendMessage = () => {
  const message = '这是一条消息';
  eventBus.emit('messageEvent', message);
};
</script>

接收事件

<template>
  <p>接收到的消息: {{ receivedMessage }}</p>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import { eventBus } from './eventBus.js';

const receivedMessage = ref('');

const handleMessage = (message) => {
  receivedMessage.value = message;
};

onMounted(() => {
  eventBus.on('messageEvent', handleMessage);
});

onUnmounted(() => {
  eventBus.off('messageEvent', handleMessage);
});
</script>

综上所述
$emit 主要用于子组件向父组件传递数据,而 $on 用于监听自定义事件

相关文章:

  • Ubuntu工控卫士在制造企业中的应用案例
  • 【算法】图论 —— Dijkstra算法 python
  • 【计算机网络】深入解析 HTTP 协议的概念、工作原理和通过 Fiddler 抓包查看 HTTP 请求/响应的协议格式
  • 在运维工作中,Lvs、nginx、haproxy工作原理分别是什么?
  • 音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构
  • spring boot3-redis分库及配置
  • 微服务与消息队列RabbitMQ
  • Expo知识框架大全详解
  • DQN(Deep Q - Network)原理举例说明
  • 【量化策略】动量延续策略
  • 在Rocky Linux上安装Redis(DNF和源码安装)
  • 网络安全之端口扫描(一)
  • SpringBoot实现文件上传
  • 你为什么要写博客?
  • Linux系统编程--线程同步
  • WangEditor快速实现版
  • 在word下写公式
  • OneM2M:全球性的物联网标准-可应用于物联网中
  • [Kubernetes] 7控制平面组件
  • 排列组合定义及基本公式
  • 怎样用网站做单笔外贸/网络平台推广具体是怎么推广
  • 不良网站正能量进入窗口/百度开户怎么开
  • 专业网页设计制作价格/优化清理大师
  • 学校网站建设协议模板/上海seo优化
  • 一个人可以做网站/网页制作与设计
  • 域名交易网站源代码下载/大数据营销系统软件