vue3 父子组件传参详解

2023-11-10

前言:我引用了大佬的文章,但我实在找不到网址链接了,我记录在笔记上的。如果大佬看见了,麻烦给我说一下,我注明一下出处

建议先看son.vue 里面写了那三种方式

首先放一个我的demo //defineProps什么的父子传参api不用引入!直接用,内置API

father.vue

<template>
    <div class="box">
        <son-item @fua="fub" :numa="numb" ref="childRef"></son-item>
    </div>
</template>

<script setup>
import sonItem from '@/components/son.vue';
import { ref } from 'vue';
let numb = ref(0)
const childRef= ref()//注册响应数据!!!!!!!!!!!!!!!!
//一定要注意这句,要去注册ref,不然就不能解析出来了,这是个踩过的坑 
let fub = (e)=>{
    //第二种方法返回的结果:
    console.log('这是父组件被动接收的子组件的参数'+e);
    numb.value++
    //第三种方法返回的结果:
    console.log('这是父组件主动获取的子组件的参数:'+childRef.value.selfNum);//偷了懒,没有单独去写一个方法,反正也是父组件里面的方法,将就用一下
}
</script>

son.vue

<template>
    <div class="box">
        子组件接收的参数:{{ numa }}<br>
        子组件自定义的参数:{{ selfNum }}<br>
        //打印表里面有父组件主动获取子组件自定义的参数<br>
        <button @click="fuc">this is a magic button</button>
    </div>
</template>

<script setup>
import { ref } from "vue"

//1、子组件接收父组件的参数
defineProps({
    numa: {
        type: Number,
        default: NaN,
    }
})

//2、子组件传给父组件参数(子组件调用父组件的方法并传参进去)
const str = '这是子组件数据'
const emits = defineEmits(['fua'])//这里暴露父组件自定义的方法
const fuc = () => {
    emits('fua', str)
    selfNum.value+=2
}

//3、父组件(主动)获取子组件里面自定义的参数
let selfNum = ref(0)//自定义一个变量并用上面方法改变其值
defineExpose({
    selfNum//暴露子组件值,让父组件随时可以抓取  当然!也可以暴露方法,让父组件调用
           //父组件调用的时候,直接用ref按照父组件里面的写法就行了
})
</script>

注意:如果son需要father传来的值做一些操作的话;需要拿一个值来接收defineProps,例如:

const props = defineProps({
    numa: {
        type: Number,
        default: NaN,
    }
})
console.log(props.numa);

为了区分变量和函数所以用了xxa,xxb,xxc//变量用得不一样,这样更好区分对应的东西

其实我的demo已经讲得很清楚了,如果实在不懂也可以看下文//我也是小白,麻烦有不足请指出


下面是大佬的文章,但也做了一点小修改

(1)defineProps:子组件接收父组件中传来的props

组件代码

<template>    
    <my-component @click="func" :numb="numb"></my-component>  
</template>  
<script lang="ts" setup>    
    import {ref} from 'vue';    
    import myComponent from '@/components/myComponent.vue';    
    const numb = ref(0);    
    let func = ()=>{numb.value++;}  
</script>

组件代码

<template>    
    <div>{{numb}}</div>  
</template>  
<script lang="ts" setup>    
    defineProps({      
        numb:{        
            type:Number,        
            default:NaN      
        }    
    })  
</script>

(2)[1] defineEmits 代替emit,子组件向父组件传递数据(子组件向外暴露数据)

组件代码

<template>  
    <div>子组件</div>  
    <button @click="toEmits">子组件向外暴露数据</button>
</template>
<script setup>
    import {ref} from 'vue'
    const name = ref('我是子组件')
    //1、暴露内部数据const  
    emits = defineEmits(['childFn']);
    const  toEmits = () => {  
    //2、触发父组件中暴露的childFn方法并携带数据  
        emits('childFn',name)
    }
</script>

组件代码

<template>
    <div>父组件</div>
    <Child  @childFn='childFn' />
    <p>接收子组件传递的数据{{childData}} </p>
  </template>
  
  <script setup>
  import {ref} from 'vue'
  import Child from './child.vue'
  const childData = ref(null)    
  const childFn=(e)=>{
      consloe.log('子组件触发了父组件childFn,并传递了参数e')
      childData=e.value
  }    
  </script>

