vue3-实现父子组件之间的通信(详解+源码)

2023-11-18

前言:vue3相对于vue2的父子传参方式有所改变,本文介绍三种:父组件给子组件传参、父组件调用子组件内的方法、子组件调用父组件的方法,如果不需要一种一种看可以直接下滑看全部代码,有注释也蛮好理解

一、父组件给子组件传参:

1、父组件给子组件传参时,父组件这边的方式没有改变,还是在子组件上用 :xxx=“要传的参数”

2、子组件接收时要用defineProps方法来接收,接收时要用父组件定义的那个xxx一样

3、和vue2一样,在defineProps里面接收到的参数可以直接在html里面使用,相当于已经定义过

父组件代码:

<template>
  <div :style="{
      border: '1px solid red',
    }">
    我是首页,父组件
    <Title :parMsg="myMsg"></Title>
  </div>
</template>

<script>
export default {
  name: "dashboard",
};
</script>

<script setup>

import Title from "@/components/title/index.vue";
import { ref } from "vue";
//传给子组件的参数
const myMsg = ref("我来自父组件");

</script>

<style lang="scss" scoped></style>

子组件代码:

<template>
  <div
    :style="{
      border: '1px solid green',
    }"
  >
    <div>子组件组件</div>
    <div>父组件传过来的参数:{{ parMsg }}</div>
  </div>
</template>

<script>
export default {
  name: "title",
};
</script>

<script setup>
import { ref } from "vue";
//接受父组件传过来的参数
const props = defineProps({
  parMsg: {
    type: String,
    default: "",
  },
});

</script>

<style lang="scss" scoped></style>

 页面上呈现的效果如下图:

 二、父组件调用子组件内的方法

1、父组件里需要给子组件标签加ref,然后用ref.value.子组件内的方法名调用

2、子组件内的方法要用defineExpose抛出

 父组件代码:

<template>
  <div :style="{
      border: '1px solid red',
    }">
    我是首页,父组件
    <Title ref="sonRef" :parMsg="myMsg"></Title>
    <el-button @click="sonFn">调用子组件的方法</el-button>
    
  </div>
</template>

<script>
export default {
  name: "dashboard",
};
</script>

<script setup>
import Title from "@/components/title/index.vue";
import { ref } from "vue";
//传给子组件的参数
const myMsg = ref("我来自父组件");

//父组件调用子组件的方法
const sonRef = ref();
const sonFn = () => {
  sonRef.value.ParentOpSon("11111父组件给子组件里的方法传的参数");
};


</script>

<style lang="scss" scoped></style>

 子组件代码:

<template>
  <div
    :style="{
      border: '1px solid green',
    }"
  >
    <div>子组件组件</div>
    <div>父组件传过来的参数:{{ parMsg }}</div>
    <div>父组件调用子组件方法传入的参数:{{ sonMsg2 }}</div>
  </div>
</template>

<script>
export default {
  name: "title",
};
</script>

<script setup>
import { ref } from "vue";
//接受父组件传过来的参数
const props = defineProps({
  parMsg: {
    type: String,
    default: "",
  },
});

//定义子组件的函数
const sonMsg2 = ref("");
const ParentOpSon = (parentMsg) => {
  sonMsg2.value = parentMsg;
};
//抛出之后父组件才能调用该函数
defineExpose({
  ParentOpSon,
});

</script>

<style lang="scss" scoped></style>

页面上的效果如下图:

点击调用子组件的参数按钮,就会出现红框里的字,证明父组件调用了子组件里的方法并且传参成功

 三、子组件调用父组件的方法

1、父组件需要在子组件标签上加@xxx="func",func是要给子组件调用的函数,xxx随便定义一个名字用来和子组件通信

2、子组件首先要调用defineEmits()赋值给我们定义的emit(这个名字随便),然后用emit(“父组件内定义的xxx”,“子组件给父组件传的参数”)来调用

父组件代码:(三种全部代码)

