vue 中 boolean props 的默认值问题

本文最后更新于:2023年7月11日 下午

场景

最近组内其他人基于 antdv 封装了一些组件,其中一些 boolean 类型的 props 被透传到了 antdv 的组件。但实际使用时发现,当不传递这些 boolean props 时,antdv 组件的行为和预期不一致。

问题

例如

组件 A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script lang="ts" setup>
withDefaults(
defineProps<{
flag?: boolean
}>(),
{
flag: true,
},
)
</script>

<template>
<div>
{{ String($props.flag ?? 'undefined') }}
</div>
</template>

组件 B

1
2
3
4
5
6
7
8
9
10
11
<script lang="ts" setup>
import A from './A.vue'

defineProps<{
flag?: boolean
}>()
</script>

<template>
<A v-bind="$props"></A>
</template>

测试使用

1
2
3
4
5
6
7
8
9
<script setup>
import A from './A.vue'
import B from './B.vue'
</script>

<template>
<A></A>
<B></B>
</template>

渲染结果

1
2
true
false

playground: https://play.vuejs.org/#eNqFUcFOwzAM/ZUoQtomjfbAbZRNLXCAAyDgmEtp3S4jTaIk3SZN/XecdOs2aRo9VLbfs/Pst6Op1tG6BTqjiS0M145YcK2eM8kbrYwjKamMasgoilNPHA1ANgBZAO6ZZDKJ+ynYj4mDRovcAWaEJOk8idM+zDDMMEzigUKn1NlCyYrX0coqiYp2nstooRrNBZh37biSltEZCYjHciHU5jXUnGlheqgXSyh+L9RXdutrjH4YsGDWwOiAudzU4Hr4+esNthgPYKPKViD7CvgJVonWa+xpWStLlH3CC2pfwvm4rL/t89aBtIelvFDP7AKfUTzq45XVj3LvorvQx2SHVwxunPgpclk/IB27//M2WFhCxSV8GKVtsn+sEnm9mJEfpQTkSOnm48lVr73bZH37w2WJT99oP4zRvf/npoeXr8s1TG64Wz5BlbfC2fG5QkQvaMSqVznFe50Q9kf24MT/jytgEgrHNfZtScnXQ+K/3Y58OYP+jfu9Ij+YLBZkhH4HZeVoQrpuGBAfJpwu3v0ByAcmXQ==

是不是感觉很神奇,组件 B 明明将所有的 props 都透传给了组件 A,但却渲染出来了不同的结果。在组件 B 中打印一下 props.flag 的值,发现是 false,这就是实际的问题了。

解决

好吧,目前的解决方法是将所有的 boolean 值的默认值都强制指定为 undefined,例如

1
2
3
4
5
6
7
8
9
10
<script lang="ts" setup>
withDefaults(
defineProps<{
flag?: boolean
}>(),
{
flag: undefined,
},
)
</script>

这样就可以得到预期的结果了。

1
2
true
true

参考


vue 中 boolean props 的默认值问题
https://blog.rxliuli.com/p/f3564b039a28421188146aa89b52a3c0/
作者
rxliuli
发布于
2023年7月11日
许可协议