Vue.js 中的父子组件通信方式

news2025/1/10 23:00:19

Vue.js 中的父子组件通信方式

在 Vue.js 中,组件是构建应用程序的基本单元。当我们在应用程序中使用组件时,组件之间的通信是非常重要的。在 Vue.js 中,父子组件通信是最常见的组件通信方式之一。在本文中,我们将讨论 Vue.js 中的父子组件通信方式,并附上代码实例。

在这里插入图片描述

父组件向子组件传递数据

Props

props 是 Vue.js 中父组件向子组件传递数据的一种方式。通过 props,父组件可以向子组件传递任何类型的数据,包括字符串、数字、对象、数组等等。在子组件中,props 是只读的,不能直接修改,只能通过事件的方式向父组件发送数据。

下面是一个使用 props 传递数据的示例:

<!-- 父组件 -->
<template>
  <div>
    <my-child :message="parentMessage"></my-child>
  </div>
</template>

<script>
import MyChild from './MyChild.vue';

export default {
  components: {
    MyChild,
  },
  data() {
    return {
      parentMessage: '这是来自父组件的消息',
    };
  },
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  props: {
    message: String,
  },
};
</script>

在上面的示例中,父组件通过 props 将 parentMessage 传递给子组件 MyChild,并将其命名为 message。在子组件中,我们可以通过 props 对象来声明 message 属性,然后在模板中使用它来渲染数据。

Sync 修饰符

除了 props 之外,Vue.js 还提供了一个 Sync 修饰符,可以通过它来实现双向数据绑定。Sync 修饰符实际上是一个语法糖,它将父组件向子组件传递数据和子组件向父组件发送数据的操作包装在一起。

下面是一个使用 Sync 修饰符的示例:

<!-- 父组件 -->
<template>
  <div>
    <my-child :message.sync="parentMessage"></my-child>
  </div>
</template>

<script>
import MyChild from './MyChild.vue';

export default {
  components: {
    MyChild,
  },
  data() {
    return {
      parentMessage: '这是来自父组件的消息',
    };
  },
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <input v-model="message" @input="$emit('update:message', message)" />
  </div>
</template>

<script>
export default {
  props: {
    message: String,
  },
};
</script>

在上面的示例中,父组件通过 :message.syncparentMessage 传递给子组件 MyChild,并使用 v-model 指令将子组件的 message 属性与一个输入框进行双向绑定。在子组件中,我们使用 @input 事件将输入框的值发送给父组件,实现双向数据绑定。

子组件向父组件传递数据

自定义事件

除了 props 之外,子组件还可以通过自定义事件向父组件传递数据。在子组件中,我们可以使用 $emit 方法触发一个自定义事件,并将数据作为参数传递给父组件。父组件可以通过 v-on 指令监听子组件的自定义事件,并在事件处理函数中获取子组件传递的数据。

下面是一个使用自定义事件传递数据的示例:

<!-- 父组件 -->
<template>
  <div>
    <my-child @child-click="handleChildClick"></my-child>
  </div>
</template>

<script>
import MyChild from './MyChild.vue';

export default {
  components: {
    MyChild,
  },
  methods: {
    handleChildClick(data) {
      console.log('从子组件传递过来的数据:', data);
    },
  },
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <button @click="handleClick">点击我向父组件传递数据</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleClick() {
      this.$emit('child-click', '这是来自子组件的消息');
    },
  },
};
</script>

在上面的示例中,子组件 MyChild 中定义了一个按钮,并在按钮的 click 事件中触发了一个自定义事件 child-click,并将数据 '这是来自子组件的消息' 作为参数传递给父组件。父组件通过 @child-click 指令监听子组件的自定义事件,并在事件处理函数中打印子组件传递的数据。

$refs

除了自定义事件之外,子组件还可以通过 $refs 属性来访问父组件,从而向父组件传递数据。在父组件中,我们可以通过 ref 属性给子组件命名,然后在父组件中通过 $refs 属性访问子组件实例,并调用子组件中的方法或访问子组件中的数据。

