typescript - Vue 3 如何传递一个可选的布尔道具?
问题描述
我正在使用 Vue 3 和 TS 4.4 构建一个应用程序,并与 Vite 2 捆绑在一起。我有一个LoginPage.vue
包含以下内容的文件:
<script lang="ts" setup>
const props = defineProps<{
message?: string;
redirectOnSubmit?: boolean;
showRegisterLink?: boolean;
}>();
console.log({ ...props });
</script>
<template>
... login form and whatnot
</template>
该组件正在传递给vue-router
export const router = createRouter({
history: createWebHistory(),
routes: [
{ name: RouteName.LOGIN, path: "/login", component: LoginPage },
{ name: RouteName.REGISTER, path: "/register", component: RegisterPage },
],
});
我遇到的问题是登录页面setup
脚本运行时,它会记录以下内容:
{ redirectOnSubmit: false, showRegisterLink: false, message: undefined }
为什么我的可选布尔道具被迫false
而不是undefined
?有什么办法可以关闭它吗?如果我切换message
到message?: boolean
,它也会切换到false
。
如果没有传递任何内容,我想将这些道具默认为默认值true
,但是我无法区分传递false
和完全省略道具。
解决方案
如果在 prop 声明中false
没有指定, Vue 默认 Boolean props 为。default
Vue的作者解释了原因:
布尔转换遵循与布尔属性相同的规则:任何值的存在都被转换为真,不存在意味着假。
要将道具默认为true
未指定,请使用 的default
选项声明道具true
,使用道具声明的基于对象的语法,如以下选项 API 示例所示:
<script>
export default {
props: {
myOptionalBool: {
type: Boolean,
default: true,
}
}
}
</script>
使用defineProps()
in 时<script setup>
,您只能将 prop 声明对象用作函数参数。由于defineProps()
只接受函数参数或泛型类型参数,所有道具都必须在函数参数中声明:
<script lang="ts" setup>
const props = defineProps({
message: String,
showRegisterLink: {
type: Boolean,
default: true,
},
redirectOnSubmit: {
type: Boolean,
default: true,
},
})
</script>
推荐阅读
- javascript - 使用 css/javascript 滚动时如何模糊图像?
- azure-aks - 带有 Terraform 的 Azure 文件(使用 CSI 驱动程序)
- python - 如何从python中的套接字服务器获取完整字符串而不是一个字节?
- reactjs - 尝试在 React 中实现本地存储。它没有跟踪我发送的输入值
- excel - 宏不更新
- reactjs - 用本地状态变量替换 sessionStorage 代码
- dpdk - DPDK v.19.11 中的校验和计算更改?
- javascript - 优化画布多对象渲染
- webos - 智能电视 LG 应用程序,如何添加内容分级程序
- node.js - 将打字稿支持添加到新的节点应用程序