Vue的组件通信

前言

今天讲讲Vue的组件通信的几种方式

正文

父子通讯 – 父给子

父组件将值 v-bind 绑定传给子组件,子组件通过 degineProps 接收

接下来用一个代码示例讲解一下

  • 父组件

    • value 是使用 ref 创建的响应式变量,用于绑定输入框的值。
    • to 也是使用 ref 创建的响应式变量,用于向子组件传递数据。
    • add 方法在点击“添加”按钮时被触发。如果 value 的值不为空,就将其赋值给 to
    • 在模板中,有一个输入框 v-model 绑定了 value,一个“添加”按钮绑定了 add 方法,还使用 <Child :msg="to" />to 的值传递给子组件 Child
<template><div class="input-group"><input type="text" v-model="value" /><button @click="add">添加</button></div><Child :msg="to"></Child>
</template><script setup>
import { ref } from "vue";
import Child from "@/components/child.vue";const value = ref("");
const to = ref('')
const add = () => {if (value.value !== "") {to.value = value.value ;}
};
</script><style lang="css" scoped></style>
  • 子组件:

    • list 是使用 ref 创建的响应式数组,初始值包含 "html""css""js"
    • 使用 defineProps 接收来自父组件的 msg 属性。
    • 直接将 props.msg 添加到 list 数组中。
    • 使用 watch 监听 props.msg 的变化。当 props.msg 发生变化时,将新值添加到 list 数组中,并在控制台打印新值和旧值。
<template><div class="child"><ul><li v-for="item in list">{{ item }}</li></ul></div>
</template><script setup>
import { ref, watch } from "vue";
const list = ref(["html", "css", "js"]);const props = defineProps({msg: "",
});
list.value.push(props.msg);watch(() => props.msg,(newVal, oidVal) => {console.log(newVal, oidVal);list.value.push(newVal);}
);
</script><style lang="css" scoped></style>

子父通讯 – 子给父

第一种方式(发布订阅)

借助发布订阅机制,子组件通过发布并携带参数,父组件订阅事件通过事件提供的函数获取值

  • 父组件:
    • 引入了子组件 Child ,并通过 @add1="handle" 监听子组件触发的 add1 事件。
    • 定义了一个响应式数组 list ,初始值包含 "html""css""js"
    • handle 函数用于处理接收到的 add1 事件,将事件传递的数据添加到 list 数组中。
<template><!-- 订阅add1事件  --><Child @add1="handle"></Child><div class="child"><ul><li v-for="item in list">{{ item }}</li></ul></div>
</template><script setup>
import { ref } from "vue";
import Child from "./components/child2.vue";const list = ref(["html", "css", "js"]);const handle = (event) => {list.value.push(event);
};
</script><style lang="css" scoped></style>
  • 子组件
    • 定义了一个输入框 v-model 绑定了 value ,以及一个“添加”按钮。
    • 使用 defineEmits 创建了一个名为 add1 的自定义事件。
    • add 方法在点击“添加”按钮时被触发,通过 emit("add1", value.value) 向父组件触发 add1 事件,并将 value 的值作为参数传递给父组件。
<template><div class="input-group"><input type="text" v-model="value" /><button @click="add">添加</button></div>
</template><script setup>
import { ref } from "vue";const value = ref("");const emit = defineEmits(["add1"]); // 创建一个add事件
const add = () => {// 将数据传递给父组件emit("add1", value.value); // 第一个参数是事件名,第二个参数是要传递的数据 发布事件
};
</script><style lang="css" scoped></style>

第二种方式(v-model)

子父组件通讯 父组件借助 v-model 将数据绑定给子组件,子组件创建"update:XXX"事件,并接收到数据修改后 emits 出来

  • 父组件

    • 在模板中使用 <Child v-model:list="list" /> ,通过 v-model 语法与子组件进行数据交互,将父组件中的 list 数据传递给子组件,并能接收子组件对 list 的修改。
    • 利用 ref 创建了名为 list 的响应式数组,其初始值为 ["html", "css", "js"] ,并在模板中通过 v-for 遍历展示其元素。
<template><Child v-model:list="list"></Child><div class="child"><ul><li v-for="item in list">{{ item }}</li></ul></div>
</template><script setup>
import { ref } from "vue";
import Child from "./components/child3.vue";const list = ref(["html", "css", "js"]);
</script><style lang="css" scoped></style>
  • 子组件
    • 模板中有一个输入框 v-model 绑定了 value 和一个点击触发 add 方法的“添加”按钮。
    • 通过 defineProps 定义了从父组件接收的 list 属性,指定其类型为数组,并提供了默认的空数组。
    • 利用 defineEmits 定义了名为 update:list 的自定义事件,用于向父组件传递数据更新。
    • add 方法中,为了避免直接修改父组件传来的 props.list ,先复制了一份到 arr ,然后向 arr 中添加新值,最后通过触发 Emits("update:list", arr) 事件将更新后的数组传递回父组件,实现与父组件的双向数据绑定。这种复制后修改再传递的方式,是为了遵循 Vue 的单向数据流原则,保证数据的准确性和可预测性。
