Vue.js入门系列(十九):深入理解和应用组件自定义事件

news2024/9/20 10:30:46

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页:码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

目录

      • Vue.js入门系列(十九):深入理解和应用组件自定义事件
        • 引言
      • 一、组件自定义事件的绑定
        • 1.1 什么是自定义事件?
        • 1.2 绑定自定义事件
      • 二、组件自定义事件的解绑
        • 2.1 为什么需要解绑事件?
        • 2.2 手动解绑自定义事件
        • 2.3 自动解绑
      • 三、组件自定义事件的总结
        • 3.1 主要应用场景
        • 3.2 常见实践
      • 四、TodoList案例中的自定义事件
        • 4.1 引入自定义事件
        • 4.2 自定义事件的实现
      • 五、总结
        • 5.1 关键点回顾

Vue.js入门系列(十九):深入理解和应用组件自定义事件

引言

在Vue.js中,组件之间的通信是构建复杂应用的关键。自定义事件是父子组件之间传递信息和触发行为的一种常用方式。通过自定义事件,子组件可以向父组件传递数据或通知父组件进行某些操作。在本篇博客中,我们将详细探讨组件自定义事件的绑定与解绑,并通过TodoList案例展示如何使用自定义事件来实现更灵活的组件通信。


一、组件自定义事件的绑定

1.1 什么是自定义事件?

自定义事件是Vue.js中子组件与父组件之间通信的一种机制。子组件通过调用$emit方法触发事件,父组件通过v-on指令(或@符号)监听并响应这些事件。

1.2 绑定自定义事件

当子组件需要将某些信息传递给父组件时,可以使用自定义事件。父组件通过在子组件标签上使用v-on@来绑定事件处理程序。

Vue.component('child-component', {
  template: `<button @click="notifyParent">Click Me</button>`,
  methods: {
    notifyParent() {
      this.$emit('notify', 'Hello from Child');
    }
  }
});

new Vue({
  el: '#app',
  template: `<child-component @notify="handleNotify"></child-component>`,
  methods: {
    handleNotify(message) {
      console.log(message);
    }
  }
});

在这个示例中,child-component子组件触发notify事件,并通过$emit方法传递一个消息字符串。父组件在标签上监听notify事件,并通过handleNotify方法处理事件并接收消息。


二、组件自定义事件的解绑

2.1 为什么需要解绑事件?

在某些情况下,我们可能需要手动解绑事件监听器,以避免内存泄漏或在组件被销毁后继续触发不必要的操作。例如,当组件的生命周期结束时,如果不解绑事件,仍然保留的事件监听器可能会引发意外的行为。

2.2 手动解绑自定义事件

Vue.js 提供了$off方法,用于手动解绑已绑定的事件监听器。

Vue.component('child-component', {
  template: `<button @click="notifyParent">Click Me</button>`,
  methods: {
    notifyParent() {
      this.$emit('notify', 'Hello from Child');
    }
  },
  mounted() {
    this.$emit('notify', 'Child Mounted');
  },
  beforeDestroy() {
    this.$off('notify');
  }
});

new Vue({
  el: '#app',
  template: `<child-component @notify="handleNotify"></child-component>`,
  methods: {
    handleNotify(message) {
      console.log(message);
    }
  }
});

在这个示例中,我们在beforeDestroy钩子中使用了$off方法手动解绑notify事件,以确保在组件销毁时,所有相关的事件监听器都被清理掉。

2.3 自动解绑

Vue.js在组件销毁时会自动解绑所有由$on绑定的事件监听器,因此在大多数情况下不需要手动解绑。但对于全局事件或在非Vue实例上的事件监听(如windowdocument),需要手动解绑以避免内存泄漏。


三、组件自定义事件的总结

3.1 主要应用场景

自定义事件在以下场景中非常有用:

  • 父子组件通信:子组件可以通过事件通知父组件数据的变化或用户的操作。
  • 解耦组件:自定义事件使得组件之间的耦合度降低,组件只需要关心自己触发的事件,而不必了解父组件的具体实现。
  • 组件复用:通过自定义事件,组件可以被更好地复用,因为事件机制使得组件的行为更加灵活。
3.2 常见实践
  • 命名规范:使用以动词开头的事件名,如notifyupdate,以便清晰表达事件的意图。
  • 事件传递数据:可以通过$emit传递多个参数,或传递一个对象,灵活地将信息传递给父组件。
  • 解绑事件:尽管Vue.js会自动处理大部分事件的解绑,但对于自定义的全局事件或DOM事件,开发者仍需注意在合适的时机手动解绑。

四、TodoList案例中的自定义事件

4.1 引入自定义事件

在TodoList案例中,我们可以通过自定义事件来实现更优雅的组件通信。假设我们将任务列表和任务项分别封装为两个组件:TaskListTaskItem

<div id="app">
  <task-list :tasks="tasks" @remove-task="removeTask"></task-list>
</div>
Vue.component('task-list', {
  props: ['tasks'],
  template: `
    <ul>
      <task-item v-for="task in tasks" :key="task.id" :task="task" @remove="removeTask"></task-item>
    </ul>
  `,
  methods: {
    removeTask(taskId) {
      this.$emit('remove-task', taskId);
    }
  }
});

