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

news2025/7/12 15:45:09

目录

一、绑定

二、解绑

组件自定义事件总结

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.coloradmin.cn/o/2371922.html

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

相关文章

基于Centos7的DHCP服务器搭建

一、准备实验环境&#xff1a; 克隆两台虚拟机 一台作服务器&#xff1a;DHCP Server 一台作客户端&#xff1a;DHCP Clinet 二、部署服务器 在网络模式为NAT下使用yum下载DHCP 需要管理员用户权限才能下载&#xff0c;下载好后关闭客户端&#xff0c;改NAT模式为仅主机模式…

LabVIEW超声波液位计检定

在工业生产、运输和存储等环节&#xff0c;液位计的应用十分广泛&#xff0c;其中超声波液位计作为非接触式液位测量设备备受青睐。然而&#xff0c;传统立式水槽式液位计检定装置存在受建筑高度影响、量程范围受限、流程耗时长等问题&#xff0c;无法满足大量程超声波液位计的…

[STM32] 4-2 USART与串口通信(2)

文章目录 前言4-2 USART与串口通信(2)数据发送过程双缓冲与连续发送数据发送过程中的问题 数据接收过程TXE标志位&#xff08;发送数据寄存器空&#xff09;TC标志位&#xff08;发送完成标志位&#xff09;单个数据的发送数据的连续发送 接收过程中遇到的问题问题描述&#xf…

基于Python+MongoDB猫眼电影 Top100 数据爬取与存储

前言&#xff1a;从猫眼电影排行榜页面&#xff08;TOP100榜 - 猫眼电影 - 一网打尽好电影 &#xff09;爬取 Top100 电影的电影名称、图片地址、主演、上映时间和评分等关键信息&#xff0c;并将这些信息存储到本地 MongoDB 数据库中&#xff0c;&#x1f517; 相关链接Xpath&…

Ubuntu 单机多卡部署脚本: vLLM + DeepSeek 70B

# 部署脚本&#xff1a;Ubuntu vLLM DeepSeek 70B # 执行前请确保&#xff1a;1. 系统为 Ubuntu 20.04/22.04 2. 拥有NVIDIA显卡(显存≥24G) # 保存两个文件 1 init.sh 初始化 2、test.sh 测试 # init.sh #!/bin/bash # 系统更新与基础依赖sudo apt update && s…

为了摸鱼和吃瓜,我开发了一个网站

平时上班真的比较累&#xff0c;摸鱼和吃瓜还要跳转多个平台的话&#xff0c;就累上加累了。 所以做了一个聚合了全网主流平台热搜的网站。 目前市面上确实有很多这种网站了&#xff0c;所以目前最主要有两点和他们不同&#xff1a; 给热搜列表增加了配图&#xff0c;刷的时候…

Webug4.0靶场通关笔记11- 第15关任意文件下载与第16关MySQL配置文件下载

目录 一、文件下载 二、第15关 任意文件下载 1.打开靶场 2.源码分析 3.渗透实战 三、第16关 MySQL配置文件下载 1.打开靶场 2.源码分析 3.渗透实战 &#xff08;1&#xff09;Windows系统 &#xff08;2&#xff09;Linux系统 四、渗透防御 一、文件下载 本文通过…

k8s监控方案实践(一):部署Prometheus与Node Exporter

k8s监控方案实践&#xff08;一&#xff09;&#xff1a;部署Prometheus与Node Exporter 文章目录 k8s监控方案实践&#xff08;一&#xff09;&#xff1a;部署Prometheus与Node Exporter一、Prometheus简介二、PrometheusNode Exporter实战部署1. 创建Namespace&#xff08;p…

具身系列——比较3种vpg算法方式玩CartPole游戏(强化学习)

