当前位置: 首页 > 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()通知父组件,自己想做的事情,父组件通过@事件名称的方式接收子组件的事件,这里需要注意的是,子组件发送事件时,使用的是驼峰命名,父组件定义监听时使用的是分隔符的方式命名,如此就完成了父子组件的通信。

http://www.lryc.cn/news/36146.html

相关文章:

  • 在云服务器安装tomcat和mysql
  • IO多路复用(select、poll、epoll网络编程)
  • Spark单机伪分布式环境搭建、完全分布式环境搭建、Spark-on-yarn模式搭建
  • C++网络编程(一)本地socket通信
  • 【Docker】Linux下Docker安装使用与Docker-compose的安装
  • 构造函数与普通函数,显式原型与隐式原型,原型与原型链
  • 跨过社科院与杜兰大学金融管理硕士项目入学门槛,在金融世界里追逐成为更好的自己
  • macOS 13.3 Beta 3 (22E5236f)With OpenCore 0.9.1开发版 and winPE双引导分区原版镜像
  • InceptionTime 复现
  • 谷粒学院开发(二):教师管理模块
  • 2021牛客OI赛前集训营-提高组(第三场) T4扑克
  • 【OJ比赛日历】快周末了,不来一场比赛吗? #03.11-03.17 #12场
  • C++-说一说异常机制
  • k8s CSI插件浅析
  • 九、CSS3新特性三
  • Dynamics365 本地部署整体界面
  • Binder ——binder的jni注册和binder驱动
  • Python+Yolov8目标识别特征检测
  • 欢迎使用Markdown编辑器
  • Mac环境安装python
  • 2023年全国最新交安安全员精选真题及答案16
  • 项目实战-瑞吉外卖day02(B站)持续更新
  • 2018年MathorCup数学建模D题公交移动支付问题的评估方案解题全过程文档及程序
  • js原型和原型链到底是什么
  • RocketMQ5.0.0消息消费<二> _ 消息队列负载均衡机制
  • 【数据库】MySQL数据库约束(六大约束)
  • 使用inotify监视文件后台运行收到 SIGTTIN 信号的原因及解决方案
  • L3-021 神坛
  • ArrayList和LinkedList区别
  • 977. 有序数组的平方 1. 两数之和 349. 两个数组的交集