Vue.component('task-item', {
  props: ['task'],
  template: `
    <li>
      <input type="checkbox" :checked="task.completed" @change="$emit('toggle', task.id)" />
      <span>{{ task.text }}</span>
      <button @click="$emit('remove', task.id)">Delete</button>
    </li>
  `
});

new Vue({
  el: '#app',
  data: {
    tasks: [
      { id: 1, text: 'Learn JavaScript', completed: false },
      { id: 2, text: 'Learn Vue.js', completed: true },
      { id: 3, text: 'Build something awesome', completed: false }
    ]
  },
  methods: {
    removeTask(taskId) {
      this.tasks = this.tasks.filter(task => task.id !== taskId);
    }
  }
});
4.2 自定义事件的实现

在上面的代码中,我们将任务列表和任务项分别封装为两个组件,并通过自定义事件实现了它们之间的通信:

  • TaskItem组件:当用户点击删除按钮时,TaskItem组件触发remove事件,并将任务的ID传递给父组件TaskList
  • TaskList组件:监听TaskItem组件的remove事件,并在内部触发remove-task事件,将任务ID传递给父组件App
  • App组件:监听remove-task事件,执行删除任务的逻辑。

这种模式使得组件之间的通信变得更加清晰和模块化,便于维护和扩展。


五、总结

自定义事件是Vue.js中实现父子组件通信的重要机制。通过本篇博客,你应该掌握了如何绑定和解绑自定义事件,并了解了它们在实际开发中的应用场景。通过将自定义事件集成到TodoList案例中,我们进一步实践了Vue.js的这一重要功能。

5.1 关键点回顾
  • 自定义事件的绑定:子组件通过$emit触发事件,父组件通过v-on@来监听和处理事件。
  • 自定义事件的解绑:通常情况下,Vue.js会自动处理事件解绑,但在某些场景下,手动解绑是必要的。
  • TodoList案例的实践:通过自定义事件实现组件之间的通信,增强了应用的模块化和复用性。

通过本篇博客的学习,你已经深入理解了Vue.js中的自定义事件机制,并能够在实际项目中灵活运用它们。在接下来的博客中,我们将继续探索更多Vue.js的高级特性和最佳实践。如果你有任何问题或建议,欢迎在评论区留言讨论。感谢你的阅读,期待在下一篇博客中继续与大家分享更多的Vue.js开发技巧与经验!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-奥运奖牌计数

题目描述 2008 年北京奥运会&#xff0c;A 国的运动员参与了 n 天的决赛项目 (1≤n≤100)。现在要统计一下 A 国所获得的金、银、铜牌数目及总奖牌数。输入第 1 行是 A 国参与决赛项目的天数 n&#xff0c;其后 n 行&#xff0c;每一行是该国某一天获得的金、银、铜牌数目&…

小程序连接MQTT服务器,以及配置,避坑

1、MQTT服务器域名配置 由于小程序必须使用域名方式连接socket&#xff0c;所以必须为MQTT服务器配置域名&#xff0c;并配置SSL证书。 1.1相关文档&#xff1a; EMQX 企业版安装 | EMQX 企业版 4.4 文档 EMQX MQTT 微信小程序接入 | EMQX 4.2 文档 MQTT 下载引入和配置连…

【图像去噪】论文精读:Multi-level Wavelet-CNN for Image Restoration(MWCNN)

请先看【专栏介绍文章】&#xff1a;【图像去噪&#xff08;Image Denoising&#xff09;】关于【图像去噪】专栏的相关说明&#xff0c;包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总&#xff08;更新中…

Spring入门之IOC(包含实例代码)

目录 什么是Spring&#xff1f;什么是Spring IOC&#xff1f;如何创建一个Spring IOC项目&#xff1f;1. 导入Maven项目依赖2. 准备一个实体类&#xff08;先定义接口再实现&#xff09;3. 准备配置文件4. 在Test类中测试 IOC中的Bean管理实例化Bean的三种方式 什么是Spring&am…

微信中如何搜索附近的人

我们 微信 下面选择 发现 然后 点卷 附件 进入后 头上的页签 切换成 附件的人 在列表中点击后即可添加附件的人啦

鸿蒙启动框架配置文件(StartUpTask)