文档1方式参考&#xff1a;https://gitee.com/chencib/ailib/blob/master/rl/vpg_baseline_cartpole.py 文档2方式参考&#xff1a;https://gitee.com/chencib/ailib/blob/master/rl/vpg_batchupdate_cartpole.py 文档3方式参考&#xff1a;https://gitee.com/chencib/ailib/bl…

面向未来的 TCP 协议设计:可扩展与兼容并存

目录 1.设计思路 &#xff08;1&#xff09;完整数据结构&#xff08;字节布局&#xff09; 1&#xff09;字段解释&#xff1a; 2&#xff09;Flags字段设计&#xff08;1字节位图&#xff09; &#xff08;2&#xff09;进阶版 Java 解码器实现&#xff08;示例&#xf…

LSB图像信息隐藏系统(MATLAB)

图像信息隐藏系统 系统概述 图像信息隐藏系统是一个基于MATLAB开发的图像隐写工具&#xff0c;采用自适应LSB&#xff08;最低有效位&#xff09;隐写算法&#xff0c;实现了信息在图像中的隐藏与提取功能。系统配备了直观的图形用户界面&#xff0c;支持图像分析、信息隐藏、…

C++GO语言微服务项目之 go语言基础语法

目录 01 变量定义 02 自增语法 03 指针 04 go不支持的语法 05 string 06 定长数组-forrange 07 动态数组追加元素 08 切片截取-copy-make介绍 09 map介绍 10 函数 11 内存逃逸 12 import 13 命令行参数-switch 14 标签与continue-goto-break配合使用 15 枚举cons…

最新字节跳动运维云原生面经分享

继续分享最新的go面经。 今天分享的是组织内部的朋友在字节的go运维工程师岗位的云原生方向的面经&#xff0c;涉及Prometheus、Kubernetes、CI/CD、网络代理、MySQL主从、Redis哨兵、系统调优及基础命令行工具等知识点&#xff0c;问题我都整理在下面了 面经详解 Prometheus …

理解 Elasticsearch 的评分机制和 Explain API

作者&#xff1a;来自 Elastic Kofi Bartlett 深入了解 Elasticsearch 的评分机制并探索 Explain API。 想获得 Elastic 认证吗&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有大量新功能&#xff0c;帮助你为你的使用场景构建最佳…

视频编解码学习三之显示器

整理自&#xff1a;显示器_百度百科&#xff0c;触摸屏_百度百科,百度安全验证 分为阴极射线管显示器&#xff08;CRT&#xff09;&#xff0c;等离子显示器PDP&#xff0c;液晶显示器LCD 液晶显示器的组成。一般来说&#xff0c;液晶显示器由以下几个部分组成&#xff1a; […

K8s网络从0到1

K8s网络从0到1 前言 K8s是一个强大的平台&#xff0c;但它的网络比较复杂&#xff0c;涉及很多概念&#xff0c;例如Pod网络&#xff0c;Service网络&#xff0c;Cluster IPs&#xff0c;NodePort&#xff0c;LoadBalancer和Ingress等等。为了帮助大家理解&#xff0c;模仿TC…

13.Excel:分列

一 分列的作用 将一个单元格中的内容拆分到两个或多个单元格当中。 二 如何使用 1.常规分列使用 注意&#xff1a;分列功能一次只能拆分一列。 长度一致或者数据间有分隔符。 补充&#xff1a;快速选择一列。 CTRL shift 向下箭头。 补充&#xff1a;中英文逗号不同。 可以先通…

计算机网络应用层(5)-- P2P文件分发视频流和内容分发网

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f493;本博客内容为《计算机网络&#xff1a;自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…

Gin优雅关闭 graceful-shutdown

文章目录 优雅关闭示例 - Close 方法项目结构使用方法代码如下代码说明如果去掉代码中的数字1&#xff0c;会发生什么 优雅关闭示例项目结构使用方法使用上下文通知不使用上下文通知 代码 notify-without-context-server.go代码说明 代码 notify-with-context-server.go代码说明…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戏</title> <style>bo…