位置: IT常识 - 正文

Vue3父子组件间传参通信(vue父组件子组件)

编辑:rootadmin
Vue3父子组件间传参通信 Vue3 父子组件间通信前言一、父传子 defineProps二、子传父 defineEmits三、子组件暴露属性给父组件 defineExpose四、依赖注入Provide / Inject参考前言

推荐整理分享Vue3父子组件间传参通信(vue父组件子组件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue 父子组件,vue中父子组件,vue父组件子组件,vue父子组件v-model,vue3父子组件通信,vue3父子组件通信,vue父子组件v-model,vue3父子组件通信,内容如对您有帮助,希望把文章链接给更多的朋友!

本文主要是记录Vue3在setup语法糖下的父子组件间传参的四种方式

Vue3+TypeScript

一、父传子 defineProps

父组件传值给子组件主要是由父组件为子组件通过v-bind绑定数值,而后传给子组件;子组件则通过defineProps接收使用。

如下为父组件Father.vue

<template> <div class="fa"> <div style="margin: 10px;">我是父组件</div> <Son :fatherMessage="fatherMessage"></Son> </div></template><script setup lang="ts">import Son from './Son.vue'import {ref} from "vue";const fatherMessage = ref<string>("我是父组件传过来的值")</script><style scoped>.fa{ border: 3px solid cornflowerblue; width: 400px; text-align: center;}</style>

如下为子组件Son.vue

<template> <div style="margin: 10px;border: 2px solid red"> 我是子组件 <div style="margin: 5px;border: 2px solid gold"> 父组件传值接收区:{{fatherMessage}} </div> </div></template><script setup lang="ts">interface Props { fatherMessage?: string,}defineProps<Props>()</script>

父组件Father.vue中在调用Son.vue这个子组件时,使用v-bind绑定参数fatherMessage,并传给Son.vue

子组件Son.vue使用defineProps接收fatherMessage这个参数,而后就可以正常使用该参数。

二、子传父 defineEmits

子组件传值给父组件主要是子组件通过defineEmits注册一个自定义事件,而后触发emit去调用该自定义事件,并传递参数给父组件。

在父组件中调用子组件时,通过v-on绑定一个函数,通过该函数获取传过来的值。

Vue3父子组件间传参通信(vue父组件子组件)

如下为子组件Son.vue

<template> <div style="margin: 10px;border: 2px solid red"> 我是子组件 <button @click="transValue" style="margin: 5px">传值给父组件</button> </div></template><script setup lang="ts">import {ref} from "vue";// 定义所要传给父组件的值const value = ref<String>("我是子组件传给父组件的值")// 使用defineEmits注册一个自定义事件const emit = defineEmits(["getValue"])// 点击事件触发emit,去调用我们注册的自定义事件getValue,并传递value参数至父组件const transValue = () => { emit("getValue", value.value)}</script>

如下为父组件Father.vue

<template> <div class="fa"> <div style="margin: 10px;">我是父组件</div> 父组件接收子组件传的值:{{sonMessage}} <Son @getValue="getSonValue"></Son> </div></template><script setup lang="ts">import Son from './Son.vue'import {ref} from "vue";const sonMessage = ref<string>("")const getSonValue = (value: string) => { sonMessage.value = value}</script><style scoped>.fa{ border: 3px solid cornflowerblue; width: 400px; text-align: center;}</style>

父组件Father.vue中在调用Son.vue这个子组件时,当子组件Son.vue需要传参给父组件Father.vue时,使用defineEmits注册一个事件getValue,而后设置点击事件transValue去触发emit,去调用我们注册的自定义事件getValue,并传递value参数至父组件。

父组件Father.vue在获取子组件Son.vue传过来的值时,通过在子组件上使用v-on设置响应函数getValue(该函数与子组件中的注册自定义事件getValue名称需一致),并绑定一个函数getSonValue来获取传过来的值。

三、子组件暴露属性给父组件 defineExpose

当父组件想直接调用父组件的属性或者方法时,子组件可以使用defineExpose暴露自身的属性或者方法,父组件中使用ref调用子组件暴露的属性或方法。 如下为子组件Son.vue

<template> <div style="margin: 10px;border: 2px solid red"> 我是子组件 </div></template><script setup lang="ts">import {ref, defineExpose} from "vue";// 暴露给父组件的值const toFatherValue = ref<string>("我是要暴露给父组件的值")// 暴露给父组件的方法const toFatherMethod = () => { console.log("我是要暴露给父组件的方法")}// 暴露方法和属性给父组件defineExpose({toFatherMethod, toFatherValue})</script>

如下为父组件Father.vue

<template> <div class="fa"> <div style="margin: 10px;">我是父组件</div> <button @click="getSonMethod">获取子组件的方法</button> <Son ref="sonMethodRef"></Son> </div></template><script setup lang="ts">import Son from './Son.vue'import {ref} from "vue";const sonMethodRef = ref()const getSonMethod = () => { sonMethodRef.value.toFatherMethod() console.log(sonMethodRef.value.toFatherValue)}</script><style scoped>.fa{ border: 3px solid cornflowerblue; width: 400px; text-align: center;}</style>

在子组件中定义属性toFatherValue和方法toFatherMethod,而后通过defineExpose暴露出来。 父组件调用时,为子组件绑定一个ref,并定义一个ref变量sonMethodRef,通过调用sonMethodRef,来获取子组件暴露出来的属性和方法。

四、依赖注入Provide / Inject

从上面的介绍里我们可以了解到父子组件之间的通信,但是却存在这样的情况:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这会非常麻烦:

虽然这里的 Footer 组件可能根本不关心这些 props,但为了使 DeepChild 能访问到它们,仍然需要定义并向下传递。如果组件链路非常长,可能会影响到更多这条路上的组件。这一问题被称为“prop 逐级透传”,显然是我们希望尽量避免的情况。 provide 和 inject 可以帮助我们解决这一问题。 一个父组件相对于其所有的后代组件,会作为依赖提供者。任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖。 如下为父组件Root.vue

<template> <div> 我是root组件 <Footer></Footer> </div></template><script setup lang="ts">import { provide, ref } from 'vue'import Footer from './Footer.vue'const toChildValue= ref<string>("我是给所有子组件的值")// 将toChildValue注入到所有子组件中provide(/* 注入名 */ 'toChildValue', /* 值 */ toChildValue)</script>

如下为子组件Footer.vue

<template> <div> 我是footer组件 <div> 接收父组件的值:{{getFatherValue}} </div> <DeepChild></DeepChild> </div></template><script setup lang="ts">import DeepChild from "./DeepChild.vue"import {ref,inject,Ref} from "vue";// 获取父组件提供的值// 如果没有祖先组件提供 "toChildValue"// ref("") 会是 "这是默认值"const getFatherValue = inject<Ref<string>>(/* 注入名 */"toChildValue",/* 默认值 */ ref(""))</script>

如下为孙子组件DeepChild.vue

<template> <div> 我是deepChild组件 <div> 接收爷爷组件的值:{{getGrandFatherValue}} </div> </div></template><script setup lang="ts">import {inject, ref, Ref} from "vue";// 获取爷爷组件提供的值// 如果没有爷爷组件提供 "toChildValue"// value 会是 ""const getGrandFatherValue = inject<Ref<string>>(/* 注入名 */"toChildValue",/* 默认值 */ ref(""))</script>

当最顶层的组件Root.vue传值给所有子组件时,使用provide进行注入

provide(/* 注入名 */ 'toChildValue', /* 值 */ toChildValue)

而后无论哪个子组件想要获取toChildValue的值,只需使用inject即可

inject<Ref<string>>(/* 注入名 */"toChildValue",/* 默认值 */ ref(""))

当提供 / 注入响应式的数据时,如果想改变数据时,建议尽可能将任何对响应式状态的变更都保持在供给方组件中,即根组件Root.vue。这样可以确保所提供状态的

本文链接地址:https://www.jiuchutong.com/zhishi/298546.html 转载请保留说明!

上一篇:OFDM雷达信号模糊函数MATLAB仿真分析(雷达信号pri)

下一篇:vue 项目的屏幕自适应方案(vue display)

  • 荣耀30pro关闭铃声渐强的方法(荣耀30如何关闭所有提示音)

    荣耀30pro关闭铃声渐强的方法(荣耀30如何关闭所有提示音)

  • 电脑内存不足可以加硬盘不(电脑内存不足可以用u盘代替吗)

    电脑内存不足可以加硬盘不(电脑内存不足可以用u盘代替吗)

  • 抖音关注怎么变同城了(抖音关注怎么变成0)

    抖音关注怎么变同城了(抖音关注怎么变成0)

  • 苹果11电池健康容量恢复100(苹果11电池健康76有必要换吗)

    苹果11电池健康容量恢复100(苹果11电池健康76有必要换吗)

  • 打电话通了手机黑屏无反应(打完电话手机)

    打电话通了手机黑屏无反应(打完电话手机)

  • 火山小视频怎么没有了(火山小视频怎么看不到火力了)

    火山小视频怎么没有了(火山小视频怎么看不到火力了)

  • 苹果7能不能升级13.5(苹果7能不能升级)

    苹果7能不能升级13.5(苹果7能不能升级)

  • vivo关机闹钟不响(vivo关机闹钟不响怎么解决)

    vivo关机闹钟不响(vivo关机闹钟不响怎么解决)

  • 淘宝流失竞店什么意思(淘宝生意参谋流失竞店是什么意思)

    淘宝流失竞店什么意思(淘宝生意参谋流失竞店是什么意思)

  • 手机直播有电流声怎么办(手机直播有电流声怎么解决视频)

    手机直播有电流声怎么办(手机直播有电流声怎么解决视频)

  • 微信好友辅助发送了没反应(微信好友辅助发送什么)

    微信好友辅助发送了没反应(微信好友辅助发送什么)

  • 3500x相当于i几(cpu天梯图2023)

    3500x相当于i几(cpu天梯图2023)

  • 手机摄像头不聚焦了怎么办(手机摄像头不聚焦模糊是什么原因?)

    手机摄像头不聚焦了怎么办(手机摄像头不聚焦模糊是什么原因?)

  • 重启和关机再开机一样吗(重启和关机再开机的区别)

    重启和关机再开机一样吗(重启和关机再开机的区别)

  • 图片设置为四周型环绕(图片设置为四周环绕方式放置在页码中间位置)

    图片设置为四周型环绕(图片设置为四周环绕方式放置在页码中间位置)

  • 奔腾微处理器是由什么公司生产的(奔腾微处理器是什么位的微处理器)

    奔腾微处理器是由什么公司生产的(奔腾微处理器是什么位的微处理器)

  • 华为mate30上面两个孔是干嘛的(华为mate30pro上面两个洞)

    华为mate30上面两个孔是干嘛的(华为mate30pro上面两个洞)

  • 抖音换手机了怎么登录(抖音换手机了怎么登录原来的号)

    抖音换手机了怎么登录(抖音换手机了怎么登录原来的号)

  • 华为mate30如何装双卡(华为mate30如何装google play)

    华为mate30如何装双卡(华为mate30如何装google play)

  • 桌面整理在哪里打开(桌面整理在哪里设置)

    桌面整理在哪里打开(桌面整理在哪里设置)

  • 手机腾讯会员二维码在哪(手机腾讯会员二维在哪里)

    手机腾讯会员二维码在哪(手机腾讯会员二维在哪里)

  • 苹果x打电话听筒没声音(苹果x打电话听筒没声音 微信听语音正常)

    苹果x打电话听筒没声音(苹果x打电话听筒没声音 微信听语音正常)

  • Axios简介(axios入门)

    Axios简介(axios入门)

  • 帝国Cms模板制作调用论坛贴子教程(帝国cms手机版制作)

    帝国Cms模板制作调用论坛贴子教程(帝国cms手机版制作)

  • 无法收回的应收账款可以税前扣除吗
  • 什么是本期应纳税所得额
  • 未开票收入次月如何申报增值税
  • 差额增税可以抵扣吗
  • 飞机发票和行程单可以一起开吗
  • 社保申报后不能缴费
  • 申请补交公积金提案
  • 小规模不报税会怎么样
  • 可转换债券含义
  • 行政事业单位会计制度
  • 安置残疾人就业税收优惠政策
  • 供应商提供财务报表
  • 营业范围之外的产品可以出售吗
  • 企业更名后账务如何处理
  • 营改增后增值税小规模纳税人按什么申报
  • 单次劳务费税率
  • 劳务公司开的专票需要交税吗
  • 营改增后房产税计税依据 土地价款
  • 承租方出售资产的行为
  • 广告公司怎样
  • 2019年印花税税率表
  • 生产型企业一般会有哪些外来文件
  • 完全成本法下期间费用应当包括
  • 工会经费什么时候返还给企业
  • 小规模纳税人可以退税吗?
  • 酒店长包房正常打几折
  • 企业注销个税怎样更正申报呢
  • 删除文件需要管理员权限无法添加怎么办
  • 公司增资怎么做
  • 差额发票可以开1个点吗?
  • 应纳消费税包不包括代收代缴
  • php declare函数
  • 财务清算的作用
  • 净资产收益率怎么求
  • 2021发票勾选认证
  • 公司购置办公楼自用
  • 材料采购运杂费包括
  • 罂粟的花季
  • 销售方红字发票的账务处理?
  • 快递行业规矩
  • 机动车组织机构代码查询
  • 一觉醒后浑身酸痛
  • 免抵退税额怎么计算城建税
  • 小规模收到成本发票分录
  • 收到红字发票如何入账
  • 福利费为什么通过应付职工薪酬科目要紧吗
  • 不抵扣勾选有什么风险
  • 股东的投资款怎么收回
  • 一次还本付息债券定价公式
  • 可以公账户给私人转账吗
  • 确认借款无法收款怎么办
  • 加计扣除所得税怎么算
  • 应收账款记账凭证怎么写
  • 其他流动资产
  • 税控系统全额抵扣
  • sql自定义数据类型
  • win10注册表主键
  • 电脑bios启动项设置中文
  • vs显示进程已退出
  • ahqtb.exe是啥进程 ahqtb进程信息查询
  • window怎么操作
  • win7系统电脑怎么连接热点
  • win7 32位内存最大支持多少
  • macair蓝牙用不了
  • gcc编译选项详解
  • WIN7系统如何恢复出厂系统
  • win8怎么添加桌面
  • win8如何免费升级win10
  • win8关闭uac
  • 猫的猫的视频
  • css浮动和清除浮动
  • unity自动生成
  • js中onmouseover
  • python快速上手 自动化
  • jquery获取元素的父元素
  • jquery加载中
  • 办理对外支付税务备案需要多久时间
  • 厂房房产税2021年税率
  • 个人所得税必须企业代扣代缴吗
  • 农夫山泉水质量合格吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设