Vue3-20-组件-父组件给子组件传值

news2024/9/24 17:11:08

情景说明

当父组件使用子组件的时候,
我们可能会需要将某些父组件的变量值 传递 给 子组件,在子组件中进行使用。

此时就有一个 【父组件】传值给【子组件】的动作。
这就是本文我们要讨论的问题。

主要问题有两个 :
1、【子组件】 如何接收值
2、【父组件】如何发送值

传值的方式介绍

vue 中提供了一个props 的属性,用来作为【子组件】中接收【父组件】传递过来的值。
props 这个属性 的定义,是通过一个叫做 defineProps() 的东西来操作的.
defineProps() 这个东西不需要引入,可以直接在<script setup>使用。

props 的三种声明方式

对于子组件中的props的声明方式有三种:
1、字符串数组的格式;【一般来讲,这种写法比较简单,感觉会比较常用】
2、对象的格式;
3、ts 语法的类型标注 来声明 (也算是对象格式的吧)

字符串数组的格式

<script setup lang="ts">

    // 声明 props : 字符串数组的格式
    const propsList = defineProps(['titleName','titleContent'])
    // 控制台打印一下
    console.log('titleName : ',propsList.titleName)
    console.log('titleContent : ',propsList.titleContent)

</script>

对象的格式

注意 :
使用对象格式的时候,是需要用 key-value 键值对的方式进行定义;
key: 就是 定义的 属性值;
value: 需要是 预期的属性的类型的构造函数,如 【number】 类型的话,就是 【Number】

<script setup lang="ts">

    // 声明 props - 对象格式
    const propsList = defineProps({
        titleName:String, // 注意此处的value 值是 对象类型的构造方法
        titleContent:String,
        titleNum:Number
    })


    // 控制台打印一下
    console.log('titleName : ',propsList.titleName)
    console.log('titleContent : ',propsList.titleContent)
    console.log('titleNumber : ',propsList.titleNum)

</script>
    

类型标注的格式

ts 中类型标注的写法,就像是 泛型的写法一样,也可以使用自定义接口的方式。

写法一 :直接写


<script setup lang="ts">

    // 声明 props - ts 类型标注的 - 就像是泛型类型的写法
    const propsList = defineProps<{
        titleName:string,
        titleContent:string,
        titleNum:number
    }>()

    // 控制台打印一下
    console.log('titleName : ',propsList.titleName)
    console.log('titleContent : ',propsList.titleContent)
    console.log('titleNumber : ',propsList.titleNum)

</script>

写法二 :定义接口

   
<script setup lang="ts">

    // 声明 props - ts 类型标注的 - 就像是泛型类型的写法

    // 定义一个接口
    interface MyProps  {
        titleName:string,
        titleContent:string,
        titleNum:number
    }
    // 通过接口的方式声明 props
    const propsList = defineProps<MyProps>()


    // 控制台打印一下
    console.log('titleName : ',propsList.titleName)
    console.log('titleContent : ',propsList.titleContent)
    console.log('titleNumber : ',propsList.titleNum)
    
</script>

props 的传递值写法

【父组件】引入【子组件】之后,通过 【属性的方式】 给子组件传递 在 【props】中定义的内容。

传值有两大类 :静态传值、动态传值(用的较多)。
静态传值 :直接写一个静态的值传递过去;
动态传值 :将父组件的一个变量传递过去,此时父组件的变量发生了变化,子组件接收到的也会随之发生改变。
【注意点】
		1、【父组件】给【子组件】传值,这个行为是单向进行的,即,子组件不能通过 props 来向父组件传值;
		
		2、因为这个传值的动作是单项的,因此,不建议在子组件中 直接修改 props 的值,
		   如果想对props的值进行修改后再使用,推荐通过“计算属性”的方式进行操作。
		   
		3、在【父组件】中传值的时候,推荐使用 “中划线”的格式进行属性的赋值,
		    如 “ title-name = 'abc' ”,这样更加的符合JavaScript的语法规范吧。