{"startupTasks": [//有哪些任务{"name": "StartupTask_001",//任务名字"srcEntry": "./ets/startup/StartupTask_001.ets",//任务的文件路径"runOnThread": "taskpool",//运行在哪个现成&#xff0c;有…

泰克TDP1000差分探头Tektronix TDP0500参数资料

泰克Tektronix TDP0500 TDP1000 高压差分探头 ​Tektronix TDP1000 高压差分探头是一款多功能且易于使用的探头&#xff0c;可提供开关电源、CAN/LIN 总线和高速数字系统设计所需的高速电气和机械性能。Tektronix TDP1000 探头专为与 TekVPI 探头接口或 TekProbe BNC 接口配…

Java:路径计算与障碍物处理

Java 实现寻找字符串数组中的最长公共前缀及不同路径数量计算&#xff08;含障碍物&#xff09; 在计算机科学和软件开发中&#xff0c;经常需要解决一些基本但实用的问题。本文将介绍两种常见问题的解决方案&#xff1a;一是从一组字符串中找出最长公共前缀&#xff1b;二是计…

能力驱动的企业战略转型:基于能力规划的战略转型与数字化实践全指南

在当今数字化和全球化加速发展的时代&#xff0c;企业面临着复杂的市场环境和迅速变化的客户需求。为了在竞争中脱颖而出&#xff0c;企业必须不仅制定卓越的战略&#xff0c;还需确保这些战略能够有效地转化为实际行动。基于能力规划&#xff08;Capability-Based Planning, C…

Lua 代码编码规范

lua代码格式 vscode stylua 插件 配置文件stylua.toml column_width 240 line_endings “Unix” indent_type “Spaces” --使用空格 很重要&#xff0c;保证不同编辑器打开是一样的 indent_width 4 quote_style “AutoPreferDouble” --字符串引号样式双引号 call_paren…

海康二次开发学习笔记9-通讯触发及模块列表获取

通讯触发及模块列表获取 模块列表获取 获取流程中所有模块的模块名,添加下拉框用于显示模块名 1. 处理Combox2的DropDown事件 /// <summary>/// 模块列表获取/// </summary>/// <param name"sender"></param>/// <param name"e&q…

MCU官方IDE软件安装及学习教程集合 — STM32CubeIDE(STM32)

简介 各MCU厂商为保证产品的市场地位以及用户体验&#xff0c;不断的完善自己的产品配套&#xff0c;搭建自己的开发生态&#xff0c;像国外ST公司&#xff0c;国内的GD&#xff08;兆易创新&#xff09;&#xff0c;AT&#xff08;雅特力&#xff09;等等。目前就开发生态而言…

测试.net core服务项目调用dotNetify-Pulse监控性能的基本用法

微信公众号“DotNet讲堂”的文章《开源 .NET API 实时监控项目》介绍了开源实时日志及性能监控项目dotNetify-Pulse&#xff0c;在项目中引用简单&#xff0c;既能用其自带的监控页面&#xff0c;也支持按需配置监控页面。本文在之前创建的环境检测项目中添加并测试dotNetify-P…

逆向工程核心原理 Chapter20 | “内嵌补丁”练习

前言 自己学《逆向工程核心原理》一书的记录&#xff0c;只记录自己觉得重要/有用的一些点。 知识点学习 很实用的一个逆向技术。 原理&#xff1a; “壳”的逻辑也是这样的。EP处先解密OEP代码&#xff0c;再跳转到洞穴代码&#xff0c;恢复IAT之类的&#xff0c;然后跳回…

免费分享-MATLAB代码融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型

融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型 通过融合正余弦和柯西变异改进麻雀搜索算法&#xff0c;对CNN-BiLSTM的学习率、正则化参数以及BiLSTM隐含层神经元个数等进行优化 预测效果图如下 代码如下&#xff1a; %% 清空环境变量 wa…

Vue(七) TodoList案例1.0

文章目录 组件化编码流程(通用)1. 拆分静态组件2. 初始化列表展示动态数据如何让一个标签动态的拥有某一个属性 3. 按回车添加todo子组件给父组件传值之props 4. 勾选与取消勾选一个Todo5. 删除6. footer底部统计7. footer底部交互7.1 全选框自动打勾7.2 全选框取消勾选 8. 清除…

【java】vscode配置javaweb开发环境

下载jdk https://www.oracle.com/java/technologies/downloads/?er221886下载完毕直接安装&#xff0c;安装完毕自动添加以下环境变量 在cmd中运行 java -version出现以下代表成功 再添加系统变量 下载Maven https://maven.apache.org/download.cgi下载完解压放到自己方…

win10环境下gvim离线配置插件的一些补充

0 总述 在上一篇博客&#xff0c;即《Windows系统下使用gvim配置LaTeX快速书写环境》一文中&#xff0c;本小白试图模仿神级人物Gilles Castel&#xff0c;打造vim下的 LaTeX \LaTeX LATE​X书写环境。实话实说&#xff0c;东施效颦了。虽不至于一无所得&#xff0c;但也仅仅算…

STM32通过ADM3222完成UART转232通信电平转换

1、简介 单片机默认串口输出电平是UART信号,但是在实际项目中经常需要将其转换成232电平,此时就需要ADM3222芯片来完成电平的转换,下面对使用过程进行总结。 2、硬件电路 从上图中可以看到芯片需要对1、18进行配置才能进行工作,通过查阅手册可知,1引脚需要配置低电平,…

生物信息学:DNA序列的构成

DNA序列是由一串字母表示的真实的或者假设的携带基因信息的DNA分子的一级结构。‌ DNA序列的构成基于四种特定的碱基&#xff0c;分别是腺嘌呤&#xff08;A&#xff09;、胸腺嘧啶&#xff08;T&#xff09;、鸟嘌呤&#xff08;G&#xff09;和胞嘧啶&#xff08;C&#xff…