标准答案

  1. Vue 3.5+ 中,script setup 里的响应式 props 解构会被编译器改写,读取解构变量时仍然等价于读取 props 上的字段。
  2. Vue 3.4 及更早版本里,直接解构 defineProps 返回值会拿到普通局部变量,后续 props 更新不会自动反映到这个变量上。
  3. 默认值可以在解构时直接写,例如 const { count = 0 } = defineProps<{ count?: number }>(),写法比 withDefaults 更接近原生 JavaScript。
  4. 需要把 prop 作为 ref 传给 composable 或 watch 时,仍然要区分值、getter、toRef 这几种形式,不能只看变量名字。
  5. 团队如果同时维护 Vue 3.4、3.5+ 或 Vue 2 迁移项目,应明确约定 props 解构写法,避免代码在不同版本下语义不一致。

题目解析

这道题的核心不是背一个新语法,而是讲清楚响应式来自编译器改写,运行时并没有把普通解构变成真正的 ref。

Vue 3.5+ 的改进主要降低了 props 解构的心智负担,但它只发生在同一个 script setup 编译上下文里。把值传出函数后,仍然要按普通 JavaScript 值传递规则理解。

Vue 2 没有 defineProps 和 script setup,迁移时不能把 Vue 3.5+ 写法直接套回老项目。跨版本组件库更适合保守使用 props.xxx 或 toRef。

代码示例

下面的写法展示了 Vue 3.5+ 中 props 解构默认值和传入 composable 时的边界。

Vue
<script setup lang="ts">
const { size = 'medium', disabled = false } = defineProps<{
  size?: 'small' | 'medium' | 'large'
  disabled?: boolean
}>()

watchEffect(() => {
  console.log(size, disabled)
})
</script>
Vue
<script setup lang="ts">
const props = defineProps<{
  keyword: string
}>()

useSearch(() => props.keyword)
</script>

常见误区

  • 把 Vue 3.5+ 的响应式 props 解构理解成运行时 ref,传出函数后仍然按 ref 使用。
  • 在 Vue 3.4 或更早项目里直接解构 props,导致父组件更新后子组件局部变量不变。
  • 默认值、可选类型和外部传入值的优先级没有讲清楚,只说“新版本可以解构”。

作者信息