定义一个子组件准备接收值

本案例的写法是通过 【自定义接口】的方式声明 props 的

<template>

    <!-- 子组件 -->
    <div class="childdiv">
        
        子组件 - titleName : {{ propsList.titleName }}
        <br>
        子组件 - titleNumber : {{ propsList.titleNum }}
        <br>
        子组件 - titleShow : {{ propsList.titleShow }}
        <br>
        子组件 - titleList : {{ propsList.titleList }}

    </div>
    
</template>
    
<script setup lang="ts">

    import { ref } from 'vue'

    // 声明一个变量
    const msg = ref('这是子组件的msg变量')

    // 声明 props - ts 类型标注的 - 就像是泛型类型的写法

    // 定义一个接口
    interface MyProps  {
        titleName:string,  // 字符串类型
        titleNum:number,   // 数字类型
        titleShow:boolean, // 布尔类型
        titleList:number[] // 数组类型
    }
    // 通过接口的方式声明 props
    const propsList = defineProps<MyProps>()


    // 控制台打印一下
    console.log('titleName : ',propsList.titleName)
    console.log('titleNumber : ',propsList.titleNum)
    console.log('titleShow : ',propsList.titleShow)
    console.log('titleList : ',propsList.titleList)

</script>
    
<style scoped>

    .childdiv{
        width: 300px;
        border: 1px solid green;
    }

</style>

父组件向子组件传值

写法一 : 静态传值

简单来说,这种写法就是直接给属性赋值。
这种方式除了 字符串 类型的属性,其他的类型在传值的时候都需要添加 【:】才可以,否则会提示错误!

<template>

    
    <div class="basediv">
      
        父组件msg : {{ msg }}

        <br>
        <br>
        <!-- 子组件的使用 -->

        <!-- 直接给子组件传递静态的值过去,使用中划线的方式 -->
        <ChildComponent title-name="abcd"  
        			:title-num="1024" 
        			:title-show="true"
        			:title-list="[100,99,88]"/>
        
    </div>
    
  
</template>
    
<script setup lang="ts">

    import { ref } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'

    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')

</script>
    
<style scoped>

    .basediv{
        width: 400px;
        height: 200px;
        border: 1px solid red;
    }
</style>

运行效果:

在这里插入图片描述

写法二 : 动态传值

动态传值,就是 把 【父组件】中的变量传递给【子组件】
这种写法的时候,就需要 所有的属性都要在前面添加 【:】了,表示是动态绑定的。

<template>

    <div class="basediv">
      
        父组件msg : {{ msg }}

        <br>
        <br>
        <!-- 子组件的使用 -->

        <!-- 动态传值的方式给 【子组件】传值 -->
        <ChildComponent :title-name="propsValueObj.titleName"  
                        :title-num="propsValueObj.titleNum" 
                        :title-show="propsValueObj.titleShow" 
                        :title-list="propsValueObj.titleList"/>
        
    </div>
    
</template>
    
<script setup lang="ts">

    import { ref } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'

    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')

    const num = ref(4001)

    // 声明一个对象,用来传递给子组件
    const propsValueObj = ref({
        titleName:'父组件传过去的值',
        titleNum:2000,  
        titleShow:false, 
        titleList:[1,2,3,4,5]
    })

</script>
    
<style scoped>

    .basediv{
        width: 400px;
        height: 200px;
        border: 1px solid red;
    }
</style>

运行效果:

在这里插入图片描述

写法三 : 直接传一个对象

这种写法实际上是对 【写法二】的一种扩展,
传值时不指定属性名,而是直接使用 v-bind 指令 把整个对象传进去,
此时组要注意的是,传递的对象的属性名 需要和 【子组件】中接收的属性名一致,这样才能对应起来。

<template>

    <div class="basediv">
      
        父组件msg : {{ msg }}

        <br>
        <br>
        <!-- 子组件的使用 : 直接传递一个对象过去 -->
        <ChildComponent v-bind="propsValueObj"/>
        
    </div>
   