[2] defineEmits:子组件调用父组件中的方法

组件代码

<template>
    <div>{{ numb }}</div>
    <button @click="onClickButton">数值加1</button>
      </template >
    <script lang="ts" setup>
      defineProps({
        numb:{
            type:Number,
            default:NaN
              }
          })
      const emit = defineEmits(['addNumb']);
          const onClickButton = ()=>{
        //emit(父组件中的自定义方法,参数一,参数二,...)
        emit("addNumb");
          }
  </script>

组件代码

<template>
    <my-component @addNumb="func" :numb="numb"></my-component>
  </template>
  <script lang="ts" setup>
    import {ref} from 'vue'; 
    const numb = ref(0);
    let func = ()=>{
      numb.value++;
    }
  </script>

(3)defineExpose:子组件暴露属性,可以在父组件中拿到

使用<script setup> 的组件,父组件是无法通过ref 或者 $parent 获取到子组件的ref等响应数据,需要通过defineExpose 主动暴露

组件代码

<script setup>
import { ref } from 'vue'
const a = 1
const b = ref(2)
//主动暴露组件属性
defineExpose({
  a,
  b
})
</script>

组件代码

<template>
    <div>父组件</div>
    <Child  ref='childRef' />
    <button @click='getChildData'>通过ref获取子组件的属性 </button>
  </template>
  <script setup>
  import {ref} from 'vue'
  import Child from './child.vue'
  const childRef= ref()  //注册响应数据  
  const getChildData =()=>{
    //子组件接收暴露出来得值
    console.log(childRef.value.a) //1
    console.log(childRef.value.b) //2  响应式数据
  }    
  </script>

以上就是全部内容,我也只是一个小白,才学一天做个总结而已

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3 父子组件传参详解 的相关文章

  • DOM0和DOM2

    DOM事件绑定 DOM0级事件 特点 所有的浏览器都支持 事件只能注册一次 后面的会覆盖旧的 注册方式 1 在html上添加 div div 其中this指向自身 2 匿名函数d nclick function 其中 this 指向自身 3
  • 美国科技大佬成功之前混得都有多惨

    摘要 超过三分之一在美国成立的顶尖高科技公司是由在国外出生的人创立的 他们的成功经验带动许多移民来到美国实现美国梦的希望 id cproIframe u1503021 2 width 250 height 250 src http pos
  • 使用DBN实现风速预测matlab代码

    使用DBN实现风速预测matlab代码 风速预测在实际生产生活中有着广泛的应用 对于风电场 农业灌溉 城市规划等领域都有着重要的意义 本文将介绍如何使用深度信念网络 Deep Belief Networks DBN 来实现风速预测 并提供相

