前几篇讨论的父子组件间如何进行传数据的话题. 即父组件在调用子组件的时候, 通过自定义属性 (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. WPF DockLayoutManager布局后的布局重置

    初始化布局 Logging.InfoBiz("初始化布局信息"); dockLayoutManager = new DockLayoutManager(); RestoreLayo ...

  2. 丢掉WebView,使用JS+Rust开发跨端桌面应用-Deft

    简介 随着Web技术的发展,越来越多的跨端应用选择了WebView作为基础解决方案.诚然WebView让跨端应用开发变得简单了很多,极大的提高了开发效率,但是,WebView也存在着一些广为诟病的缺点 ...

  3. Ansible - [10] Vault(加密&解密)

    加密文件 Ansible 有时需要访问一些敏感数据,如密码.Key等 使用ansible-vault可以加密和解密数据 # 创建测试文件 [root@control ansible]# echo 12 ...

  4. Ansible - [03] Ansible ad-hoc模式

    Ansible ad-hoc是一种通过命令行批量管理的方式 格式:ansible 主机集合 -m 模块名 -a "参数" 其他参数: -k 使用密码远程.-i 指定主机列表文件 以 ...

  5. 批处理脚本(.bat)实现实时监测文件夹并执行命令 [假设有新文件则拷贝到远程文件夹内]

    想到一个情景.程序实时监测文件夹情况,如果有新文件进入,分析其文件名,然后如果满足预设条件,则做相应操作.比如扫描仪扫描了文件,会将新文件保存进特定文件夹内,可以使用该程序来做处理. 在Windows ...

  6. 补充:基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation Algorithms)

    前言 继续上篇博客,继续读论文. 想看上篇论文的同学可以点击这里 相关工作 In this section we briefly present some of the research litera ...

  7. 如何解决ubuntu安装第三方deb出现的read unknown VMA问题(SUID sandbox配置问题)

    前言 众所不周知,ubuntu的snap有些让人无语凝噎的问题,比方说如果你在Ubuntu 24.04 LTS通过它安装vscode,恭喜你,你无法在vscode中输入中文,缘由不明,又或者对于str ...

  8. ohpm : 无法将“ohpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

    ohpm : 无法将"ohpm"项识别为 cmdlet.函数.脚本文件或可运行程序的名称. 造成该问题有两个: 没有配置好 ohpm 的环境变量. 没有配置好 PowerShell ...

  9. python 读写csv文件(创建,追加,覆盖)

    读取csv文件 利用 csv.reader 可以读 csv 文件,然后返回一个可迭代的对象 csv_read,我们可以直接从 csv_read 中取数据 import csv def read_csv ...

  10. Git工作流介绍

    前言 工作流其实不是一个初级主题,背后的本质问题其实是有效的项目流程管理和高效的开发协同约定,不仅是Git或SVN等SCM工具的使用. 集中式工作流 如果你的开发团队成员已经很熟悉Subversion ...