</template>
    
<script setup lang="ts">

    import { ref } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'

    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')

    // 声明一个对象,用来传递给子组件
    const propsValueObj = ref({
        titleName:'父组件直接传了个对象',
        titleNum:20,  
        titleShow:true, 
        titleList:[100,200,3,4,5]
    })

</script>
    
<style scoped>

    .basediv{
        width: 400px;
        height: 200px;
        border: 1px solid red;
    }
</style>

运行效果 :

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zoho Desk与Zendesk详细对比:热门在线客服系统之争

企业需要一款功能强大且丰富的客服系统产品为其解决客户服务的难题。对于了解过Zendesk的企业来讲&#xff0c;可能会考虑到还有哪些产品可供选择&#xff0c;便于对比选择出更合适的产品。这篇文章就为大家展现了一款和Zendesk功能相似的产品——Zoho Desk&#xff0c;在功能、…

辅助电源交流220V转5V200mA输出,不需要变压器

辅助电源交流220V转5V200mA输出&#xff0c;不需要变压器。 在当今智能家居、小家电等电子产品日益普及的时代&#xff0c;对辅助电源的需求也越来越大。一款高效、低成本、小巧封装的辅助电源芯片成为众多产品的迫切需求。今天&#xff0c;我们将为您介绍一款交流220V转5V200m…

CDN初学习

目录 1、CDN是什么 2、CDN管理中心 3、CDN 的工作原理 4、如何保证CDN的内容缓存和分发的可靠性&#xff1f; 5、cdn的应用场景 6、使用CDN服务时&#xff0c;需要注意哪些问题&#xff1f; 1、CDN是什么 CDN是Content Delivery Network的缩写&#xff0c;也被称为内容分…

接口测试 — 4.Requests库GET、Post请求

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。 &#xff08;不带参数的GET请求请看上一篇文章的练习&#xff09; 1、Requests库待参数的GET请求 使用Get方法带参数请求时&#xff0c;是params参数字典&#xff0c;而不是data参数字典。data参数字典…

【Pytorch】Transposed Convolution

文章目录 1 卷积2 反/逆卷积3 MaxUnpool / ConvTranspose4 encoder-decoder5 可视化 学习参考来自&#xff1a; 详解逆卷积操作–Up-sampling with Transposed Convolution PyTorch使用记录 https://github.com/naokishibuya/deep-learning/blob/master/python/transposed_co…

DDD、SOA、微服务和微内核

DDD、SOA、微服务和微内核&#xff0c;看到经常有人把这几个概念拿出来一起讲。事实上&#xff0c;DDD和其他三个不是一个维度的东西。 DDD其实特别好理解&#xff0c;DDD就是领域来驱动设计嘛&#xff0c;是一种设计思想。很容易又和OOA、OOD和OOP来比较了。这个回头再说。 SO…

世微 AP9166 DC-DC降压IC 18V 2A同步降压转换器

600KHz&#xff0c;18V&#xff0c;2A同步降压转换器 概述 AP9166是一款完全集成的效率2A同步整流降压转换器。AP9166运行在宽输出电流上以高效率 负载范围。此设备提供两个操作模式、PWM控制和PFM模式切换控制&#xff0c;允许更宽范围的高效率 负载AP9166至少需要现成标准的…

JVM的内存分区以及垃圾收集

