【Vue】组件自定义事件 TodoList 自定义事件数据传输

目录

一、绑定

二、解绑

组件自定义事件总结

TodoList案例对数据传输事件的修改

总结不易~ 本章节对我有很大收获, 希望对你也是!!!


本章节素材已上传Gitee:yihaohhh/我爱Vue - Gitee.com

前面我们学习的clikc、keyup……等一系列为js内置的事件(给HTML元素用的),现在我们就要学习组件的自定义事件(给组件用的!)!

一、绑定

现在想一个问题,把子元素传给父元素有几种办法!

按照我们的进度, 现在只会通过props方法来得到App的函数然后进行传参这一种办法进行

那么现在就来介绍第二种办法:组件自定义事件_绑定

  • v-on:事件名="方法" 就是监听子组件触发的自定义事件。这个事件得由子组件用 $emit('事件名') 发出来。 
  • 给谁绑定事件 就找谁触发  给Student组件的实例对象
  • 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据 (第一种写法 使用@或者v-on)
    <!-- <Student v-on:atwhuc="getStudentName"/> --><Student @atwhuc="getStudentName"/>

大白话就是:“你每次喊一声 atwhuc,我就立刻执行 getStudentName() 这个方法。你喊一次我就干一次,喊十次我就干十次。” 这个事件绑定在Student组件上

Student组件:

<template><div class="student"><h1>{{ msg }}</h1><h2>学生姓名:{{ name }}</h2><h2>学生性别:{{ sex }}</h2><button @click="sendStudentName">把学生名给App</button></div>
</template><script>
export default {name:'Student',data() {return {msg:'我是一个武汉传媒学院的学生',name:'张三',sex: '男' }},methods: {sendStudentName() {// 触发Student的实例身上的atwhuc事件 // 该事件被触发 就让给方法传入了this.$emit('atwhuc', this.name, 666, 888, 999)}}}
</script><style scoped>.student {background-color: orange;padding: 5px;margin-top: 30px;}
</style>

这一种写法是通过在子组件中触发 $emit('atwhuc', 数据) 来发送一个自定义事件 'atwhuc',父组件通过 @atwhuc="方法" 监听这个事件,从而实现父子组件之间的传值和通信

在子组件中用 $emit 是在向父组件发消息,这条消息就叫“自定义事件”。 有通知的意思

📌 补充说明(理解更深一点):

  • 子组件不需要知道父组件的具体方法名,只管发事件(松耦合)。

  • 父组件监听这个事件并调用自己的方法,同时可以接收 $emit 传来的数据。

但是这么直接用,有点局限性,我们可以更灵活一点!

 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据 (第二种写法 使用ref)

    <Student ref="student"/>
  methods: {getSchoolName(name) {console.log('App收到了学校名', name)},getStudentName(name, ...params) {// params 是一个数组console.log('App被调用!', name, params)}},  
// 放一个生命周期钩子mounted() {// 灵活性强 setTimeout(() => {this.$refs.student.$on('atwhuc', this.getStudentName)}, 3000)this.$refs.student.$on('atwhuc', this.getStudentName) // 绑定自定义事件// 只触发一次this.$refs.student.$once('atwhuc', this.getStudentName) // 绑定自定义事件(一次性)}

this.$refs.student:

  • 就是你在 HTML 里写的 <Student ref="student" />,
  • 相当于你给这个组件起了个小名,方便后面找到它。

$on 当……时:

  • $on('atwhuc', this.getStudentName):
  • 是你在监听这个组件有没有“发出”一个叫 atwhuc 的信号。
  • 如果发了,那就去执行 getStudentName 这个方法。

二、解绑

对于事件的解绑 也是通过实践绑定来通过函数调用完成!

    <button @click="unbind">解绑atwhuc事件</button>
    unbind() {this.$off('atwhuc') // 只适用于解绑一个自定义事件// emitter.off 代替 $off// $on	emitter.on// $emit	emitter.emit}

可以发现this.$off  只能进行单个事件的解绑

解绑多个事件,用一个数组进行存储事件!

    this.$off(['atwhuc', 'demo']) 

更暴力的办法, 全部都解绑! 

      this.$off() // 全部都解绑 

销毁当前组件的全部实例

    <button @click="death">销毁当前Student组件的实例(vc)</button>
    death() {this.$destroy() // 销毁了当前的组件实例 销毁后 所有Student实例的自定义事件全都不奏效了}

 本章节素材已上传Gitee:yihaohhh/我爱Vue - Gitee.com 

组件自定义事件总结

想要把Student子组件的name传给父组件 可以用函数来接受Student的name值, 然后更新App组件的studentName的值

这是可行的!

<h1>{{ msg }}, 学生姓名是:{{ studentName }}</h1>
    getStudentName(name, ...params) {// params 是一个数组console.log('App被调用!', name, params),this.studentName = name},
    this.$refs.student.$on('atwhuc', function(name, ...params) {console.log('App被调用!', name, params),this.studentName = name}) // 绑定自定义事件

用ref也是可行的!

    <Student ref="student"/>mounted() {this.$refs.student.$on('atwhuc', this.getStudentName) // 绑定}

但是当我们将getStudentName注释掉之后直接在生命周期钩子里面写回调函数发现this.studentName却不能被赋值了!

    this.$refs.student.$on('atwhuc', function(name, ...params) {console.log('App被调用!', name, params),this.studentName = name}) // 绑定自定义事件

点击后不起作用,但是控制台仍然会被执行!

那么我们就重新对this进行打印,来进行观察!

    this.$refs.student.$on('atwhuc', function(name, ...params) {console.log('App被调用!', name, params),console.log(this)this.studentName = name}) // 绑定自定义事件

能够发现这些都是Student组件中才存在的, 只能说明 这个this就不是指向App组件的this ,而是Student组件的this

说明Vue的底层就是说明谁触发了‘atwhuc’这个事件, 那么这个事件的回调就会指向谁

那么就说明当我们写成箭头函数的时候:这个this就又重新回到了App组件上

    this.$refs.student.$on('atwhuc', (name, ...params)=> {console.log('App被调用!', name, params),console.log(this)this.studentName = name}) // 绑定自定义事件

那么组件可以用自定义事件,能不能用原生事件呢???点击事件呢??

    <Student ref="student" @click="show"/>
    show() {alert(123)}

可以发现其实并没效果! 原因就是这么写Vue就自动默认把click当作是一个自定义事件,要触发自定义事件,就必须要在Student组件上用$emit,就会进行触发了!

    sendStudentName() {// 触发Student的实例身上的atwhuc事件 // 该事件被触发 就让给方法传入了this.$emit('atwhuc', this.name, 666, 888, 999)this.$emit('demo') // 自定义事件名this.$emit('click')},

那么我们只需要添加一个修饰符,就可以让Vue明白我们这是一种原生事件, .native

    <Student ref="student" @click.native="show"/>

  1. 一种组件间通信的方式,适用于:<strong style="color:red">子组件 ===> 父组件</strong>

  2. 使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(<span style="color:red">事件的回调在A中</span>)。

  3. 绑定自定义事件:

    1. 第一种方式,在父组件中:<Demo @atguigu="test"/><Demo v-on:atguigu="test"/>

    2. 第二种方式,在父组件中:

        <Demo ref="demo"/>......mounted(){this.$refs.xxx.$on('atguigu',this.test)}
    3. 若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。

      触发自定义事件:this.$emit('atguigu',数据)

  4. 解绑自定义事件this.$off('atguigu')

  5. 组件上也可以绑定原生DOM事件,需要使用native修饰符。

  6. 注意:通过this.$refs.xxx.$on('atguigu',回调)绑定自定义事件时,回调<span style="color:red">要么配置在methods中</span>,<span style="color:red">要么用箭头函数</span>,否则this指向会出问题!

 本章节素材已上传Gitee:yihaohhh/我爱Vue - Gitee.com 

TodoList案例对数据传输事件的修改

对于子组件给父组件进行数据传输,就可以不在需要用props来传递一个函数,然后进行数据传输, 可以直接采用$emit来触发父组件的自定义事件

那么同理,框起来的全部都是传入的函数, 都是可以将props改写为$emit来进行数据传输,而todos是一个数据不能修改为函数进行传递,就不能用$emit来进行修改

都可以换种方式来获取自定义事件~

总结不易~ 本章节对我有很大收获, 希望对你也是!!!

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

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

相关文章

Windows远程连接MySQL报错,本地navicat能连接MySQL

一、报错 telnet 119.87.111.79 3306​​“无法打开到主机的连接。在端口 3306: 连接失败”​​ 表明无法通过 TCP 协议连接到目标服务器的 3306 端口。 二、目的 &#xff08;1&#xff09;​​Telnet 测试的目的​​ Telnet 仅用于测试 ​​TCP 端口是否开放​​&#xff…

电池管理系统BMS三级架构——BMU、BCU和BAU详解

储能电站的电池管理系统&#xff08;BMS&#xff09;通常采用三级架构&#xff1a;从控&#xff08;BMU&#xff09;、主控&#xff08;BCU&#xff09;、总控&#xff08;BAU&#xff09;。这种分层设计实现了电池模组、簇、堆的分级管理和控制&#xff0c;确保系统运行的安全…

C++ 基础复习

基础复习 1.const引用为什么能引用临时对象2.内联函数的额外作用3. nullptr 1.const引用为什么能引用临时对象 临时对象&#xff08;Temporary Object&#xff09;是在表达式求值过程中隐式创建的对象&#xff0c;例如&#xff1a; 函数返回非引用类型的值 类型转换&#xff0…

AI的出现,是否能替代IT从业者?

阐述观点&#xff1a;AI 的出现不会完全替代 IT 从业者&#xff0c;但会深刻改变 IT 行业的工作方式和岗位结构。 AI 不会完全替代 IT 从业者的原因 AI 本身需要人来开发与维护 AI 模型、系统架构、数据管道等都需要 IT 专业人员来构建和优化。 例如&#xff1a;AI 工程师、M…

【服务器通信-socket】——int socket(int domain, int type, int protocol);

#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议&#xff0c;使用TCP或UDP来传输&#xff0c;用IPv4的地址 AF_INET6 与上面类似&#xff0c;不过是来用IPv6的地…

Python基本环境搭配

Python3 环境搭建 | 菜鸟教程 里面有直接跳转 Fitten Code 按下 Tab 键接受所有补全建议&#xff1a; 按下 Ctrl→ 键(mac系统为Command→)接收单个词补全建议&#xff1a; 用户可通过点击左上角工具栏中的Fitten Code – 开始对话或者使用快捷键CtrlAltC(mac系统为Contr…

C++负载均衡远程调用学习之HOOK注册机制

目录 1.larV0.7-hook流程的说明 2.larV0.7-TCP_server集成链接HOOK函数 3.larV0.7-TCP_client集成链接HOOK注册功能 1.larV0.7-hook流程的说明 ### 7.1 数据库表相关查询方法实现 ​ 我们先实现一些基本的数据表达查询方法&#xff1a; > lars_dns/src/dns_rout…

Rust 与 Golang 深度对决:从语法到应用场景的全方位解析

一、引言 在软件开发的快速发展浪潮中&#xff0c;Rust 和 Golang&#xff08;Go 语言&#xff09;脱颖而出&#xff0c;成为开发者热议的编程语言。Rust 凭借强大的内存安全性与卓越的性能备受赞誉&#xff0c;Golang 则以简洁的语法和出色的并发处理能力赢得开发者青睐。本文…

C++负载均衡远程调用学习之订阅功能与发布功能

目录 1.lars-DnsV0.1回顾 2.Lars-DnsV0.2-订阅功能的订阅模块分析 3.Lars-DnsV0.2-订阅模块的类的单例创建及方法属性初始化 4.Lars-DnsV0.2-发布功能的实现 5.Lars-DnsV0.2-发布功能的总结 6.Lars-DnsV0.2-订阅流程复习 7.Lars-DnsV0.2-订阅模块的集成 8.Lars-DnsV0.2订…

SurfSense开源程序是NotebookLM / Perplexity / Glean的开源替代品,连接到外部来源,如搜索引擎

​一、软件介绍 文末提供程序和源码下载 虽然 NotebookLM 和 Perplexity 等工具令人印象深刻&#xff0c;并且对于对任何主题/查询进行研究都非常有效&#xff0c;但 SurfSense 通过与你的个人知识库集成来提升这种能力。它是一个高度可定制的 AI 研究代理&#xff0c;连接到外…

基于OpenTelemetry的分布式链路追踪Trace‌实现(PHP篇)

目录 引言一、OpenTelemetry是一套可观测性标准协议二、分布式追踪&#xff08;‌Trace‌&#xff09;是OpenTelemetry的核心功能之一三、OpenTelemetry的架构原理四、OpenTelemetry的分布式追踪&#xff08;‌Trace‌&#xff09;实践1、准备PHP环境2、下载SDK3、编写实例代码…

探索智能体的记忆:类型、策略和应用

AI Agent 中的记忆&#xff1a;类型、策略和应用 记忆实现是使智能体能够保持上下文、从过去的交互中学习并做出明智决策的关键组成部分。与人类记忆非常相似&#xff0c;智能体记忆允许 AI 系统随时间存储、检索和利用信息&#xff0c;从而为用户创造更连贯和个性化的体验。 …

leetcode 2395. Find Subarrays With Equal Sum

题目描述 代码&#xff1a; class Solution { public:bool findSubarrays(vector<int>& nums) {int len nums.size();if(len <2)return false;unordered_set<int> table;int sum 0;for(int i 1;i < len;i){sum nums[i-1]nums[i];if(table.contains(…

Kubernetes(k8s)学习笔记(七)--KubeSphere 最小化安装

前情提要 可视化操作面板对于开发、运维绝对是提升工作效率的一大利器&#xff0c;因此很有必要搭建一套可视化操作来管理Kubernetes。 可视化面板有多种&#xff1a; 1.Kubernetes官方提供的默认面板&#xff1a;dashboard&#xff0c;用处不大&#xff0c;放弃&#xff1b…

MCP连接Agent:AI时代的TCP/IP

介绍 2023年&#xff0c;生成式AI爆发。2024年&#xff0c;智能体&#xff08;Agent&#xff09;接棒成为AI新焦点。2025年&#xff0c;智能体似乎已经要开始爆发了。目前的智能体更像一个“单机App”&#xff1a;彼此不了解、无法通信&#xff0c;更不能协作。类似互联网早期…

交换机工作原理(MAC地址表、VLAN)

目录 一、交换机的基本工作原理 数据帧的转发 MAC地址表的作用 交换机的转发方式 二、VLAN&#xff08;虚拟局域网&#xff09; VLAN的定义 VLAN的作用 VLAN的实现方式 VLAN的帧标记 VLAN的通信 三、交换机与VLAN的结合 四、交换机与VLAN的实际应用场景 交换机是局…

eFish-SBC-RK3576工控板外部RTC测试操作指南

备注&#xff1a; 1&#xff09;测试时一定要接电池&#xff0c;否则外部RTC断电后无法工作导致测试失败&#xff1b; 2&#xff09;如果连接了网络&#xff0c;系统会自动同步NTP时钟&#xff0c;所以需要关闭自动同步时钟。 关闭自动同步NTP时钟方法&#xff1a; 先查看是…

淘宝按图搜索商品(拍立淘)Java 爬虫实战指南

在电商领域&#xff0c;按图搜索商品功能为用户提供了更直观、便捷的购物体验。淘宝的拍立淘功能更是凭借其强大的图像识别技术&#xff0c;成为许多开发者和商家关注的焦点。本文将详细介绍如何利用 Java 爬虫技术实现淘宝按图搜索商品功能&#xff0c;包括注册账号、上传图片…

【Redis】List类型

文章目录 List的特点介绍lpush&#xff0c;lpushx&#xff0c;rpush&#xff0c;rpushx命令lrange命令lpop和rpoplindex命令linsert命令llen命令lrem 命令ltrim命令lset命令阻塞版本的命令blpop和brpop 命令小结list的内部编码List的应用场景 List的特点介绍 列表相当于一个数…

QT:qt5调用打开exe程序并获取调用按钮控件实例2025.5.7

为实现在 VS2015 的 Qt 开发环境下打开外部 exe&#xff0c;列出其界面按钮控件的序号与文本名&#xff0c;然后点击包含特定文本的按钮控件。以下是更新后的代码&#xff1a; #include <QCoreApplication> #include <QProcess> #include <QDebug> #include…