页面代码
<template>
<view>
<testProps :text="text" />
<testProps :text="123" />
<testProps text="456" />
</view>
</template>
<script setup lang="ts">
import testProps from '@/components/testProps.vue'
const props = defineProps({
text:String
})
</script>
组件代码
<template>
<view class="">
<text>text:{{text}}</text>
</view>
</template>
<script setup lang="ts">
const props = defineProps({
text:{
type:[String,Number],
default:1
}
})
</script>
附件亦有代码可供复现
半驯之马 (作者)
那props的default意义何在?
2025-06-13 14:47
爱豆豆
回复 半驯之马: 当然有用啊 但是因为 Vue 的 props 设计机制是:当父组件显式传递任何值(包括空字符串 null 0
false )时 Vue 会认为这是一个有效的显式传递值 然后子组件的默认值就会被覆盖 所以你组件内显示的是空字符串
2025-06-13 15:10
爱豆豆
回复 半驯之马: 空值时你可以不传text 或者 传入undefined 这样就会显示出默认值了 再或者就在子组件内加上运算符判断默认值
2025-06-13 15:16
半驯之马 (作者)
回复 爱豆豆: 我的问题不就是因为uni的这个机制,当页面使用defineProps来代替onLoad获取页面参数时,所定义的页面参数如果没传,此时对应参数是一个空字符串,这个问题就会导致当拿这个参数传递给组件时,因为是空字符串,所以不会触发组件的defineProps中的默认参数,你明白了吗,你拿我实例代码去复现
2025-06-13 18:35
半驯之马 (作者)
回复 爱豆豆: 我在页面中写了const props = defineProps({
text:String
}) ,这个props就是页面的参数合集,当我访问这个页面而不传递text参数时,这个页面中props的text是一个空字符串,我拿这个props的text传递给testProps 组件的text,此时testProps拿到的text就是空字符串,导致testProps中props 定义的text默认值为1不生效,这样讲够清晰吗
2025-06-13 18:39
爱豆豆
回复 半驯之马: 你看下我上面的回复
2025-06-16 09:38
半驯之马 (作者)
回复 爱豆豆: 我知道怎么解决这个问题,我现在说的这个问题是不是一个bug?没有传递的参数为什么拿到的是空字符串,这本来就不合理
2025-06-16 14:03