2

vue 中 boolean props 的默认值问题

 1 year ago
source link: https://blog.rxliuli.com/p/f3564b039a28421188146aa89b52a3c0/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

vue 中 boolean props 的默认值问题

本文最后更新于:2023年7月11日 晚上

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

<script lang="ts" setup>
withDefaults(
defineProps<{
flag?: boolean
}>(),
{
flag: true,
},
)
</script>

<template>
<div>
{{ String($props.flag ?? 'undefined') }}
</div>
</template>
<script lang="ts" setup>
import A from './A.vue'

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

<template>
<A v-bind="$props"></A>
</template>
<script setup>
import A from './A.vue'
import B from './B.vue'
</script>

<template>
<A></A>
<B></B>
</template>
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,例如

<script lang="ts" setup>
withDefaults(
defineProps<{
flag?: boolean
}>(),
{
flag: undefined,
},
)
</script>

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

true
true

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK