前几篇讨论的父子组件间如何进行传数据的话题. 即父组件在调用子组件的时候, 通过自定义属性 (v-bind) 的方式传递数据, 同时子组件通过 props 属性进行接收. 子组件可以对数据进行各种校验, 但不能修改, 即所谓的 "单项数据流''的概念, 这样其实是合理的, 不能混乱. 若是在要改就另存一份副本再进行操作即可.

本篇的学习是父子组件如何通过事件进行通信, 即子组件想要搞一个操作, 向父组件进行请示 (emit), 父组件同意后帮其在父组件的 methods 中进行回应.

子组件向父组件通信

<!DOCTYPE html>
<html lang="en"> <head>
<title>组件事件通信 $emit</title>
<script src="https://unpkg.com/vue@3"></script>
</head> <body>
<div id="root"></div>
<script>
const app = Vue.createApp({
data () { return { count: 1 }},
methods: {
handleAddOne () {
this.count += 1
}
},
// 3. 父组件接收到信息并进行全局处理
template: `
<div>
<Son :count=count @add-one="handleAddOne" />
</div>
`
}) app.component('Son', {
props: ['count'],
methods: {
handleClick () {
// 1. 当用户点击, 触发 handleClick 事件
// 2. 然后其向父组件发射(请示) emit 一个名为 addOne 的事件
this.$emit('addOne')
}
},
template: '<div @click="handleClick">{{count}}</div>' }) const vm = app.mount('#root') </script>
</body> </html>

以上例, 梳理组件事件传递的基础逻辑:

  • 在子组件中, 当用户点击, 触发 handleClick 事件
  • 然后其向父组件发射(请示) $emit 一个名为 addOne 的事件
  • 父组件在调用子组件的地方接收 add-one 事件 (注意子emit用驼峰, 父接收用短横) 能默认识别
  • 父组件在自己的 methods 中进行全局处理哦

补充一下这里的 $emit 是可以进行校验和传参的, 就校验举个栗子:

// 子组件首层
emit: {
add: (count) => {
if (count < 0) {
return true;
}
return false;
}

传参也演示一下:

    const app = Vue.createApp({
data () { return { count: 1 }},
methods: {
handleAdd (arg1, arg2) {
this.count += 1
}
},
// 3. 父组件接收到信息并进行全局处理
template: `
<div>
<Son :count=count @add="handleAdd" />
</div>
`
} app.component('Son', {
props: ['count'],
methods: {
handleClick () {
this.$emit('add', 1, 2)
}
},
template: '<div @click="handleClick">{{count}}</div>' }) const vm = app.mount('#root')

modelValue 关键字

这种父组件向子组件传值, 子组件向父组件 emit 事件的过程, 岂不和 v-model 这个指令有异曲同工之妙嘛. 因此在约定俗成下, 我们能用 modelValue 这个关键字进行改写:

<!DOCTYPE html>
<html lang="en"> <head>
<title>modelValue</title>
<script src="https://unpkg.com/vue@3"></script>
</head> <body>
<div id="root"></div>
<script>
const app = Vue.createApp({
data () { return { count: 1 } },
// 1. 父组件通过 v-model 来监听 count 的变化
template: `<Son v-model=count />`
}) app.component('Son', {
props: ['modelValue'],
methods: {
handleClick () {
// 监控数据变化
this.$emit('update:modelValue', this.modelValue + 3)
}
},
template: '<div @click="handleClick">{{modelValue}}</div>' }) const vm = app.mount('#root') </script>
</body> </html>

当然也是可以改名字的, 通过 v-model​:xxx 的写法:​

<script>
const app = Vue.createApp({
data () { return { count: 1 } },
// 1. 父组件通过 v-model 来监听 count 的变化
template: `<Son v-model:cj=count />`
}) app.component('Son', {
props: ['cj'],
methods: {
handleClick () {
this.$emit('update:cj', this.cj + 3)
}
},
template: '<div @click="handleClick">{{cj}}</div>' }) const vm = app.mount('#root') </script>

小结

最后再来对整个子组件向父组件 emit 事件的操作流程做一个小结

  • 在子组件中, 触发一个名为 nb 的时间
  • 然后其向父组件发射(请示) $emit 一个名为 nb 的事件
  • 父组件在调用子组件的地方接收 nb 事件
  • 父组件在自己的 methods 中进行全局处理哦
  • 可以用 v-model 的写法来进行简写这种父子通信的代码

vue3 基础-父子组件间如何通过事件通信的更多相关文章

  1. Vue2.0父子组件间事件派发机制

    从vue1.x过来的都知道,在vue2.0中,父子组件间事件通信的$dispatch和$broadcase被移除了.官方考虑是基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会 ...

  2. vue之父子组件间通信实例讲解(props、$ref、$emit)

       组件间如何通信,也就成为了vue中重点知识了.这篇文章将会通过props.$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信. 组件是 vue.js 最强大的功能之一,而组件实例 ...

  3. 第四节:Vue表单标签和组件的基本用法,父子组件间的通信

    vue表单标签和组件的基本用法,父子组件间的通信,直接看例子吧. <!DOCTYPE html> <html> <head> <meta charset=&q ...

  4. vue组件定义方式,vue父子组件间的传值

    vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...

  5. Vue—非父子组件间的传值(Bus/发布订阅模式/观察者模式/总线)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. vue:父子组件间通信,父组件调用子组件方法进行校验子组件的表单

    参考: ElementUI多个子组件表单的校验管理:https://www.jianshu.com/p/541d8b18cf95 Vue 子组件调用父组件方法总结:https://juejin.im/ ...

  7. vue-cli中父子组件间的变量传递

    vue-cli中父子组件间的变量传递 在vue中每一个组件的作用域都是独立的,如果我们想实现父子组件间变量的传递就要另寻他法,而不能直接调用其中的变量. 父级组件向子级组件传递变量 要实现这种效果我们 ...

  8. Vue的父子组件间通信及借助$emit和$on解除父子级通信的耦合度高的问题

    1.父子级间通信,父类找子类非常容易,直接在子组件上加一个ref,父组件直接通过this.$refs操作子组件的数据和方法    父 这边子组件中 就完成了父 => 子组件通信 2. 子 =&g ...

  9. React中父子组件间的通信问题

    1.https://blog.csdn.net/sinat_17775997/article/details/59103173 (React中父子组件间的通信问题)

  10. 【Vue】组件的基础与组件间通信

    转载:https://segmentfault.com/a/1190000016409329 Vue.js 最核心的功能就是组件(Component),从组件的构建.注册到组件间通信,Vue .x 提 ...

随机推荐

  1. [Ynoi2016] 镜中的昆虫 题解

    难度在最近遇到的题里相对较高,在这里写一篇珂学题解. (以下是学校给的部分分) \(20\%\):直接暴力枚举. 另外 \(20\%\):假如我们取 \(pre\),对于 \(pre<l\) 的 ...

  2. 泰山派设备控制(RGB)

    泰山派设备系统控制(RGB) 1.进入设备系统 cd /sys/class 2.进入RGB灯子系统 cd /sys/class/leds/ 罗列可操作的设备,可以看到三个设备,"rgb-le ...

  3. Kafka - [02] Kafka单机版部署

    Kafka是一个分布式的流处理平台. kafka主要是作为一个分布式的.可分区的.具有副本数的日志服务系性.高容错性.访问速度快.分布式等特性:具有高水平扩展 主要应用场景是:日志收集系统和分布式发布 ...

  4. SSM:Spring整合Mybatis时,连接池和SQLSessionFactory的联系!

  5. 关于Processing开发应用及发布分享的一些经验分享

    从2015年10月份开始接触Processing,到现在的2021年9月底,足足有6年了!笔者会竭尽全力把所有学到的知识.经验分享出来.这篇是关于Processing开发应用及发布分享的一些内容,可能 ...

  6. 记一次Microsoft.Toolkit.Mvvm(MVVM Toolkit)的兼容性问题

    今天在目标框架为framework4.6.1的wpf项目中使用Microsoft.Toolkit.Mvvm7.1.1出现了一个比较怪异的编译时错误,前提是打开了 工具>选项>环境>预 ...

  7. ADO.NET中SQL绑定变量方式总结

    最近在项目上遇到几个问题,关于ADO.NET中SQL绑定变量 总结一下,分享给大家. 1. 使用 SqlParameter(推荐方式,防止 SQL 注入) ADO.NET 提供 SqlParamete ...

  8. 探秘Transformer系列之(14)--- 残差网络和归一化

    探秘Transformer系列之(14)--- 残差网络和归一化 目录 探秘Transformer系列之(14)--- 残差网络和归一化 0x00 概述 0x01 残差连接 1.1 问题 1.2 相关 ...

  9. Arrays工具类教你优雅地管理数组数据

    数组专用工具类指的是 java.util.Arrays 类,基本上常见的数组操作,这个类都提供了静态方法可供直接调用.毕竟数组本身想完成这些操作还是挺麻烦的,有了这层封装,就方便多了. package ...

  10. 实现领域驱动设计 - 使用ABP框架 - 聚合

    这是本指南的关键部分.我们将通过实例介绍和解释一些明确的规则.在实现领域驱动设计时,您可以遵循这些规则并将其应用到您的解决方案中 领域案例 这些例子将使用GitHub中使用的一些概念,比如Issue, ...