<template><div class="input-group"><input type="text" v-model="value" /><button @click="add">添加</button></div>
</template><script setup>
import { ref } from "vue";const value = ref("");const props = defineProps({list: {type: Array,default: () => [],},
});const emits = defineEmits(["update:list"]);
const add = () => {//   props.list.push(value.value);// 不建议直接操作父组件给过来的数据const arr = props.list;arr.push(value.value);emits("update:list", arr);
};
</script><style lang="css" scoped></style>
  • 父组件

    • 引入子组件 Child ,并通过 ref="childRef" 为子组件设置引用。
    • 在模板中,尝试通过 childRef?.list 访问子组件暴露出来的 list 属性,并使用 v-for 进行遍历展示。
    • 使用 ref 创建了 childRef ,初始值为 null
    • onMounted 钩子函数中,打印 childRef.value ,即在组件挂载后获取子组件的引用。
<template><Child ref="childRef"></Child><div class="child"><ul><li v-for="item in childRef?.list">{{ item }}</li></ul></div>
</template><script setup>
import { ref, onMounted } from "vue";
import Child from "./components/child4.vue";const childRef = ref(null);onMounted(() => {console.log(childRef.value);
});
</script><style lang="css" scoped></style>
  • 子组件
    • 包含一个输入框 v-model 绑定了 value 和一个“添加”按钮。
    • 定义了 valuelist 两个响应式变量。
    • add 方法用于向 list 中添加新值。
    • 通过 defineExpose({ list }) 主动暴露 list 属性,使得父组件能够通过引用获取到。
<template><div class="input-group"><input type="text" v-model="value" /><button @click="add">添加</button></div>
</template><script setup>
import { ref } from "vue";const value = ref("");
const list = ref(["html", "css", "js"]);const add = () => {list.value.push(value.value);
};defineExpose({ list }); // 心甘情愿暴露出来
</script><style lang="css" scoped></style>

这里使用childRef?的原因:

ref 用于注册引用信息,可以通过 ref 获取 DOM 元素或组件实例。在父组件中,使用 ref 为子组件创建一个引用,在模板中可以通过 ref 访问子组件的属性和方法。

然而,在访问子组件的属性或方法时,可能会存在子组件尚未完全渲染的情况。由于 Vue 的异步渲染策略,子组件的 DOM 元素可能需要一些时间才能完全渲染。如果在父组件的钩子函数中直接访问子组件的属性或方法,可能会导致获取到不完整或错误的信息。

总结

本文讲解了组件通信中的父子组件通信和子父组件通信,希望看到这里的你能够有所收获!!!

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

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

相关文章

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.06.10-2024.06.15

文章目录~ 1.MIND: Multimodal Shopping Intention Distillation from Large Vision-language Models for E-commerce Purchase Understanding2.MDA: An Interpretable Multi-Modal Fusion with Missing Modalities and Intrinsic Noise3.VEGA: Learning Interleaved Image-Tex…

数据驭王: PostgreSQL教程指南解密

PostgreSQL教程大纲 一、介绍1.1 什么是PostgreSQL&#xff1f;1.2 PostgreSQL的历史和发展1.3 为什么选择PostgreSQL&#xff1f; 二、安装和设置2.1 下载和安装PostgreSQL2.2 配置PostgreSQL2.3 测试PostgreSQL 三、基本操作3.1 连接到PostgreSQL数据库步骤一&#xff1a;安装…

如何实现灌区闸门控制自动化?宏电“灌区哨兵”为灌区闸门控制添“智慧”动能

闸门控制站是节水灌溉工程中的重要组成部分。随着科技的不断进步和农田水利现代化的发展&#xff0c;传统的闸门控制和管理手段已经不能满足现代农业的发展要求。以宏电“灌区哨兵”为核心的闸门自动化控制系统&#xff0c;能有效解决灌区闸门距离远、数量多、不易操作、不好监…

PB12.5用DataWindow保存数据非法操作问题解析

在做一个WebService项目时&#xff0c;遇到个问题&#xff1a;在模拟请求WebService服务时&#xff0c;出现列机现象。经排查日志发现是在DataWindow的update时&#xff0c;死掉了。 排查分析&#xff1a; 1、在PB的数据库面板中&#xff0c;选中数据库表&#xff0c;点Grid显…

这次让我们隆重的介绍一下

深思熟虑之后&#xff0c;我诚挚地想要全面的介绍自己。若你的需求与我的专长恰好契合&#xff0c;我将以满心的热枕和真诚与你并肩作战&#xff0c;携手解决难题&#xff0c;一同追求卓越&#xff0c;实现我们的垂直成长。我是一名经验丰富且充满热情的技术人员。我热爱编程&a…

ApolloClient GraphQL 与 ReactNative

要在 React Native 应用程序中设置使用 GraphQL 的简单示例&#xff0c;您需要遵循以下步骤&#xff1a; 设置一个 React Native 项目。安装 GraphQL 必要的依赖项。创建一个基本的 GraphQL 服务器&#xff08;或使用公共 GraphQL 端点&#xff09;。从 React Native 应用中的…

