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

Vue3之父子组件通过事件通信

前言

组件间传值的章节我们知道父组件给子组件传值的时候,使用v-bind的方式定义一个属性传值,子组件根据这个属性名去接收父组件的值,但是假如子组件想给父组件一些反馈呢?就不能使用这种方式来,而是使用事件的方式,父组件通过注册这个事件的监听来接收子组件的信息,然后做对应的操作。

示例解析

在前面的章节我们使用父组件传递过来的值做一个计数组件的时候,使用v-bind的方式传值,这个时候父子组件间是单向数据流的方式,即子组件无法修改父组件传来的值,所以做计数器组件的时候,子组件只能是拷贝一份父组件传来的值,然后做计数操作,本章我们提供事件的方式实现计数的功能,思想就是,我们修改不了父组件传递过来的值,我们就可以通过事件通知父组件修改这个值:代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>父子组件通过事件进行通信</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
    
</body>
<script>
 const app = Vue.createApp({
    data() {
        return {
            count:1
        }
    },
    methods:{
        handleAddOne(){
            this.count += 1;
        }
    },

        template: 
        `
        <div>
            <counter :count = "count" @add-one="handleAddOne" />
        </div>
        `
    });

    app.component('counter',{
        props:['count'],
        emits:{
            addOne:(count) =>{
                if(count > 3){
                    alert(count);
                    return true;
                }
                return false;
            }
        },
        methods: {
            handleItemClick(){
                 this.$emit('addOne',this.count);
            }
        },
        template:`<div @click="handleItemClick">{{count}}</div>`
    });
    const vm = app.mount('#root');
</script>
</html>

当我们点击显示数字的div时,会执行执行handleItemClick方法,向父组件传递一个add-one事件,并且将目前的count值当成参数传递给父组件,父组件通过@add-one="handleAddOne"监听add-one事件,当收到这个事件后,就执行handleAddOne方法,让count的值加一,然后由于时count的值和子组件又是绑定的,所以这个值也会同步给子组件,这样就会在子组件显示count+1的值。

注意:监听事件,使用“-” 分隔符:如本例中的:@add-one,向外部发送一个事件时用驼峰命名:如本例中的:this.$emit('addOne',this.count);

从代码中我们可以看到从子组件向父组件传递一个事件使用的是$emit()方法,这个方法可以单独传事件如:this.$emit('addOne'); 也可以带参数传递:this.$emit('addOne',2);

另外本例中,我们可以看到这样一段代码:

   emits:{
            addOne:(count) =>{
                if(count > 3){
                    alert(count);
                    return true;
                }
                return false;
            }
        },

其实这里是便于让代码的阅读者能通过emmits关键字快速知道本组件会向外传递哪些事件,毕竟组件多了后,会有一堆事件,在代码中一个个看的确比较费劲,这个模块还有一个功能就是校验我们可以在里面判断父组件传递过来的值,然后做些想做的操作

总结

本文主要介绍父组件和子组件之间的通信,父组件可以通过v-bind的方式将值传递给子组件,子组件可以使用props:[]接收,然后子组件可以通过事件$emit()通知父组件,自己想做的事情,父组件通过@事件名称的方式接收子组件的事件,这里需要注意的是,子组件发送事件时,使用的是驼峰命名,父组件定义监听时使用的是分隔符的方式命名,如此就完成了父子组件的通信。

相关文章:

  • linux目录/usr/lib/systemd/system目录详解
  • ElasticSearch - 分片内部原理之动态更新索引、近实时搜索、持久化变更、段合并
  • 蓝桥杯刷题冲刺 | 倒计时26天
  • 2023年3月计算机二级公共基础考前预测
  • Verilog实现组合逻辑电路
  • Qt——通过一个简单的程序例程熟悉使用Qt Creator软件进行项目搭建的基本流程(新建项目、项目的文件组成、修改ui文件、编译运行与调试)
  • 一文带你吃透操作系统
  • 07从零开始学Java之如何正确的编写Java代码?
  • 如何保证Redis缓存和数据库一致性?
  • 2023年网络安全比赛--attack(新)数据包分析中职组(超详细)
  • 【Android -- 软技能】聊聊程序员的软技能
  • STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈
  • 2022济南大学acm新生赛题解
  • ES+Redis+MySQL,这个高可用架构设计太顶了!
  • js逆向爬取某音乐网站某歌手的歌曲
  • 【node学习】协程
  • Angular Elements 及其运作原理
  • C++类中的特殊成员函数
  • Computed property XXX was assigned to but it has no setter
  • Git初体验
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Python_网络编程
  • Spring Boot MyBatis配置多种数据库
  • Spring声明式事务管理之一:五大属性分析
  • TCP拥塞控制
  • ViewService——一种保证客户端与服务端同步的方法
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 从tcpdump抓包看TCP/IP协议
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 区块链共识机制优缺点对比都是什么
  • 什么是Javascript函数节流?
  • 微信小程序填坑清单
  • 用 Swift 编写面向协议的视图
  • C# - 为值类型重定义相等性
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (+4)2.2UML建模图
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (39)STM32——FLASH闪存
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (八)c52学习之旅-中断实验
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (九)信息融合方式简介
  • (全注解开发)学习Spring-MVC的第三天
  • (五)Python 垃圾回收机制
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core 项目指定SDK版本
  • .net 托管代码与非托管代码
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @NestedConfigurationProperty 注解用法
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • []C/C++读取串口接收到的数据程序