当前位置: 首页 > news >正文

Vue3父子组件传值

一、总结

vue3父子组件传值需要利用defineProps和defineExpose。

父组件传递给子组件使用defineProps,本质是通过自定义props传递数据,但是子组件在接受数据时候需要在子组件中结合TS先定义一下传递数据的类型。

子组件传递给父组件数据用到defineExpose,本质就是对外暴露数据。在用ref或reactive定一个传递的数据,在父组件中通过ref来获取子组件实例,在通过.value来获取具体数据。

二、父组件传值给子组件

父组件:将定义的person对象传递到下面子组件中去 <template> <div> <Son :person="person" ref="sonRef"></Son> <div> <h2>我是父组件 :传递一个person对象到子组件中,子组件获取到person对象后赋值,父组件中可以修改person对象的属性值</h2> <el-button type="primary" size="small" @click="handleAgeAdd">增加年龄</el-button> </div> </div> </template> <script setup lang="ts"> import Son from './Son.vue' import { reactive,ref } from 'vue' let person = reactive({ name: '张三', age: 8 }) function handleAgeAdd() { person.name = '李四' person.age += 1 } </script> <style scoped> </style> 子组件:通过defineProps接受父组件传递过来的person对象 <template> <div> <h2>我是子组件:接受父组件传递过来的person对象,并利用defineProps给出person对象数据类型</h2> </div> <div> <span>姓名</span><input type="text" v-model="person.name"> <span>年龄</span><input type="number" v-model="person.age"> </div> </template> <script setup lang="ts"> import { ref } from 'vue' // 父组件传递给子组件的数据,利用defineProps接收父组件传递过来的person对象 // 并且利用TS给出传递过来的person数据的类型 defineProps({ person: { type: Object, default: () => ({}) } }) </script> <style scoped> </style>

三、子组件传值给父组件

子组件:通过defineExpose暴露数据,传递给父组件 <template> <div> <h2>子组件:接受父组件传递过来的person对象,并利用defineProps给出person对象数据类型</h2> </div> <div> <span>姓名</span><input type="text" v-model="person.name"> <span>年龄</span><input type="number" v-model="person.age"> </div> </template> <script setup lang="ts"> import { ref } from 'vue' // 子组件传递给父组件的数据,利用defineExpose暴露给父组件调用 let sonToFatherData = ref(3) defineExpose({ sonToFatherData }) </script> <style scoped> </style> 父组件:接受子组件数据,在负组件中ref实现获取数据 <template> <div> <Son :person="person" ref="sonRef"></Son> <div> <h2>父组件 :传递一个person对象到子组件中,子组件获取到person对象后赋值,父组件中可以修改person对象的属性值</h2> <el-button type="primary" size="small" @click="handleAgeAdd">增加年龄</el-button> <el-button type="primary" size="small" @click="ShowSonToFatherData">显示子组件传递过来的sonToFatherData数据</el-button> <h2 v-show="show">{{SonToFatherData}}</h2> </div> </div> </template> <script setup lang="ts"> import Son from './Son.vue' import { reactive,ref } from 'vue' // 父组件接受子组件传递过来的数据,利用defineExpose接收子组件传递过来的sonToFatherData数据 let sonRef = ref() function ShowSonToFatherData() { console.log('123') show.value=true console.log(sonRef.value.sonToFatherData) SonToFatherData=sonRef.value.sonToFatherData } let show=ref(false) let SonToFatherData=ref() function handleAgeAdd() { person.name = '李四' person.age += 1 } </script> <style scoped> </style>

里面的show和一些点击的方法大家可以暂时忽略,避免干扰,我只是加了一些方法来实现点击显示子组件传递的数据或者是改变父组件中一些数据而已

四、完整父子组件传值代码

