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

  • 企业标准查询小微企业怎么查询

    企业标准查询小微企业怎么查询

  • 千兆路由器和百兆有什么区别(千兆路由器和百兆区别怎么看)

    千兆路由器和百兆有什么区别(千兆路由器和百兆区别怎么看)

  • 王者荣耀血王宫的回忆怎么满星过(王者荣耀血王宫回忆怎么找不到了)

    王者荣耀血王宫的回忆怎么满星过(王者荣耀血王宫回忆怎么找不到了)

  • 两个微信号能实名认证一个人吗(两个微信号能实名一个身份证吗)

    两个微信号能实名认证一个人吗(两个微信号能实名一个身份证吗)

  • 华为手机照相模糊不清怎么回事(华为手机照相模糊怎么回事)

    华为手机照相模糊不清怎么回事(华为手机照相模糊怎么回事)

  • 微信安装etc设备是免费的吗(微信etc安装步骤)

    微信安装etc设备是免费的吗(微信etc安装步骤)

  • 屏幕镜像为什么搜不到电视(屏幕镜像为什么打不开)

    屏幕镜像为什么搜不到电视(屏幕镜像为什么打不开)

  • 腾讯会议不自动连接音频(腾讯会议不自动隐藏任务栏)

    腾讯会议不自动连接音频(腾讯会议不自动隐藏任务栏)

  • 拼多多取消活动可以再次报名吗(拼多多取消活动降权吗)

    拼多多取消活动可以再次报名吗(拼多多取消活动降权吗)

  • 智慧投屏功能是什么(智慧投屏有什么用?)

    智慧投屏功能是什么(智慧投屏有什么用?)

  • 移动硬盘的数据在电脑上有痕迹吗(如何恢复移动硬盘的数据)

    移动硬盘的数据在电脑上有痕迹吗(如何恢复移动硬盘的数据)

  • 拼多多怎么关闭拼小圈好友申请(拼多多怎么关闭多多支付)

    拼多多怎么关闭拼小圈好友申请(拼多多怎么关闭多多支付)

  • r9s什么时候上市的(oppo r9s plus是哪一年上市的)

    r9s什么时候上市的(oppo r9s plus是哪一年上市的)

  • 快手是谁创建的属于哪个公司(快手是谁创建的宿华)

    快手是谁创建的属于哪个公司(快手是谁创建的宿华)

  • LTE打开有什么坏处吗(开启lte对手机有影响吗)

    LTE打开有什么坏处吗(开启lte对手机有影响吗)

  • 为什么删了的照片又回来了(为什么删了的照片会在轻颜里)

    为什么删了的照片又回来了(为什么删了的照片会在轻颜里)

  • 退款卖家还要输密码吗(卖家退款非要姓名吗)

    退款卖家还要输密码吗(卖家退款非要姓名吗)

  • mate30pro怎么拍摄夜景照片(mate30pro怎么拍摄微距)

    mate30pro怎么拍摄夜景照片(mate30pro怎么拍摄微距)

  • 抖音资料一天可以修改几次(抖音一天产生多少视频)

    抖音资料一天可以修改几次(抖音一天产生多少视频)

  • 华为lnd一al30是什么型号(华为lnd-al30是什么型号)

    华为lnd一al30是什么型号(华为lnd-al30是什么型号)

  • 手机投屏后怎么放大(手机投屏后怎么设置不影响玩手机)

    手机投屏后怎么放大(手机投屏后怎么设置不影响玩手机)

  • 百度音乐如何下载到u盘(百度音乐如何下载)

    百度音乐如何下载到u盘(百度音乐如何下载)

  • 怎么设置电脑锁屏时间(怎么设置电脑锁屏后要密码唤醒)

    怎么设置电脑锁屏时间(怎么设置电脑锁屏后要密码唤醒)

  • 蓝牙音箱声音突然变小(蓝牙音箱声音突然变小怎样解决)

    蓝牙音箱声音突然变小(蓝牙音箱声音突然变小怎样解决)

  • Linux中使用mdadm命令来操作RAID的基本教程(linux中使用less命令分屏查看)

    Linux中使用mdadm命令来操作RAID的基本教程(linux中使用less命令分屏查看)

  • JDK1.6中String类的坑,快让我裂开了…(java string.class)

    JDK1.6中String类的坑,快让我裂开了…(java string.class)

  • 合集phpcms安全漏洞(php5.6漏洞)

    合集phpcms安全漏洞(php5.6漏洞)

  • 小规模纳税人应交增值税明细科目
  • 递延所得税资产账务处理
  • 个人所得税的税点是多少钱
  • 未分配利润与净利润不相等
  • 公司的货款直接到账吗
  • 本月缴纳增值税和上个月账本金额不对
  • 社保基数是按税前工资还是税后工资
  • 索赔怎么开票
  • 出售无形资产净收益是收入吗
  • 会计期末要做的事情
  • 融资的方式有哪两种类型
  • 支票付款提示
  • 冲暂估成本的会计分录
  • 非货币性资产对外投资
  • 增值税发票收款人复核人空白可以吗
  • 税收分类编码格式
  • 6位开票代码是什么意思
  • 企业出租屋顶不需要缴税!
  • 印制宣传册
  • 购买法下购买成本包括
  • 资金筹集业务的账务处理重点笔记
  • 帮别的公司代销产品,对方公司不开具发票怎么做帐
  • linux命令df -h结果详解
  • 如何在win7系统中找到ie浏览器
  • 默认网关不可用怎么修复
  • sec是什么文件
  • Docker部署nginx
  • 微信支付的开发公司
  • 个体工商户季报还是月报
  • 新准则下担保企业有哪些
  • 减按10%的税率是什么意思
  • 成本费用票包括哪些
  • 交通费比例
  • 企业内部培训费用
  • layuitablechecked获取选中数据方式
  • 销售自己使用过的物品
  • 支付版权使用费怎么记账
  • 汇算清缴费用调整怎么做账
  • 购货发票属于是什么凭证
  • 出售无形资产科目
  • 赠送代金券活动方案
  • 生产成本科目期末怎么结转
  • 事故赔偿金分配
  • 公司名下汽车过户个人需要补税吗
  • 完税凭证抵扣进项税额分录
  • 公司借款如何做账务处理
  • 如何申请增值税留抵退税
  • 财务报告分析主要内容
  • 计提个人所得税会计分录怎么做账
  • 汽车生产企业三大战略
  • 在建工程转长期待摊费用是什么意思
  • 开发项目设计费放入什么科目
  • 土地发票可以抵扣吗
  • 业务招待费是销售
  • 原材料科目怎么设置
  • SQLServer Execpt和not in 性能区别
  • sql游标实例
  • mysql绿色版安装配置教程
  • win10系统查看
  • 新移动硬盘安装视频教程
  • centos开机自动运行
  • realmon.exe - realmon是什么进程 有什么用
  • 如何限制网速不让孩子玩游戏
  • 电脑window8系统怎么样
  • win10系统admin和oobe
  • windows7安全更新服务
  • gta4支持win10
  • linux怎么使用ssh命令
  • 基于stm32的100个毕业设计
  • Android GLSurfaceView.Renderer
  • js文件里面有什么
  • python调用ansible执行playbook
  • jquery图片轮播无缝连接
  • jquery使用教程
  • python 多线程处理
  • [置顶]津鱼.我爱你
  • 境外投资收益如何交税
  • 税费银联缴款
  • 纳税服务投诉整改报告
  • 微信 税务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设