Vue3中props传参(多种数据类型传参方式)

在Vue3中,`props`接收的`type`类型有以下几种:

1. String:字符串类型

2. Number:数字类型

3. Boolean:布尔类型

4. Array:数组类型

5. Object:对象类型

6. Date:日期类型

7. Function:函数类型

8. Symbol:符号类型

9. [Custom Types]:自定义类型

你也可以使用数组形式来表示多种类型的组合,

比如`[String, Number]`表示接收字符串或数字类型的值。

另外,你还可以使用`null`或`undefined`来表示接收任意类型的值。

注意:以上是常见的`type`类型列表,你也可以自定义其它类型。

`props` 还有两个参数:

default: 默认值

required: 是否必传, true必传,false 非必传

开启必传时 若不传则警告[Vue warn]: Missing required prop: "xxx"

父组件代码(测试默认值):

<template><div style="font-size: 14px"><h3>测试props传参常见的数据类型</h3><Child :message="message" /><!--:count="count":isActive="isActive":list="list":user="user":date="date":callback="callback--></div>
</template><script lang="ts">
import {defineComponent,reactive,onMounted,toRefs
} from 'vue'
import Child from './Child.vue'
// vue3.0语法
export default defineComponent({name: '父组件名',components: {Child,},setup() {// 在Vue3中,`props`接收的`type`类型有以下几种:// 1. String:字符串类型// 2. Number:数字类型// 3. Boolean:布尔类型// 4. Array:数组类型// 5. Object:对象类型// 6. Date:日期类型// 7. Function:函数类型// 8. Symbol:符号类型// 9. [Custom Types]:自定义类型// 你也可以使用数组形式来表示多种类型的组合,// 比如`[String, Number]`表示接收字符串或数字类型的值。// 另外,你还可以使用`null`或`undefined`来表示接收任意类型的值。// 注意:以上是常见的`type`类型列表,你也可以自定义其它类型。const state = reactive({date: new Date(1998, 12, 31),message: 'Hello World',count: 666,isActive: true,list: [1, 2, 3],user: {name: '张三',age: 18,},callback: () => {console.log('父组件传入的callback执行了')},})onMounted(() => {//})return {...toRefs(state),}},
})
</script>

子组件代码:

<template><div style="font-size: 14px"><!-- 子组件内容 --><p>message: {{ message }}</p><p>count: {{ count }}</p><p>isActive: {{ isActive }}</p><p>list: {{ list }}</p><p v-for="(item,index) in list" :key="index">{{ item }}</p><p>date: {{ date }}</p><p>user: {{ user }}</p><button @click="callback">callback按钮(调用父组件函数)</button></div>
</template><script lang="ts">
import { defineComponent, onMounted } from 'vue'
// vue3.0语法
export default defineComponent({name: '子组件名',props: {message: {type: String, // type 类型required: true, // required 是否必传, true必传 若不传则警告[Vue warn]: Missing required prop: "message"},count: {type: Number,default: 0, // default 默认值},isActive: {type: Boolean,default: false,},list: {type: Array,default: () => [],},date: {type: Date,default: () => new Date(),},user: {type: Object,default: () => ({ name: 'John Doe', email: 'johndoe@mail.com' }),},callback: {type: Function,default: () => {},},},setup(props) {onMounted(() => {console.log('props', props)})return {//}},
})
</script>

页面数据显示效果(只传了必填项message):

可以看到,接收到的props只有message是父组件传来的值,而子组件显示的其它值都是定义在default里的默认值,点击callback按钮(调用父组件函数)也是没有任何反应的。

修改父组件代码(将各种数据类型传入):

<template><div style="font-size: 14px"><h3>测试props传参常见的数据类型</h3><Child:message="message":count="count":is-active="isActive":list="list":user="user":date="date":callback="callback"/><!-- 两种命名方式都可以:is-active="isActive":isActive="isActive"--></div>
</template><script lang="ts">
import {defineComponent,reactive,onMounted,toRefs
} from 'vue'
import Child from './Child.vue'
// vue3.0语法
export default defineComponent({name: '父组件名',components: {Child,},setup() {// 在Vue3中,`props`接收的`type`类型有以下几种:// 1. String:字符串类型// 2. Number:数字类型// 3. Boolean:布尔类型// 4. Array:数组类型// 5. Object:对象类型// 6. Date:日期类型// 7. Function:函数类型// 8. Symbol:符号类型// 9. [Custom Types]:自定义类型// 你也可以使用数组形式来表示多种类型的组合,// 比如`[String, Number]`表示接收字符串或数字类型的值。// 另外,你还可以使用`null`或`undefined`来表示接收任意类型的值。// 注意:以上是常见的`type`类型列表,你也可以自定义其它类型。const state = reactive({date: new Date(1998, 12, 31),message: 'Hello World',count: 666,isActive: true,list: [1, 2, 3],user: {name: '张三',age: 18,},callback: () => {console.log('父组件传入的callback执行了')},})onMounted(() => {//})return {...toRefs(state),}},
})
</script>

页面数据显示效果(各种数据类型传入了):

可以看到数据将以父组件传入的值为准,default的值被覆盖。点击callback按钮(调用父组件函数)也执行了。

踩坑小案例:

案例:父组件的数据是从接口异步请求来的 ,而子组件是会先挂载的,如果子组件接受的值是从父组件的接口里取来的,想在子组件onMounted的时候拿到这个数据来发请求却没拿到。

修改代码(看下案例):

父组件代码

<template><div style="font-size: 14px"><h3>测试props传参常见的数据类型</h3><Child:id="id":message="message":count="count":is-active="isActive":list="list":user="user":date="date":callback="callback"/><!-- 两种命名方式都可以:is-active="isActive":isActive="isActive"--></div>
</template><script lang="ts">
import {defineComponent,reactive,onMounted,toRefs
} from 'vue'
import Child from './Child.vue'
// vue3.0语法
export default defineComponent({name: '父组件名',components: {Child,},setup() {// 在Vue3中,`props`接收的`type`类型有以下几种:// 1. String:字符串类型// 2. Number:数字类型// 3. Boolean:布尔类型// 4. Array:数组类型// 5. Object:对象类型// 6. Date:日期类型// 7. Function:函数类型// 8. Symbol:符号类型// 9. [Custom Types]:自定义类型// 你也可以使用数组形式来表示多种类型的组合,// 比如`[String, Number]`表示接收字符串或数字类型的值。// 另外,你还可以使用`null`或`undefined`来表示接收任意类型的值。// 注意:以上是常见的`type`类型列表,你也可以自定义其它类型。const state = reactive({id: '',date: new Date(1998, 12, 31),message: '',count: 666,isActive: true,list: [1, 2, 3],user: {name: '张三',age: 18,},callback: () => {console.log('父组件传入的callback执行了')},})onMounted(() => {// 模拟一个接口请求setTimeout(() => {state.id = '父组件请求接口得来的id'}, 3000)})return {...toRefs(state),}},
})
</script>

子组件代码:

<template><div style="font-size: 14px"><!-- 子组件内容 --><p>message: {{ message }}</p><p>count: {{ count }}</p><p>isActive: {{ isActive }}</p><p>list: {{ list }}</p><p v-for="(item,index) in list" :key="index">{{ item }}</p><p>date: {{ date }}</p><p>user: {{ user }}</p><button @click="callback">callback按钮(调用父组件函数)</button></div>
</template><script lang="ts">
import { defineComponent, onMounted } from 'vue'
// vue3.0语法
export default defineComponent({name: '子组件名',props: {id: {type: String, // type 类型required: true, // required 是否必传, true必传 若不传则警告[Vue warn]: Missing required prop: "message"},message: {type: String, // type 类型required: true, // required 是否必传, true必传 若不传则警告[Vue warn]: Missing required prop: "message"},count: {type: Number,default: 0, // default 默认值},isActive: {type: Boolean,default: false,},list: {type: Array,default: () => [],},date: {type: Date,default: () => new Date(),},user: {type: Object,default: () => ({ name: 'John Doe', email: 'johndoe@mail.com' }),},callback: {type: Function,default: () => {},},},setup(props) {onMounted(() => {console.log('props', props)console.log('props.id:', props.id)// 想拿到id后请求接口// axios.get('props.id').then(res => {//   console.log(res)// })})return {//}},
})
</script>

案例显示效果(取不到id):

父组件请求接口的数据最终会在子组件更新,但是想在onMounted里使用却是拿不到的,因为接口还没请求完成,没拿到该数据,我们来尝试解决这个问题。

解决方案1(v-if):

修改父组件代码:

<template><div style="font-size: 14px"><h3>测试props传参常见的数据类型</h3><Childv-if="id":id="id":message="message":count="count":is-active="isActive":list="list":user="user":date="date":callback="callback"/><!-- 两种命名方式都可以:is-active="isActive":isActive="isActive"--></div>
</template><script lang="ts">
import {defineComponent,reactive,onMounted,toRefs
} from 'vue'
import Child from './Child.vue'
// vue3.0语法
export default defineComponent({name: '父组件名',components: {Child,},setup() {// 在Vue3中,`props`接收的`type`类型有以下几种:// 1. String:字符串类型// 2. Number:数字类型// 3. Boolean:布尔类型// 4. Array:数组类型// 5. Object:对象类型// 6. Date:日期类型// 7. Function:函数类型// 8. Symbol:符号类型// 9. [Custom Types]:自定义类型// 你也可以使用数组形式来表示多种类型的组合,// 比如`[String, Number]`表示接收字符串或数字类型的值。// 另外,你还可以使用`null`或`undefined`来表示接收任意类型的值。// 注意:以上是常见的`type`类型列表,你也可以自定义其它类型。const state = reactive({id: '',date: new Date(1998, 12, 31),message: '',count: 666,isActive: true,list: [1, 2, 3],user: {name: '张三',age: 18,},callback: () => {console.log('父组件传入的callback执行了')},})onMounted(() => {// 模拟一个接口请求setTimeout(() => {state.id = '父组件请求接口得来的id'}, 3000)})return {...toRefs(state),}},
})
</script>

解决方案1(v-if)页面效果

在使用子组件的标签上加上<Child v-if="id"/>,没有拿到id时子组件并不会渲染,当然接口如果过慢的话子组件也会渲染更慢。

解决方案2(父组件不加v-if,子组件用watchEffect):

父组件代码:

<template><div style="font-size: 14px"><h3>测试props传参常见的数据类型</h3><Child:id="id":message="message":count="count":is-active="isActive":list="list":user="user":date="date":callback="callback"/><!-- 两种命名方式都可以:is-active="isActive":isActive="isActive"--></div>
</template><script lang="ts">
import {defineComponent,reactive,onMounted,toRefs
} from 'vue'
import Child from './Child.vue'
// vue3.0语法
export default defineComponent({name: '父组件名',components: {Child,},setup() {// 在Vue3中,`props`接收的`type`类型有以下几种:// 1. String:字符串类型// 2. Number:数字类型// 3. Boolean:布尔类型// 4. Array:数组类型// 5. Object:对象类型// 6. Date:日期类型// 7. Function:函数类型// 8. Symbol:符号类型// 9. [Custom Types]:自定义类型// 你也可以使用数组形式来表示多种类型的组合,// 比如`[String, Number]`表示接收字符串或数字类型的值。// 另外,你还可以使用`null`或`undefined`来表示接收任意类型的值。// 注意:以上是常见的`type`类型列表,你也可以自定义其它类型。const state = reactive({id: '',date: new Date(1998, 12, 31),message: '',count: 666,isActive: true,list: [1, 2, 3],user: {name: '张三',age: 18,},callback: () => {console.log('父组件传入的callback执行了')},})onMounted(() => {// 模拟一个接口请求setTimeout(() => {state.id = '父组件请求接口得来的id'}, 3000)})return {...toRefs(state),}},
})
</script>

子组件代码

<template><div style="font-size: 14px"><!-- 子组件内容 --><p>message: {{ message }}</p><p>count: {{ count }}</p><p>isActive: {{ isActive }}</p><p>list: {{ list }}</p><p v-for="(item,index) in list" :key="index">{{ item }}</p><p>date: {{ date }}</p><p>user: {{ user }}</p><button @click="callback">callback按钮(调用父组件函数)</button></div>
</template><script lang="ts">
import { defineComponent, onMounted, watchEffect } from 'vue'
// vue3.0语法
export default defineComponent({name: '子组件名',props: {id: {type: String, // type 类型required: true, // required 是否必传, true必传 若不传则警告[Vue warn]: Missing required prop: "message"},message: {type: String, // type 类型required: true, // required 是否必传, true必传 若不传则警告[Vue warn]: Missing required prop: "message"},count: {type: Number,default: 0, // default 默认值},isActive: {type: Boolean,default: false,},list: {type: Array,default: () => [],},date: {type: Date,default: () => new Date(),},user: {type: Object,default: () => ({ name: 'John Doe', email: 'johndoe@mail.com' }),},callback: {type: Function,default: () => {},},},setup(props) {onMounted(() => {console.log('onMounted props', props)console.log('onMounted props.id:', props.id)// 想拿到id后请求接口// axios.get('props.id').then(res => {//   console.log(res)// })})watchEffect(() => {console.log('watchEffect', props.id)if (props.id) {// 想拿到id后请求接口// axios.get('props.id').then(res => {//   console.log(res)// })}})return {//}},
})
</script>

解决方案2watchEffect的页面显示效果:

可以看到子组件的页面依然会先挂载渲染,onMounted虽然拿不到值,但是可以在watchEffect里检测到id有值了再做请求就行了。当然有其它的解决方案也欢迎评论区留言交流。

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

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

相关文章

第二证券:燃料电池产业进入发展快车道 多家公司披露布局进展

据悉&#xff0c;日前太原钢铁&#xff08;集团&#xff09;有限公司初次开发出超级超纯铁素体TFC22-X连接体材料并结束了批量供货&#xff0c;填补了国内空白。 燃料电池电堆连接体材料是行业中最为要害的战略材料。研发团队打破了特别元素含量精确操控的要害技术瓶颈&#x…

【智能算法】基于黄金正弦和混沌映射思想的改进减法优化器算法

减法优化器&#xff08;Subtraction-Average-Based Optimizer&#xff0c;SABO&#xff09;是2023年刚出的智能优化算法。目前知网中文期刊基本搜不到&#xff0c;并且可以遇见未来一年文章也很少。SABO算法原理简单&#xff0c;算上初始化粒子&#xff0c;总共不超过6个公式。…

AI 学习笔记(持续更新)

What is AI PS &#xff1a;代码块里的统一是 gpt4 回复 在大模型中 1 b 10 亿参数的含义 AI 目前是什么&#xff1f; 目前的人工智能&#xff08;AI&#xff09;是指使计算机和机器能够模仿人类智能的技术&#xff0c;包括学习、推理、解决问题、知觉、语言理解等能力。A…

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control 个人理解思考基本信息摘要背景挑战方法结果 引言方法论结果讨论引用 个人理解 通过将caption的注意力图注入到目标caption注意力中影响去噪过程以一种直观和便于理解的形式通过修改交叉注意力的…

界限与不动产测绘乙级申请条件

整理一期关于测绘资质界限与不动产测绘乙级资质的申请要求 测绘资质是由测绘资质主管部门自然资源部制定的 想要了解标准、正规的申请条件&#xff0c;可以到当地省份的政务网搜索测绘资质办理相关标准&#xff08;例如下图&#xff09; 1、通用标准 http://gi.mnr.gov.cn/20…

基于多模态大数据的国家安全风险态势感知模型构建

源自&#xff1a;情报杂志 “人工智能技术与咨询” 发布 摘要 [研究目的]为强化国家安全情报能力,推动风险监测预警能力提升,构建基于多模态大数据的国家安全风 险态势感知模型。 [研究方法]首先,对国家安全风险态势感知进行阐释;然后,分析多模态大数据驱动下…

【黑马甄选离线数仓day07_常见优化手段及核销主题域开发】

1.常见优化手段 1.1 分桶表基本介绍 分桶表: 分文件的, 在创建表的时候, 指定分桶字段, 并设置分多少个桶, 在添加数据的时候, hive会根据设置分桶字段, 将数据划分到N个桶(文件)中, 默认情况采用HASH分桶方案 , 分多少个桶, 取决于建表的时候, 设置分桶数量, 分了多少个桶最终…

每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题

每日一题系列&#xff08;day 07&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

全新仿某度文库网站源码/在线文库源码/文档分享平台网站源码/仿某度文库PHP源码

源码简介&#xff1a; 全新仿某度文库网站源码/在线文库源码&#xff0c;是以phpMySQL开发的&#xff0c;它是仿某度文库PHP源码。有功能免费文库网站 文档分享平台 实现文档上传下载及在线预览。 仿百度文库是一个以phpMySQL进行开发的免费文库网站源码。仿某度文库实现文档…

每日一练:约瑟夫生者死者小游戏

1. 问题描述 约瑟夫问题&#xff08;Josephus problem&#xff09;是一个经典的数学和计算机科学问题&#xff0c;源于犹太历史学家弗拉维奥约瑟夫斯&#xff08;Flavius Josephus&#xff09;的著作《犹太战记》。问题的描述如下&#xff1a;   在这个问题中&#xff0c;有n…

【JavaEE初阶】 认识文件与Java中操作文件

文章目录 &#x1f334;认识文件&#x1f6a9;树型结构组织和目录&#x1f6a9;文件路径&#xff08;Path&#xff09;&#x1f6a9;知识扩展 &#x1f38d;Java 中操作文件&#x1f6a9;File 概述&#x1f4cc;属性&#x1f4cc;构造方法&#x1f4cc;方法 &#x1f6a9;File使…

R语言基础入门(学习笔记通俗易懂版)

文章目录 R语言预备知识获取工作目录设置工作目录注释变量名的命名赋值变量的显示查看与清除变量函数帮助文档查询函数安装R包文件的读取文件的输出软件的退出与保存 R语言语法向量向量的创建向量的索引&#xff08;向量元素的提取、删除、添加&#xff09;向量长度的获取向量的…

苹果手机怎么卸载微信?记得掌握这两种方法!

微信是一款社交应用程序&#xff0c;在聊天过程中&#xff0c;我们会经常发送和接收各种形式的信息。随着时间的推移&#xff0c;微信缓存的文件会越来越多&#xff0c;占用的存储空间也会逐渐增加。 卸载微信可以释放手机内存&#xff0c;提高手机的运行速度。那么&#xff0…

Matlab进阶绘图第34期—双三角热图

在《Matlab进阶绘图第29期—三角热图》中&#xff0c;我分享过三角热图的绘制模板。 然而&#xff0c;有的时候&#xff0c;为了节省版面或者方便对比等&#xff0c;需要在一张图上绘制两个三角热图的组合形式&#xff0c;且每个三角热图使用不同的配色方案&#xff0c; 由于…

谈谈中间件设计的思路

前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1&#xff1a;基础通用技术的深入理解和运用2&#xff1a;了解和熟悉常见中间件的设计思想&#xff0c;且有自己的感悟,并且能按照自己的理解模仿写一写3&#xff1a;业务的高度理解能力…

pgsql 更新A表的x字段通过查询b表的z字段

查询表t_local_warning_hit_source的send_time 更新到表t_local_warning_source WITH t2 AS ( SELECT ID, send_time FROM t_local_warning_hit_source WHERE send_time > 2023-09-27 00:00:00 AND send_time < 2023-11-28 00:00:00 ) UPDATE t_local_warning_source t…

20-多线程

20.1线程简介 世间有很多工作都是可以同时完成的。例如&#xff0c;人体可以同时进行呼吸、血液循环、思考问题等活用户既可以使用计算机听歌&#xff0c;也可以使用它打印文件。同样&#xff0c;计算机完全可以将多种活动同时进这种思想放在 Java 中被称为并发&#xff0c;而…

GUI加分游戏

需求目标 这个简单的游戏窗口包含一个得分标签和一个按钮。每次点击按钮时&#xff0c;得分增加1&#xff0c;并更新得分标签的显示。 效果 源码 /*** author lwh* date 2023/11/28* description 这个简单的游戏窗口包含一个得分标签和一个按钮。每次点击按钮时&#xff0c;…

rider编辑器抛出异常 忽略try catch

如题 代码加了try catch 后用户使用体验是好了 但开发过程中 报错了不方便排查 启用这些配置后 trycatch里的异常也会抛出 补充一下默认配置,方便还原

华为P40无法链接adb的解决记录

真的很讨厌华为的设备&#xff0c;很多东西啥设备都能跑得好好的&#xff0c;就华为会出问题&#xff0c;简直就是手机界的IE。 情况&#xff1a;突然无法链接adb到P40&#xff0c;拔插无效&#xff0c;关闭开发人员选项再打开也无效&#xff0c;撤销USB调试授权也无效&#x…