<template> <div> <Son :person="person" ref="sonRef"></Son> <div> <h2>父组件 :传递一个person对象到子组件中,子组件获取到person对象后赋值,父组件中可以修改person对象的属性值</h2> <el-button type="primary" size="small" @click="handleAgeAdd">增加年龄</el-button> <el-button type="primary" size="small" @click="ShowSonToFatherData">显示子组件传递过来的sonToFatherData数据</el-button> <h2 v-show="show">{{SonToFatherData}}</h2> </div> </div> </template> <script setup lang="ts"> import Son from './Son.vue' import { reactive,ref } from 'vue' // 父组件即将传递的person数据,并结合<Son :person="person"></Son>实现 let person = reactive({ name: '张三', age: 8 }) function handleAgeAdd() { person.name = '李四' person.age += 1 } // 父组件接受子组件传递过来的数据,利用defineExpose接收子组件传递 // 过来的sonToFatherData数据并结合<Son ref="sonRef"></Son>实现 let sonRef = ref() let show=ref(false) let SonToFatherData=ref() function ShowSonToFatherData() { console.log('123') show.value=true console.log(sonRef.value.sonToFatherData) SonToFatherData=sonRef.value.sonToFatherData } </script> <style scoped> </style> <template> <div> <h2>子组件:接受父组件传递过来的person对象,并利用defineProps给出person对象数据类型</h2> </div> <div> <span>姓名</span><input type="text" v-model="person.name"> <span>年龄</span><input type="number" v-model="person.age"> </div> </template> <script setup lang="ts"> import { ref } from 'vue' // 父组件传递给子组件的数据,利用defineProps接收父组件传递过来的person对象 defineProps({ person: { type: Object, default: () => ({}) } }) // 子组件传递给父组件的数据,利用defineExpose暴露给父组件调用 let sonToFatherData = ref(3) defineExpose({ sonToFatherData }) </script> <style scoped> </style>
http://www.jsqmd.com/news/1338623/

相关文章:

  • 揭秘行业潜规则与实操干货:网站建设怎么找客户,从小白到资深外包商的突围指南
  • 【试读】企业级项目五:金融信贷实时数仓建设
  • # 危废仓储数字化改造,企业该如何适配环保数字化监管新规?
  • 苏州配眼镜花了冤枉钱的人十有八九都在验光上吃了亏 - 配眼镜新资讯
  • Unity单机游戏红点系统设计:基于前缀树与观察者模式的实现
  • t检验与t值详解:从信号噪音比到统计显著性决策
  • 计算机体系结构核心:流水线、Cache与依赖如何影响程序性能
  • Unity游戏马赛克移除:BepInEx与UniversalUnityDemosaics实战指南
  • 深入解析systemd:从核心概念到高级服务管理实战
  • 扣子定时触发器与云原生调度冲突?K8s CronJob vs 扣子内置Trigger的7维度对比评测(附迁移决策矩阵表)
  • Unity PC应用窗口自定义:彻底摆脱播放器感,实现专业级无边框窗口
  • 2026年AI大模型开发终极指南:大模型零基础进阶路线,从入门到精通,AI高薪就业必备!
  • Unity2D飞刀游戏源码解析:从物理调优到对象池性能实战
  • Anaconda数据科学环境配置:从安装到实战的完整指南
  • Unity编辑器优化:ScriptableObject枚举中文显示与PropertyDrawer实践
  • 灰色关联分析改进模型:解决正负关联方向识别问题
  • 深圳配眼镜中年人视力账本一副渐进镜片解决远近切换零碎烦恼 - 配眼镜新资讯
  • 滴滴一面:怎么做好 Harness?大部分面试者的回答只停留在怎么用,没有回答的更系统
  • Unity开发核心:Vector3与Quaternion的数学原理与实战应用
  • UE5蓝图与动态材质、Niagara实战:打造可交互游戏视觉特效
  • 三维高斯泼溅技术:从原理到实践,实现实时高保真3D重建
  • 在线剪切板:一款高效便捷的跨平台剪贴板管理工具
  • AI Agent开发实战:从核心原理到工程部署的完整指南
  • 【AI写论文辅助终极指南】:20年学术技术专家亲授5大避坑法则与3个必用高阶技巧
  • 【Kubernetes从入门到精通】第19篇:Volume——容器数据的“不动产“
  • EDK2源码架构:DXE Dispatcher驱动加载顺序与Protocol Database
  • 44-应用当前版本切换的治理意义:为什么“当前基线”必须被显式维护
  • 深圳配眼镜青少年防控不能等从验光到镜片给孩子完整视力方案 - 配眼镜新资讯
  • HTML5标准文档构建实战:从零搭建语义化网页骨架
  • Maven私有仓库高效配置与CI/CD集成实战指南