下面是一个使用 $refs 传递数据的示例:

<!-- 父组件 -->
<template>
  <div>
    <my-child ref="child"></my-child>
    <button @click="handleClick">点击我向子组件传递数据</button>
  </div>
</template>

<script>
import MyChild from './MyChild.vue';

export default {
  components: {
    MyChild,
  },
  methods: {
    handleClick() {
      this.$refs.child.handleParentClick('这是来自父组件的消息');
    },
  },
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: '',
    };
  },
  methods: {
    handleParentClick(data) {
      this.message = data;
    },
  },
};
</script>

在上面的示例中,父组件中通过 ref 属性给子组件命名为 child。在父组件中,我们通过 $refs.child 访问 MyChild 组件实例,并调用子组件中的 handleParentClick 方法,将数据 '这是来自父组件的消息' 传递给子组件。在子组件中,我们将传递过来的数据赋值给 message 属性,然后在模板中渲染出来。

父子组件之间的访问

在 Vue.js 中,父组件可以通过 $children 属性访问它的所有子组件实例,而子组件可以通过 $parent 属性访问它的父组件实例。

下面是一个示例:

<!-- 父组件 -->
<template>
  <div>
    <my-child></my-child>
    <my-child></my-child>
    <button @click="handleClick">点击我访问子组件</button>
  </div>
</template>

<script>
import MyChild from './MyChild.vue';

export default {
  components: {
    MyChild,
  },
  methods: {
    handleClick() {
      console.log(this.$children);
    },
  },
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: '这是来自子组件的消息',
    };
  },
  created() {
    console.log(this.$parent);
  },
};
</script>

在上面的示例中,父组件中定义了两个子组件 MyChild。在父组件中,我们通过 $children 属性访问所有子组件,并在点击按钮时打印所有子组件实例。在子组件中,我们在 created 钩子函数中访问了父组件实例,并在模板中渲染出了一个消息。

总结

在 Vue.js 中,父子组件通信是非常重要的。在本文中,我们讨论了 Vue.js 中父子组件通信的几种方式,包括使用 props 传递数据、使用 Sync 修饰符实现双向绑定、使用自定义事件传递数据、使用 $refs 访问子组件实例以及使用 $children$parent 访问父子组件实例。这些技术可以帮助我们更好地组织和管理应用程序中的组件,并提高组件之间的交互性。

在实际开发中,我们可以根据具体的业务需求选择合适的技术来实现父子组件通信。如果需要向子组件传递静态数据,可以使用 props;如果需要实现双向数据绑定,可以使用 Sync 修饰符;如果需要向父组件传递数据,可以使用自定义事件;如果需要访问子组件实例,可以使用 $refs,如果需要访问父子组件实例,可以使用 $children$parent

在下面的代码示例中,我们将展示如何使用 props、自定义事件和 $refs 这三种方式实现父子组件之间的通信。

<!-- 父组件 -->
<template>
  <div>
    <my-child :message="parentMessage" @child-click="handleChildClick" ref="child"></my-child>
    <button @click="handleClick">点击我向子组件传递数据</button>
  </div>
</template>

<script>
import MyChild from './MyChild.vue';

export default {
  components: {
    MyChild,
  },
  data() {
    return {
      parentMessage: '这是来自父组件的消息',
    };
  },
  methods: {
    handleChildClick(data) {
      console.log('从子组件传递过来的数据:', data);
    },
    handleClick() {
      this.$refs.child.handleParentClick('这是来自父组件的消息');
    },
  },
};
</script>
<!-- 子组件 -->
<template>
  <div>
    <p>{{ message }}</p>
    <button @click="handleClick">点击我向父组件传递数据</button>
  </div>
</template>

<script>
export default {
  props: {
    message: String,
  },
  methods: {
    handleClick() {
      this.$emit('child-click', '这是来自子组件的消息');
    },
    handleParentClick(data) {
      console.log('从父组件传递过来的数据:', data);
    },
  },
};
</script>

