Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

defineProps 默认对 boolean 类型的 prop 自动转换为 false 不符合语义 #10674

Closed
guaijie opened this issue Apr 10, 2024 · 6 comments

Comments

@guaijie
Copy link
Contributor

guaijie commented Apr 10, 2024

Vue version

3.4.21

Link to minimal reproduction

https://cn.vuejs.org/guide/components/props

Steps to reproduce

一:我很难理解官方回答的:‘’为了对齐原生 HTML 标签的 boolean attributes 的行为‘’
首先 props 和 attributes 在 vue 中本意是不同的,不管是声明,传值还是使用,props 是在 vue 这种框架中独有的,这是你们发明的概念。它不应该贴合所谓的:‘’原生 HTML 标签的 boolean attributes 的行为‘’。它更应该符合直觉(props 和 attributes 本来你就特地做了区分)。
二:就算要满足‘’为了对齐原生 HTML 标签的 boolean attributes 的行为‘’。如果我声明一个类型只是 boolean 类型,你将其结果转换为 false 我能理解。但如果我声明一个类型是'可选的'是可以为 undefined,依然默认转换为 false 那这就很莫名其妙了。这意味着这个所谓的对应原生的 attr 可以传 boolean 也可以什么都不传。那我不传值肯定就是默认 undefined 。官方文档明确说明只有在类型为 boolean 时,默认值才自动转为 false

image

export type SubmitterProps = {
  submitText?: VueNode
  resetText?: VueNode
  buttonGap?: number
  submitButtonProps?: false | (ButtonProps & { preventDefault?: boolean })
  resetButtonProps?: false | (ButtonProps & { preventDefault?: boolean })
  render?: (node: VueNode) => VueNode
  onSubmit?: () => void
  onReset?: () => void
}

上面这个类型声明导致我,不得不做大量的默认值声明。我明确声明了 submitText 是可选的,但依然给我转为了false, 而且 VueNode 里也包含了 undefined 类型。这非常反直觉。而且也不满足你答复的 ‘’为了对齐原生 HTML 标签的 boolean attributes 的行为‘’

What is expected?

如果要满足 ‘’为了对齐原生 HTML 标签的 boolean attributes 的行为‘’ 的话,我建议只有在类型为 boolean 时才默认转换为 false, 当明确指明该 prop 是可选和 undefined 时,默认保持原意:undefined (因为在 js 中没传值就是 undefined)

What is actually happening?

现在的问题在于类型中只要包含了 boolean 类型就默认转换为 false

System Info

No response

Any additional comments?

No response

@Justineo
Copy link
Member

Duplicate of #9882

See also: vuejs/vue#4792 vuejs/vue#7646

@guaijie
Copy link
Contributor Author

guaijie commented Apr 10, 2024

Duplicate of #9882

See also: vuejs/vue#4792 vuejs/vue#7646

麻烦认真看下别人的提出的 issue ,不要直接选择关闭,你对我的 issue 有什么问题请答复,可以互相交流。我查过别人提出的 issue,别人没有正确的的回复,而且你回给我的链接都是被关闭的。我正是因为你们关闭了这些issues 才重新提的。

@Justineo
Copy link
Member

This is a known issue that has been discussed for several times. Changing the behavior will be a breaking change that we cannot make at the point in Vue 3.

@guaijie
Copy link
Contributor Author

guaijie commented Apr 11, 2024

This is a known issue that has been discussed for several times. Changing the behavior will be a breaking change that we cannot make at the point in Vue 3.

本身就是错的,就一直错下去吗?一个新的东西,前期难免有破坏性更改。等这个 defineProps 用的越来越多就越难动。
我真的很吃惊,一个错的东西想到的不是解决而是担心会产生破坏性更改。

@TuringJest
Copy link

@Justineo at least consider providing it via a feature flag. The behaviour is just plain out wrong and a major tripping stone with TS.

@J-env
Copy link

J-env commented Apr 23, 2024

defineProps 自动编译出默认值,这个行为太奇怪了,出了问题排查起来真困难!!!,
还有就是我已经使用了 ts 去写组件,打包后的 props 居然还有 js类型定义, 生产环境下 为啥需要Prop 校验的代码?
如果有很多很多的组件,每个组件都有很多 prop, 打包后的组件文件非常大 (全是Prop 校验,无用的代码),
优化掉不好吗

@github-actions github-actions bot locked and limited conversation to collaborators May 9, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants