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

  • 怎样用视频网络推广呢(怎样用视频网络直播)

    怎样用视频网络推广呢(怎样用视频网络直播)

  • vivo手机自启动开关在哪里设置(vivo手机自启动管理在哪里设置)

    vivo手机自启动开关在哪里设置(vivo手机自启动管理在哪里设置)

  • 苹果原装充电器怎么查真伪(苹果原装充电器和非原装的区别)

    苹果原装充电器怎么查真伪(苹果原装充电器和非原装的区别)

  • ipadmini6怎么插耳机(ipad mini6耳机插孔)

    ipadmini6怎么插耳机(ipad mini6耳机插孔)

  • 微信怎样把别人的朋友圈发到自己的朋友圈(微信怎样把别人推给好友)

    微信怎样把别人的朋友圈发到自己的朋友圈(微信怎样把别人推给好友)

  • 微信怎么小窗口聊天(玩游戏的时候微信怎么小窗口)

    微信怎么小窗口聊天(玩游戏的时候微信怎么小窗口)

  • 苹果11丢了关机了还能找回吗(苹果11丢了关机能查找定位吗)

    苹果11丢了关机了还能找回吗(苹果11丢了关机能查找定位吗)

  • 苹果勿扰模式对方听到什么(苹果勿扰模式对方听到的提示能改么)

    苹果勿扰模式对方听到什么(苹果勿扰模式对方听到的提示能改么)

  • 为什么qq无法上传精选照片(为什么qq无法上传照片)

    为什么qq无法上传精选照片(为什么qq无法上传照片)

  • 拼多多dsr评分怎么快速提高(拼多多dsr评分怎么没有?)

    拼多多dsr评分怎么快速提高(拼多多dsr评分怎么没有?)

  • 为什么美图秀秀连不了网(为什么美图秀秀要钱)

    为什么美图秀秀连不了网(为什么美图秀秀要钱)

  • 苹果11怎么打开来电闪光(苹果11怎么打开悬浮球)

    苹果11怎么打开来电闪光(苹果11怎么打开悬浮球)

  • modemlog存储限制是什么(modemlog储存大小限制是什么意思)

    modemlog存储限制是什么(modemlog储存大小限制是什么意思)

  • 京东能否二次申请售后(京东能否二次申请保价)

    京东能否二次申请售后(京东能否二次申请保价)

  • 怎么关闭淘宝内部耗电运行(淘宝如何关闭我的页面内容)

    怎么关闭淘宝内部耗电运行(淘宝如何关闭我的页面内容)

  • 碎屏险换的是原装屏吗(碎屏险换的是原屏吗)

    碎屏险换的是原装屏吗(碎屏险换的是原屏吗)

  • 新苹果11什么时候上市(iphone 11多久上市的)

    新苹果11什么时候上市(iphone 11多久上市的)

  • 东芝Toshiba笔记本电脑开机进入BIOS的方法与bios设置参数介绍(ESC+F1)(东芝t351笔记本)

    东芝Toshiba笔记本电脑开机进入BIOS的方法与bios设置参数介绍(ESC+F1)(东芝t351笔记本)

  • 多台电脑共享打印机的方法(多台电脑共享打印机怎么设置)

    多台电脑共享打印机的方法(多台电脑共享打印机怎么设置)

  • 路由器怎么设置信道?优化无线路由器信道提高WIFI网速方法详解(路由器怎么设置2.4g网络)

    路由器怎么设置信道?优化无线路由器信道提高WIFI网速方法详解(路由器怎么设置2.4g网络)

  • 鸟瞰生长在森林中的树木,加拿大不列颠哥伦比亚省温哥华 (© Michael Wu/EyeEm/Getty Images)(鸟瞰生长在森林中的植物)

    鸟瞰生长在森林中的树木,加拿大不列颠哥伦比亚省温哥华 (© Michael Wu/EyeEm/Getty Images)(鸟瞰生长在森林中的植物)

  • 股票权类型
  • 营业净利率和总资产净利率的区别
  • 一般纳税人购销合同印花税计税依据
  • 电子承兑汇票贴现流程
  • 财务报表申报错误怎么办
  • 税务局多扣的一笔钱
  • 收到境外汇款怎么处理
  • 本月缴纳增值税和上个月账本金额不对
  • 分公司非独立核算是什么意思
  • 新会计准则科目编码
  • 股权投资基金账户有监管吗
  • 长期股权投资成本法转权益法追溯调整
  • 咨询服务费要交税吗
  • 用于文化活动费用的科目
  • 外帐的倒推流程是什么
  • 为什么增值税普通发票不能抵扣
  • 纳税人必知的十七项增值税开票指南
  • 混合销售和兼营的区别
  • 收代扣代收代征手续费会计分录
  • 原材料入账价值合理损耗
  • 使用时间长但金币不见了
  • 持有待售的非流动资产或处置组不再
  • 新职工工资从什么时候起算
  • window11如何打开任务管理器
  • php?ms=0&qgg=&_wv=3
  • 招投标公司需要什么条件
  • PHP:Memcached::fetchAll()的用法_Memcached类
  • 先开票后收款的发票怎么备注
  • 苹果手机屏幕旋转怎么设置关闭
  • 消费税的计税方法有
  • win7纯净版系统之家
  • 增值税按简易计价方式
  • win7纯净版系统怎么安装
  • Xpath元素定位之同级节点,父节点,子节点
  • 单位和个人交付的区别
  • 服务业增值税加计扣除账务处理
  • 销售多余材料的成本
  • unity ik
  • react脚手架搭建项目
  • df 命令执行显示不出来
  • 公转私法人
  • 用python创建一个列表
  • mysql 服务器配置
  • 一般纳税人开普票要交税几点
  • 财务报表里的现金流量表括号是什么意思
  • 银行本票与银行汇票的区别之一是
  • 出口不退税进项税是否可以抵扣
  • 原始凭证审核要点包括
  • 公司发放工作服怎么做账务处理
  • 公司是生产企业现在要开出租赁的发票可以开吗
  • 应记入营业外支出的科目核算是
  • 明细账分类账登记
  • 景观石属于采购哪个品目
  • 采购折扣怎么结算
  • 用于研发的材料如何入账
  • 商品销售企业成本包括
  • 企业收到劳务费会计分录怎么做账
  • 固定资产原值如何计算
  • 租赁办公楼
  • 盈余公积必须提折旧吗
  • 物业管理企业应具备哪些条件
  • 一个报表的格式主要包括( )
  • 在一台电脑安装两个省份个税系统
  • linux系统崩溃了怎么办
  • win8怎样恢复系统
  • windows7的安装步骤
  • ext.grid.editorgridpanel
  • 解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
  • 一系列优秀的Android开发资料
  • django图片加载不出来
  • jquery easyui validatebox remote的使用详解
  • python中面向对象的概念
  • 盗梦英雄限时占卜顺序
  • python 获取uuid
  • bootstrap需要学多久
  • 可分割项目
  • 张江税务所地址
  • 已经开具的电子专票怎么重新下载
  • 住宿增值税专票税点是多少
  • 宁波市国家税务局网上办税服务厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设