在上面的示例中,父组件通过 props 向子组件传递数据,并在子组件中使用自定义事件向父组件传递数据。同时,父组件还使用 $refs 属性访问子组件实例,并调用子组件中的方法,向子组件传递数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/602438.html

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

相关文章

原神3.2服务端PC端架设教程

安装教程 安装 MongoDB&#xff0c;不会安装建议使用宝塔面板 sudo apt updatesudo apt install mongodb-orgsudo systemctl enable --now mongod 直接启动.如果失败看看数据库启动了没有.端口一致 ./start.sh 安装配置JDK17 双击 OpenJDK17U-jdk_x64_windows_hotspot_1…

4年经验,面试二十多家公司后的整理....

先说一下自己的个人情况&#xff0c;普通二本计算机专业毕业&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而离职后到今天都没有收到一份offer&#xff01;一直在待业中&#xff0c;从离职第一天就开始准备简历&#xff0c…

【Proteus仿真】【51单片机】智能婴儿车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1604显示模块、按键模块、LED和蜂鸣器、DHT11温湿度、DS18B20温度传感器、SR04超声波&#xff0c;声音传感器、L298N直流电机、语音蓝牙控制等。…

搭建属于你自己的New Bing

前言 在这篇博客中&#xff0c;您将学习如何使用 Render 部署 go-proxy-bingai 项目&#xff0c;以便在不需要登录的情况下体验微软 Bing AI 的所有功能。 作者GitHub项目地址&#xff1a;adams549659584/go-proxy-bingai: 用 Vue3 和 Go 搭建的微软 New Bing 演示站点&#x…

工业场景中的RFID技术应用有哪些?

您是否好奇于如何在工业场景中利用RFID技术实现更高效的操作和生产流程优化&#xff1f;本文将带您深入探索RFID技术在工业领域的应用&#xff0c;揭示其优势和挑战&#xff0c;并通过实际案例为您呈现RFID技术在工业自动化和生产流程优化方面的成功应用。 一、RFID技术在工业…

OpenWrt 软路由解析公网IPV6域名访问家庭NAS的问题答疑

1、非要使用 Padavan 或者 OpenWrt固件的软路由才能IPV6公网访问吗&#xff1f; 答&#xff1a;这个并不是这样的&#xff0c;一般家用路由器都无法放行防火墙规则&#xff0c;这种情况当然无法实现IPV6公网访问&#xff0c;但是少部分路由器是可以的&#xff0c;只要有防火墙设…

MySQL6-深入理解MVCC和BufferPool缓存机制

❤️ 个人主页&#xff1a;程序员句号 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac;关注 &#x1f338; 订阅专栏&#xff1a;MySQL性能调优 原创博文、基础知识点讲解、有一定指导意义的中高级实践文章。 认真或有趣的技术分享。 MySQL性…

Vue.js 中的路由是什么?如何使用路由?

Vue.js 中的路由是什么&#xff1f;如何使用路由&#xff1f; 在 Vue.js 中&#xff0c;路由是指为不同的 URL 地址提供不同的页面内容或视图的机制。Vue.js 中的路由可以使用 Vue Router 库来实现&#xff0c;它是 Vue.js 官方提供的路由管理库。 Vue Router 简介 Vue Route…

vue (8)

vue8 文章目录 1. 浏览器本地存储1.1 localStorage1.2 sessionStorage1.3 总结 2. 修改 TodoList 案例3. 绑定自定义事件3.1 绑定3.2 解绑3.3 两个注意点3.4 总结3.5 修改 TodoList 案例 4. 全局事件总线4.1 总结4.2 修改 TodoList 案例 1. 浏览器本地存储 1.1 localStorage 图…

【MySQL数据库】项目中用到的一些SQL查询总结

文章目录 前言1. 有A&#xff0c;B两张表&#xff0c;需要统计A表中某个属性值的总数&#xff0c;更新到B表中实现代码 2. 将三张&#xff08;或n张&#xff09;表中的结果合并一起实现代码 3. 删除题库中的所有试题信息实现代码 4. 统计同一张表中&#xff0c;不同属性的数量于…

C语言-typedef关键字