随机推荐

  • Mysql数据库的导入和导出

    Mysql数据库的导入和导出 1 导入 2 导出 Mysql数据库的可移植性是比较好的 在命令行状态下可用仅仅一行的代码就实现数据库的导入和导出 不论是在Windows操作系统还是Linux操作系统下的命令行 命令基本上完全一致 1 导入
  • QT主窗口与子窗口互相传值笔记

    1 主窗口向子窗口传值 将子窗口定义为主窗口的成员变量 在子窗口中定义接受数据的成员变量 主窗口中可以使用子窗口成员变量来访问他的成员变量 于是就能直接赋值了 void Main wgt test son wgt num 18 2 子窗口向
  • PAT 1015 德才论 (25分) C语言实现

    1015 德才论 25分 宋代史学家司马光在 资治通鉴 中有一段著名的 德才论 是故才德全尽谓之圣人 才德兼亡谓之愚人 德胜才谓之君子 才胜德谓之小人 凡取人之术 苟不得圣人 君子而与之 与其得小人 不若得愚人 现给出一批考生的德才分数 请
  • 将文件或目录移动到另外的目录

    File or directory to be moved File file new File filename Destination directory File dir new File directoryname Move fil
  • Flutter编译卡在Running Gradle task ‘assembleDebug‘

    为什么卡在这一步 把网络断开 发现了问题 卡在了下载运行环境和依赖库的步骤 jcenter 下载速度太慢 知道原因就好办了 需要修改3个地方 1 首先找到fultter sdk所在文件夹的位置 依次进入 flutter packages f
  • 单端口RAM实现FIFO

    RAM分类 单口ram 单端口RAM只有一组数据线和一组地址线 只有一个时钟 读写共用地址线 输出只有一个端口 所以单端口RAM的读写操作不能同时进行 当wea拉高时 会将数据写入对应的地址 同时douta输出的数据与此时写入的数据是一致的
  • STC32G12K128内部集成的I2C总线实现oled12864显示

    STC32G 系列的单片机内部集成了一个 I2C 串行总线控制器 I2C 是一种高速同步通讯总线 通讯使用 SCL 时钟线 和 SDA 数据线 两线进行同步通讯 对于 SCL 和 SDA 的端口分 STC32G 系列的单片机提供了切换模式
  • springboot+mybatisplus 动态切换数据源——数据库(通过AOP获取head参数动态切换)

    写这个博客 是记录一下自己的学习过程 因为网上信息杂乱不清 所以此博客只做记录和分享作用 参考博客链接 https blog csdn net QiuHaoqian article details 120479890 再此基础上修改了一些
  • sqli-labs/Less-30

    首先判断一下是否为数字型注入 输入如下 id 1 id 1 and 1 2 回显如下 正确回显了 说明属于字符型注入 然后在判断是属于单引还是双引 输入1 回显如下 正确回显 再试一试双引号 输入1 回显如下 这告诉我们两件事情 1 这属于
  • Git 命令大全「全面且实用,值得收藏」

    用了这么久的 git 工具 中途也使用过 SourceTree 但是最后发现 还是代码香啊 虽然之前也写过一篇学习笔记 Git教程学习笔记和填坑总结 以及 SourceTree 工具的使用 但是感觉那篇还是笔记冗余 看起来不是很明确 所以
  • 利用docker来部署自己的项目

    在部署自己项目时 开始时一头雾水 如果直接放在服务器上跑 既麻烦又不稳定 后来看到有写采用docker进行项目部署 前后折腾了一天 总算部署上去了 分享出来让大家少走点弯路 整体的流程大概是这样的 首先 准备环境 需要在本地部署docker
  • 在R中线性回归分析的函数是lm()

    在R中线性回归分析的函数是lm 1 一元线性回归 我们可以根据以上数据来分析合金的强度是否与碳含量有关系 首用以下命令把数据读取到R中 x lt c seq 0 10 0 18 by 0 01 0 20 0 21 0 23 y lt c 4
  • JS格式化日期

    JS格式化日期真是件淡疼的事 网上转了半天终于发现有一个挺不错的函数 贴上来做个笔记 时间对象的格式化 Date prototype format function format format yyyy MM dd hh mm ss var
  • cmake命令之使用静态库(include_directories,link_directories,target_link_directories)

    include directories的命令形式如下 include directories AFTER BEFORE SYSTEM dir1 dir2 link directories的命令形式如下 link directories AF
  • Data collection (imaging)

    Now that we ve talked about sample prep let s talk about imaging 0 05 In a single particle project the images can either
  • LeetCode左程云算法课笔记

    左程云算法课笔记 剑指Offer 位运算 运算符理解 寻找出现双中的单数 取出一个数最右边1的位置 找所有双出现中的两个单数 整数二进制奇数位偶数位交换 数组中全部出现k次返回出现一次的数 链表 判读链表元素是否回文 利用栈结构 利用栈结构
  • 解决VS打不开xxx.ui文件,xxx.ui无法打开文件

    目录 场景复现 解决方案 场景复现 在使用vs进行开发时 居然无法打开qt的ui文件 这本质上是因为找不到designer exe的路径 解决方案 1 右击ui文件 然后选择打开方式 2 点击右侧的添加按钮 3 点击程序后面的 按钮选择合适
  • PCIe专题学习——4.0(物理层结构解析)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • Java相关注解

    标题 TableField Mybatis plus使用注解 TableField exist false 注明非数据库字段属性 TableField exist false 注解加载bean属性上 表示当前属性不是数据库字段 但项目中必须
  • vue3 父子组件传参详解

    前言 我引用了大佬的文章 但我实在找不到网址链接了 我记录在笔记上的 如果大佬看见了 麻烦给我说一下 我注明一下出处 建议先看son vue 里面写了那三种方式 首先放一个我的demo defineProps什么的父子传参api不用引入 直