CST软件中滤波器中外部耦合偏小怎么办

在电磁仿真领域&#xff0c;CST Studio Suite&#xff08;CST 工作室套装&#xff09;软件以其强大的功能和易用性而广受工程师和科研人员的青睐。然而&#xff0c;在使用CST软件进行滤波器设计时&#xff0c;有时会遇到外部耦合偏小的问题&#xff0c;这可能导致滤波器的性能不…

避开常见的坑,快速制作一个免费、交互式景区导游地图

目录 1 前言 2 注册登录 3 增加景区&#xff0c;注意设置地图中心点和级别 3.1 确定地图位置和缩放级别 3.2 新增景区&#xff0c;输入几个文本项目 3.3 可以继续调整地图位置和级别 4 增加景点 4.1 点击景点跳转错误 5 新增景区和景点介绍帖子&#xff0c;需要催一下…

系统架构师考点--计算机网络

大家好。今天我来总结一下计算机网络的相关考点。本部分分值占3-5分&#xff0c;基本上都出现在上午场的选择题。 一、网络功能和分类 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。 计算机网络的功能&#xff1a;数…

STM32F407ZGT6工程模板(FreeRTOS+HAL)

STM32F407ZGT6工程模板&#xff08;FreeRTOSHAL&#xff09; 1新建工程文件夹2根目录文件夹顺序介绍3新建工程4移植FreeRTOSv202112.00内核版本V10.4.6移植验证 1新建工程文件夹 新建文件夹STM32F103ZGT6 新建子文件夹&#xff0c;Drivers、Middlewares、Output、Projects、Us…

驻马店建筑工程设计资质延续操作要点

150资质延续操作要点&#xff1a; 38提前准备&#xff1a;在资质证书有效期届满前&#xff0c;企业应提前做好准备工作&#xff0c;确保所有需要的资料齐全、有效&#xff0c;如企业营业执照、资质证书原件、财务审计报告、企业诚信记录、技术人员证书及社保缴纳证明等。 06在…

无限制数字(仅仅int类型)的大小的自然排序算法

直接上代码&#xff1a; #include <iostream> #include <vector> #include <string> #include <algorithm> #include <cctype>// Function to compare two strings in a natural way bool naturalCompare(const std::string& a, const std:…

Vue项目启动失败 UnauthorizedAccess

在VSCode中使用yarn dev命令启动项目失败&#xff0c;错误&#xff1a; yarn : File D:\Nodejs\yarn.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?L…

Java中如何处理跨域请求?

Java中如何处理跨域请求&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代Web应用程序开发中&#xff0c;跨域请求&#xff08;Cross-Origin…

linux编译安装openssl-3.0.2

安装openssl3.0.2 openssl版本太低可能影响等保及很多其他工具的安装&#xff0c;记一次编译3.0.2的安装过程。 一、首先先到官网下载最新的openssl&#xff1f; [ Downloads ] - /source/index.html 二、解压openssl包 tar -xzf openssl-3.0.2.tar.gz 三、检查是否已安装…

java版本ERP管理系统源码 Spring Cloud erp系统-更专业的ERP管理系统

ERP&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划&#xff09;软件是一种集成的管理平台&#xff0c;它将企业的所有业务流程&#xff0c;包括采购、销售、库存、财务等&#xff0c;整合到一个统一的系统中。这种整合不仅提高了工作效率&#xff0c;还增强…

电脑硬盘数据恢复,4个方法,轻松恢复数据

在数字化时代的浪潮中&#xff0c;电脑硬盘不仅是存储数据的仓库&#xff0c;更是我们生活、工作、学习的记忆宫殿。然而&#xff0c;当这个宫殿中的一部分珍贵记忆突然消失&#xff0c;仿佛历史的片段被无情地抹去&#xff0c;我们不禁会感到焦虑和恐慌。此时&#xff0c;电脑…

【播客笔记】摸着大佬入门!把〖AI+能源〗〖AI+硬件〗两个热门话题彻底聊透! | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 硅谷101 | 科技巨头们开始抢电&#xff1f;聊聊AI用电荒和核聚变创业热 播客链接 → https://www.xiaoyuzhoufm.com/episode/663035780571efa80f8…

基于springboot在线考试报名系统-计算机毕业设计源码031706

摘 要 随着计算机技术的迅猛发展&#xff0c;学校教学和管理的信息化发展也有长足的进步&#xff0c;考试也是一样。与传统的考试方式相比&#xff0c;网络考试报名系统极大地提高了考试的灵活性&#xff0c;并在许多领域已经有了广泛的应用。网上考试报名系统的最大优点是可以…

Java基础入门day69

day69 mybatis 开发步骤 查询 前期准备&#xff1a;数据库表结构和表数据准备 mysql> select * from user; ------------------------------------------------ | uid | username | password | email | phone | address | ---------------------------------------------…