<template>
  <div :style="{
      border: '1px solid red',
    }">
    我是首页,父组件
    <Title ref="sonRef" :parMsg="myMsg" @parentFn="parFn"></Title>
    <el-button @click="sonFn">调用子组件的方法</el-button>
    <div>子组件调用父组件传入的参数:{{ sonMsg }}</div>
  </div>
</template>

<script>
export default {
  name: "dashboard",
};
</script>

<script setup>
import Title from "@/components/title/index.vue";
import { ref } from "vue";
//传给子组件的参数
const myMsg = ref("我来自父组件");

//父组件调用子组件的方法
const sonRef = ref();
const sonFn = () => {
  sonRef.value.ParentOpSon("11111父组件给子组件里的方法传的参数");
};

//子组件调用父组件的方法
const sonMsg = ref(); //用来存子组件传过来的参数
const parFn = (e) => {
  console.log(e);
  sonMsg.value = e;
};
</script>

<style lang="scss" scoped></style>

子组件代码:(三种全部代码)

<template>
  <div
    :style="{
      border: '1px solid green',
    }"
  >
    <div>子组件组件</div>
    <div>父组件传过来的参数:{{ parMsg }}</div>
    <div>父组件调用子组件方法传入的参数:{{ sonMsg2 }}</div>
    <el-button @click="parentFn">调用父组件方法</el-button>
  </div>
</template>

<script>
export default {
  name: "title",
};
</script>

<script setup>
import { ref } from "vue";
//接受父组件传过来的参数
const props = defineProps({
  parMsg: {
    type: String,
    default: "",
  },
});

//定义子组件的函数
const sonMsg2 = ref("");
const ParentOpSon = (parentMsg) => {
  sonMsg2.value = parentMsg;
};
//抛出之后父组件才能调用该函数
defineExpose({
  ParentOpSon,
});

//子组件调用父组件的方法
const emit=defineEmits()
const parentFn = () => {
  emit("parentFn", "子组件调用父组件里面的函数了!");
};
</script>

<style lang="scss" scoped></style>

页面:

点击“调用父组件方法”就会出现红框内的字,证明父组件成功调用了子组件内的方法并成功传参

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3-实现父子组件之间的通信(详解+源码) 的相关文章