1.JVM的内存分区 1.1方法区 方法区(永久代&#xff09;主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 1.2虚拟机栈 虚拟机栈也就是我们平时说的栈内存&#xff0c;它是为java方法服务的。每个方法在执行的…

mysql踩坑

关于安装 1报错&#xff1a;ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client具体代码如下&#xff1a; import mysql from "mysql"//连接数据库 const dbmysql.createPool({h…

计算机视觉技术在智慧城市建设中的应用

计算机视觉技术在智慧城市建设中的应用 随着城市化进程的不断推进&#xff0c;更多的人们选择在城市生活、工作和娱乐。面对快速增长的人口和日益复杂的城市环境&#xff0c;很多城市开始探索智慧城市的建设。智慧城市的核心就是将现代信息技术应用于城市管理中&#xff0c;以…

gitlab下载,离线安装

目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考&#xff1a; 1.下载 根据服务器操作系统版本&#xff0c;下载对应的RPM包。 gitlab官网&#xff1a; The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…

阿里云人工智能平台PAI多篇论文入选EMNLP 2023

近期&#xff0c;阿里云人工智能平台PAI主导的多篇论文在EMNLP2023上入选。EMNLP是人工智能自然语言处理领域的顶级国际会议&#xff0c;聚焦于自然语言处理技术在各个应用场景的学术研究&#xff0c;尤其重视自然语言处理的实证研究。该会议曾推动了预训练语言模型、文本挖掘、…

vue中element-ui日期选择组件el-date-picker 清空所选时间,会将model绑定的值设置为null 问题 及 限制起止日期范围

一、问题 在Vue中使用Element UI的日期选择组件 <el-date-picker>&#xff0c;当你清空所选时间时&#xff0c;组件会将绑定的 v-model 值设置为 null。这是日期选择器的预设行为&#xff0c;它将清空所选日期后将其视为 null。但有时后端不允许日期传空。 因此&#xff…

Java 线程运行方法和原理

线程运行 原理 栈与栈帧&#xff1a; Java 虚拟机栈会为每个启动的线程分配一块栈内存&#xff0c;其中存储着栈帧&#xff08;Frame&#xff09; 每个栈由多个栈帧组成&#xff0c;栈帧对应调用方法&#xff08;函数&#xff09;所占用的内存每个栈只有一个活动栈&#xf…

羊大师解读,血压波动

羊大师解读&#xff0c;血压波动 血压是身体健康的一个重要指标&#xff0c;但有时候我们会发现血压存在着波动的情况。血压波动的原因有很多&#xff0c;包括生活方式、遗传因素、药物影响等等。本文小编羊大师将为大家详细介绍血压波动的原因&#xff0c;以及预防和管理血压…

无脑利用API实现文心一言AI对话功能?(附代码)

前言&#xff1a;在当今数字化的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正在不断演进&#xff0c;为开发者提供了丰富的工具和资源。其中&#xff0c;API&#xff08;应用程序接口&#xff09;成为构建强大AI应用的关键组成部分之一。本文将介绍如何利用API来…

git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支

GIT | 分支 文章目录 GIT | 分支创建分支合并分支删除分支合并冲突分支管理策略bug分支强制删除分支 创建分支 查看当前本地仓库中有哪些分支 git branchHEAD所指向的分支就是当前正在工作的分支 cat .git/HEAD创建一个分支 git branch dev创建好了&#xff0c;但是目前还是…

计算机组成原理—中央处理器CPU

文章目录 CPU的功能与架构CPU的组成运算器控制器 指令执行过程指令流程指令执行方案 数据通路单总线结构专用通路结构 硬布线控制器设计硬布线执行流程硬布线CU内部怎么设计微操作的组合电路 总结 微程序控制器设计微程序的基本理念微程序的基本结构 微指令设计微程序CU设计 指…

使用代理IP时的并发请求是什么意思?

很多做过数据采集的技术们应该都有所了解&#xff0c;在选择代理IP时会有一个并发请求的参数&#xff0c;这个参数是什么意思呢&#xff1f;可能有很多新手不是很了解&#xff0c;其实代理IP的并发请求就是指同时发送多个请求到目标服务器&#xff0c;以提高请求的效率和速度。…

嵌入式系统挑战赛题目---递归方法实现字符串反转函数

一、题目要求 递归函数是一种在函数内容调用自身的函数。它通过将复杂的问题分解成更小的子问题来解决。递归函数通常包含两部分&#xff1a;基本情况和递归调用。请使用递归方法实现字符串反转的C语言函数。 请根据要求在begin、end间完成代码&#xff0c;不要改变代码中其他…