一.typedef 关键字 typedef是在C语言允许为一个数据类型起一个新的别名。它本身是一种存储类的关键字,与auto extern,mutable、static、register 等关键字不能出现在同一个表达式中。 二、typedef用法 示例&#xff1a; 对于数据类型使用例如&#xff1a; 对于指针的使用例如…

【VictoriaMetrics】VictoriaMetrics单机版批量和单条数据写入(influx格式)

VictoriaMetrics单机版支持以influx格式的数据写入,写入支持单条数据写入以及多条数据写入,下面操作演示下如何使用 1、首先需要启动VictoriaMetrics单机版服务 启动VictoriaMetrics单机版服务执行的命令如下 nohup /opt/victoriaMetrics/victoria-metrics-prod -httpListe…

【剑指offer专项突破版】整数篇(经典面试题)——C

文章目录 前言一. 整数除法题目分析1.一般思路①代码 2.优化思路②优化后的代码 拓展:用位运算实现整数的加法③代码 二. 二进制加法题目分析思路分析①代码 三. 前n个数字中1的个数题目描述思路分析①方法1——遍历②方法2——i&(i-1)③方法3——i&(i-1)的优化④方法…

数字赋农:数字农业新时代,致富之路宽又阔!

不管在什么年代&#xff0c;粮食永远是国之根本、民之命脉&#xff0c;而来粮食安全更是“国之大者”&#xff0c;更是曾在大会中明确提出过&#xff0c;要全方位夯实粮食安全根基&#xff0c;牢牢守住十八亿耕地红线&#xff0c;确保中国人的饭碗牢牢端在自己手中。 我们需要深…

快速入门SpringMVC 学习

目录 SpringMVC 定义 MVC定义 创建SpringMVC项目 SpringMVC掌握功能 一、连接功能 RequestMapping(请求映射) GetMapping 和 PostMapping 二、获取参数功能 传递单个参数/多个参数 注意点&#xff1a; RequestParam(前后端参数映射) 前后端参数映射 RequestParam特…

骆驼祥子思维导图怎么画?高效工具分享

骆驼祥子是一部中国现代文学经典作品&#xff0c;由老舍所著。在阅读这本书时&#xff0c;我们可以使用思维导图来梳理故事情节和人物关系&#xff0c;从而更好地理解这本书的主题和内涵。 我们可以在线制作思维导图&#xff0c;这个网站还内置了流程图和Markdown功能。 站点内…

前瞻洞察|Prompt Learning(提示学习)——新的低资源场景克星

近年来&#xff0c;预训练语言模型已然成为自然语言处理&#xff08;NLP&#xff09;领域中备受瞩目的技术之一。预训练模型可以在大规模文本语料上进行自监督学习&#xff0c;从而获得丰富的语言学知识&#xff0c;并通过在下游任务上进行微调&#xff0c;实现出色的性能。Pro…

markdown导出成html,并将图片转换成base64

文章目录 方案一&#xff0c;使用typora第一步&#xff0c;编写python脚本第二步&#xff0c;设置导出后运行py脚本&#xff0c;设置如下 方式二&#xff0c;使用vscode插件&#xff1a;Markdown Preview Enhanced使用方法在markdown头部添加 预览界面右键&#xff0c;选择导出…

JAVA基础知识总结系列(2):JAVA语法基础

1&#xff0c;关键字&#xff1a;其实就是某种语言赋予了特殊含义的单词。 保留字&#xff1a;其实就是还没有赋予特殊含义&#xff0c;但是准备日后要使用过的单词。 2&#xff0c;标示符&#xff1a;Java中的包、类、方法、参数和变量的名字&#xff0c;可由任意顺序的大小写…

用低代码打造高效餐厅管理系统

当代社会&#xff0c;餐饮业有着非常广阔的市场前景&#xff0c;也承担着相应的管理力。随着人工智能、物联网等新技术的快速发展&#xff0c;低代码能化为了许多餐饮门店管理的新革命。在这篇文章中&#xff0c;我们将会探讨低代码智能化带来的餐门店管理新使命。 一、低代码…