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

情景说明

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

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

主要问题有两个 :
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>

运行效果 :

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android--UML类图使用详解

明敕星驰封宝剑&#xff0c;辞君一夜取楼兰 一&#xff0c;定义 类图(Class diagram)是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分…

Elasticsearch:相关性工作台 - BM25 及 ELSER 的相关性比较

我们知道 Elastics Learned Sparse EncoderR (ELSER) 可以被用来做语义搜索。它是一个 out-of-domain 的语义搜索模型。无需训练&#xff0c;我们就可以得到很好的相关性。有关 ELSER 的更多知识&#xff0c;请参考文章 “Elastic Learned Sparse Encoder 简介&#xff1a;Elas…

力扣题目学习笔记(OC + Swift) 12. 整数转罗马数字

12. 整数转罗马数字 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1。12 写做 XI…

el-date-picker 选择一个或多个日期

el-date-picker可选择多个日期 type“dates” 加个s即可 <div><span>el-date-picker选择多个日期</span><el-date-pickertype"dates"v-model"dateList"placeholder"选择一个或多个日期"></el-date-picker></di…

【1.6计算机组成与体系结构】存储系统

目录 1.层次化存储结构2.Cache2.1 Cache的介绍2.2 局部性原理2.3 Cache应用 1.层次化存储结构 由 ⬆ CPU&#xff1a;寄存器。 快 ⬆ Cache&#xff1a;按内容存取(相联存储器)。 到 ⬆内存&#xff08;主存&#xff09;&#xff1a;DRAM。 慢 ⬆ 外存&#xff08;辅存&#…

2024年20多个最有创意的AI人工智能点子

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 探索 2024 年将打造的 20 个基于人工智能产品的盈利创意 &#x1f525;&#x1f525;&#x1f525; 直到最近&#xff0c;企业对人工智能还不感兴趣&#xff0c;但…

【云原生kubernets】Pod详解

一、Pod介绍 1.1.概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的State…

算法-----全排列

目录 前言 代码 思路 我的其他博客 前言 全排列是一种组合数学的概念&#xff0c;它表示将一组元素按照一定顺序进行排列的所有可能情况。在计算机编程中&#xff0c;通常使用递归来实现全排列。以下是使用Java语言实现全排列的详细解释&#xff1a; 代码 public class Pe…

【Spring】07 懒加载

文章目录 1.定义2. 作用3. 配置方式1&#xff09;XML配置2&#xff09;Java配置3&#xff09;注解方式 4. 应用场景5. 注意事项总结 1.定义 懒加载&#xff08;Lazy Initialization&#xff09;是Spring 框架中的一项强大的特性&#xff0c;它允许我们推迟 Bean 的初始化&…

Java EE 多线程之 JUC

文章目录 1. Callable 接口2. ReentrantLock3. 信号量4. CountDownLatch JUC这里就是指&#xff08;java.util.concurrent&#xff09; concurrent 就是并发的意思 这个包里的内容&#xff0c;主要就是一些多线程相关的组件 1. Callable 接口 Callable 也是一种创建线程的方式…

大数据技术14:FlinkCDC数据变更捕获

前言&#xff1a;Flink CDC是Flink社区开发的flink-cdc-connectors 组件&#xff0c;这是⼀个可以直接从 MySQL、PostgreSQL 等数据库直接读取全量数据和增量变更数据的 source 组件。 https://github.com/ververica/flink-cdc-connectors 一、CDC 概述 CDC 的全称是 Change …

overleaf 加载pdf格式的矢量图时,visio 图片保存为pdf格式,如何确保pdf页面大小和图片一致

Overleaf支持多种矢量图形格式&#xff0c;其中一些常见的包括&#xff1a; PDF&#xff08;Portable Document Format&#xff09;&#xff1a; PDF是一种常见的矢量图形格式&#xff0c;Overleaf可以直接加载和显示PDF文件。许多绘图工具和LaTeX生成的图形都可以导出为PDF格式…

SCI期刊投稿的不同状态

投稿过程中的不同状态代表了稿件的不同处理阶段 1. Submitted to Journal 已提交至期刊 刚投稿成功&#xff0c;邮箱会收到确认信件&#xff0c;等待编辑处理稿件&#xff0c;这个状态自然形成&#xff0c;无需作者处理。 2. Awaiting admin processing 等待管理员处理 文…

《使用ThinkPHP6开发项目》 - ThinkPHP6使用使用中间件验证登录Token

https://blog.csdn.net/centaury32/article/details/134997438 按照https://blog.csdn.net/centaury32/article/details/134999029的方法验证登录Token&#xff0c;那么每一步都需要写同样一段代码&#xff0c;这里可以结合中间件进行验证 一、创建中间件&#xff1a;php thi…

【2023-12-14】 最新瑞幸咖啡小程序-blackbox

需要联系主页V 瑞幸咖啡小程序 登入需要过同盾滑块下单需要balckbox参数 测试 下单 过滑块 登入发短信 加密参数

云仓酒庄带您品法国葡萄酒

说起葡萄酒肯定绕不开法国&#xff0c;法国葡萄酒闻名中外&#xff0c;口碑卓越。作为世界上的产酒大国&#xff0c;可以说是每一寸土地都可以种植葡萄。云仓酒庄的品牌雷盛红酒分享这么优秀的一个葡萄酒产酒国有哪些特点呢&#xff1f; 1.产区特色&#xff1a;波国有最著名的…

首发卡密引流系统源码

程序特色&#xff1a; 支持个人和企业小程序广告获取卡密。 支持短视频点赞和关注获取卡密。 搭建教程&#xff1a; 环境要求&#xff1a;Nginx、MySQL 5.6、PHP 5.6 步骤&#xff1a; 将压缩包解压至网站根目录。 打开域名/install&#xff0c;按照提示填写数据库信息进行…

常见数据结构

数据结构概述 数据结构是计算机底层存储、组织数据的方式&#xff0c;是指数据相互之间是以什么方式排列在一起的。 通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。 栈 栈数据结构的执行特点&#xff1a;后进先出&#xff0c;先进后出。 栈模型…

P with Spacy:自定义文本分类管道

一、说明 Spacy 是一个功能强大的 NLP 库&#xff0c;其中许多 NLP 任务&#xff08;如标记化、词干提取、词性标记和命名实体解析&#xff09;均通过预训练模型提供开箱即用的功能。所有这些任务都由管道对象以及逐步应用于给定文本的不同函数的内部抽象来包装。该管道可以通过…

Kubernetes 容器编排(2)

可视化部署 官方Dashboard 部署Dashboard # kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml # kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard # 注意将 type: ClusterIP 改为 type: NodePo…