位置: 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)

  • iphone13屏幕是oled吗(iphone13屏幕是oled还是lcd)

    iphone13屏幕是oled吗(iphone13屏幕是oled还是lcd)

  • safari阅读模式怎么开(safari阅读模式怎么开ipad)

    safari阅读模式怎么开(safari阅读模式怎么开ipad)

  • 飞行堡垒wifi功能消失了(飞行堡垒wifi功能消失了,就一个飞行模式)

    飞行堡垒wifi功能消失了(飞行堡垒wifi功能消失了,就一个飞行模式)

  • 快充头输出是多少(快充头输出电压是多少)

    快充头输出是多少(快充头输出电压是多少)

  • 手机提示网络开小差(手机提示网络开小差是什么意思)

    手机提示网络开小差(手机提示网络开小差是什么意思)

  • 9v电池是几号电池(9v电池是干嘛用的)

    9v电池是几号电池(9v电池是干嘛用的)

  • 小米8更新系统后开不了机(小米8更新系统好吗)

    小米8更新系统后开不了机(小米8更新系统好吗)

  • 拍照广角是什么意思(广角拍照有什么好处)

    拍照广角是什么意思(广角拍照有什么好处)

  • b站播放量自己看算吗(b站播放量自己算不算)

    b站播放量自己看算吗(b站播放量自己算不算)

  • 页面加载超时什么意思(页面加载超过()秒,57%的用户会放弃当前浏览)

    页面加载超时什么意思(页面加载超过()秒,57%的用户会放弃当前浏览)

  • 苹果8手机多长(苹果手机8)

    苹果8手机多长(苹果手机8)

  • 拼多多卖家不发货会有什么惩罚(拼多多卖家不发货会自动退给买家吗)

    拼多多卖家不发货会有什么惩罚(拼多多卖家不发货会自动退给买家吗)

  • 网站与网址有什么区别(网站与网址有什么不同)

    网站与网址有什么区别(网站与网址有什么不同)

  • 华为手机扬声器有嘶嘶杂音(华为手机扬声器声音小)

    华为手机扬声器有嘶嘶杂音(华为手机扬声器声音小)

  • GN是什么东西(gn意思)

    GN是什么东西(gn意思)

  • 抖音怎么发到个人作品(抖音怎么发到个人微信上)

    抖音怎么发到个人作品(抖音怎么发到个人微信上)

  • vivo有红外线遥控吗(vivo红外线遥控在哪里)

    vivo有红外线遥控吗(vivo红外线遥控在哪里)

  • 如何改微信收款二维码(如何改微信收款二维码名字)

    如何改微信收款二维码(如何改微信收款二维码名字)

  • 拼多多点击哪实名认证(拼多多shizhi)

    拼多多点击哪实名认证(拼多多shizhi)

  • 网易云怎么看注册时间(网易云怎么看注销账号的主页)

    网易云怎么看注册时间(网易云怎么看注销账号的主页)

  • 手机黑边变宽怎么修复(手机黑边宽度)

    手机黑边变宽怎么修复(手机黑边宽度)

  • 快手ktv模式怎么开(快手ktv怎么开启)

    快手ktv模式怎么开(快手ktv怎么开启)

  • vivox27全面屏怎么设置(vivox21a全面屏设置)

    vivox27全面屏怎么设置(vivox21a全面屏设置)

  • 卡西欧计算器分数变小数(卡西欧计算器分式怎么变成角了)

    卡西欧计算器分数变小数(卡西欧计算器分式怎么变成角了)

  • 手机打电话有回音是怎么回事(手机打电话有回音是什么原因造成的)

    手机打电话有回音是怎么回事(手机打电话有回音是什么原因造成的)

  • vue3.0-axios拦截器、proxy跨域代理(vue axios 拦截器)

    vue3.0-axios拦截器、proxy跨域代理(vue axios 拦截器)

  • 个人所得税一般多久能退下来
  • 注销库存股为什么股本减少
  • 企业境外投资管理办法
  • 水电费进项税额怎么抵扣
  • 企业所得税季度申报填写示例
  • 母公司帮子公司偿还债务
  • 中央空调折旧年限是多久
  • 自产自销农产品企业所得税
  • 工程报废及毁损如何做会计处理合适呢?
  • 税控盘费用减免分录
  • 上缴税费总额包括个税吗?
  • 企业如果亏损应该计提缴纳所得税吗
  • 国税票怎么开
  • 进项税额待转出是什么意思
  • 所得税会计核算要点及程序
  • 为什么报税资料老是显示有
  • 增值税申报内容及步骤
  • 赠送样品需要交税吗
  • 递延收益现金流量附表项目
  • 贸易公司未开票收入要报税吗
  • 哪些税计入原材料费用
  • 记账凭证做完之后干什么
  • 财务费用余额在借方是正数还是负数
  • 净利润分配股利的会计分录
  • 出售固定资产增值税税率最新2022
  • 报废资产未及时核销
  • linux的pipe
  • vue jsx报错
  • 深度deepin系统安装教程
  • 汇算清缴后补缴企业所得税账务处理
  • 进项税额转出会计分录福利费
  • php动态网站开发项目教程
  • php去除空格和换行符
  • 支付银行借款利息可以全额扣除吗
  • 水资源税收费标准
  • 事业单位资产管理中存在的问题及整改措施
  • 预缴季度企业所得税分录
  • 个人独资企业的特点
  • js返回上一步操作
  • 前端开发软件哪个最好
  • vue接入高德地图
  • echarts y轴设置
  • 智慧工厂协同管控下载
  • WIN11系统CPU占用率高
  • 银行利息的收入计入什么科目
  • 用友固定资产模块反结账
  • 三代手续费的税率
  • 织梦怎么样
  • 差旅费算直接人工吗
  • 预缴税款计算表填0.01行吗
  • 销售费用主要包括哪些
  • mysql卡住了
  • 税前列支的项目
  • 债券到期收益率被定义为使债券的()
  • 收到存款利息属于资金周转吗
  • 自产的产品用于管理部门
  • 装修费应该按几折算
  • 租赁房屋取得发票怎么开
  • 固定成本总额包含折旧吗
  • mysql5.7版本下载
  • sedsvc.exe是什么
  • win8.1快捷键
  • ubuntu中安装vim
  • cgi linux
  • Win10 TH2正式版偷偷恢复/篡改成对应的预装应用
  • lsass.exe在哪个文件夹
  • windows8介绍
  • csh,tcsh,bash,sh等shell的区别
  • js移动元素位置
  • java密码强度检验工具
  • find 批处理
  • 创业要看的书
  • javascript教程
  • python 数据结构 算法
  • JavaScript中的变量名不区分大小写
  • arcgis engine+c#实例开发教程
  • js构造器constructor
  • 广东地税局领导班子
  • 扬州退契税政策
  • 杭州 国税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设