随机推荐

  • Java开发Telegram机器人

    基于springboot在 pom 中添加
  • Android webview显示电脑版网页

    第一步获取webview的setting 同时进行配置 settings webView getSettings settings setCacheMode WebSettings LOAD NO CACHE 支持js settings s
  • Python发送电子邮件的几种方式介绍

    发送电子邮件是Python中常见的任务之一 可以用于自动化发送通知 报表以及其他与邮件相关的任务 Python提供了几种方式来发送电子邮件 本文将介绍其中的三种常用方式 使用smtplib库 使用email库和使用第三方库 使用smtpli
  • 小程序云开发攻略,解决最棘手的问题

    背景 最近小程序非常的火 应公司业务发展要求 开发维护了几款小程序 公司开发的小程序都是由后端提供的接口 开发繁琐而复杂 直到小程序出现了云开发 仔细研读了文档之后 欣喜不已 于是我着手开发了本人的第一款小程序 小程序云开发教程地址 点我查
  • 【线性表】最常用的数据结构:线性表

    线性表 Linear List 是 最常用且 最简单的一种数据结构 有数据库知识的同学应该比较了解 线性表的定义 线性表是由n n 0 个 数据元素 结点 a 1 a 2 a n组成的有限序列 数据元素的个数n定义为表的长度 n 0时称为空
  • linux 检查程序所需库,查看命令运行所需要的库支持

    问题 我想知道当我调用一个特定的可执行文件在运行时载入了哪些共享库 是否有方法可以明确Linux上可执行程序或运行进程的共享库依赖关系 查看可执行程序的共享库依赖关系 要找出某个特定可执行依赖的库 可以使用ldd命令 这个命令调用动态链接器
  • ImportError: liblapack.so.3: cannot open shared object file: No such file or directory

    如果用的是conda的话 尝试一下 conda install c conda forge liblapack
  • 【操作教程】EasyNVR平台如何接入硬盘录像机?

    EasyNVR是基于RTSP Onvif协议接入的视频平台 可支持将前端设备的音视频进行采集 传输 处理并分发 实现视频监控直播 云端录像 云存储 检索回看 国标级联 告警等视频能力 平台兼容性高 可拓展性强 性能稳定 可应用在智慧工地 智
  • Failed to create the Java Virtual Machine问题解决

    问题现象 打开eclipse exe 弹出如下对话框 问题分析 这是eclipse启动初始化时报的错 一般出现这种情况跟安装了多个Java虚拟机有关 然后eclipse启动的时候 不知道要配置哪一个JDK 所以会报Failed to cre
  • D360周赛复盘:模拟(思维题目)⭐⭐+贪心解决可能的最小和(类似上次)

    文章目录 2833 距离原点最远的点 思路 完整版 2834 找出美丽数组的最小和 思路 完整版 2833 距离原点最远的点 给你一个长度为 n 的字符串 moves 该字符串仅由字符 L R 和 组成 字符串表示你在一条原点为 0 的数轴
  • python+selenium基于po模式的web自动化测试框架

    一 什么是Selenium Selenium是一个基于浏览器的自动化测试工具 它提供了一种跨平台 跨浏览器的端到端的web自动化解决方案 Selenium主要包括三部分 Selenium IDE Selenium WebDriver 和Se
  • 深度学习之目标检测与目标识别

    一 目标识别分类及应用场景 目前可以将现有的基于深度学习的目标检测与识别算法大致分为以下三大类 基于区域建议的目标检测与识别算法 如R CNN Fast R CNN Faster R CNN 基于回归的目标检测与识别算法 如YOLO SSD
  • FW1配置文件

    FW1 sh conf Building configuration Running configuration Version 5 5R2 ip vrouter trust vr exit vswitch vswitch1 exit zo
  • 【Linux】向Linux 5.11.8内核加入新的系统调用

    目录 特殊声明 A mathcal A A 获取root权限
  • 【分布式】分布式相关书籍

    1 概述 1 1 分布式文章汇总 书籍 悟空聊架构 分布式文章汇总 评分 8分 第一章 主要讲解 拜占庭故障 这个讲解的非常好值得一看 第二章 主要讲解 Paxos 共识算法 这个图很好 但是仍然很难懂 第三章 动图讲解分布式 Raft 但
  • 开始学下VC++了

    有点迟了 以前光学DELPHI了 结果还是半瓶子的样子 现在接触下VC 要不会让人BS的 希望开个好点的头吧 不要老是三心二意的哦耶 PS QQ的五笔比搜狗的五笔好用不 个人感觉还是QQ的有点好用哦 嘿嘿 Orz 转载于 https www
  • mac安装python3.7_Mac安装python3.7

    mac默认安装的pyhon版本为2 7 如果要更新为python3 7 那么可以直接安装python3 7 千万不要卸载2 7版本 相信我 把系统自带的东西胡乱卸载掉的话你绝对会后悔的 步骤一 下载安装python3 7 方法一 使用hom
  • Flutter - 图片点击全屏浏览

    demo 地址 https github com iotjin jh flutter demo flutter好用的轮子推荐四 可定制的图片预览查看器photo view flutter九宫格图片查看器 效果图 关于九宫格布局实现 JhPh
  • 方差传递公式

    假设 Y f X 则 Var Y Sigma frac partial f partial x i Var x i
  • vue3-实现父子组件之间的通信(详解+源码)

    前言 vue3相对于vue2的父子传参方式有所改变 本文介绍三种 父组件给子组件传参 父组件调用子组件内的方法 子组件调用父组件的方法 如果不需要一种一种看可以直接下滑看全部代码 有注释也蛮好理解 一 父组件给子组件传参 1 父组件给子组件