📚前端面试题速记
Q5

setup 函数在组件生命周期的哪个阶段执行?

速记答案(30 秒)

执行时机:组件实例创建后、beforeCreate 和 created 之间(实际上取代了它们)。此时 props 已解析,但没有可用的 this。

📖 详细讲解

标准面试回答(推荐记住)

setup 函数在组件实例创建后、beforeCreate 和 created 钩子之间执行,实际上它取代了这两个钩子。此时 props 已经解析完成,但没有 this 上下文,只能通过 setup(props, ctx) 的参数来访问 props 和组件上下文。

生命周期对比

Option API Composition API 说明
beforeCreate setup() 实例创建前
created setup() 实例创建完成
beforeMount onBeforeMount 挂载前
mounted onMounted 挂载完成
beforeUpdate onBeforeUpdate 更新前
updated onUpdated 更新完成
beforeUnmount onBeforeUnmount 卸载前 (Vue 3 新增)
unmounted onUnmounted 卸载完成

为什么 setup 中没有 this?

因为 setup 执行时,组件实例尚未完全创建完成(虽然 props 已解析),datacomputedmethods 等选项尚未处理。为了避免误用,Vue 刻意不绑定 this

获取上下文:
使用 setup(props, context) 的第二个参数 context:

  • context.attrs (非响应式对象,等同于 $attrs)
  • context.slots (非响应式对象,等同于 $slots)
  • context.emit (等同于 $emit)
  • context.expose (暴露公共属性)

面试要点

  • 明确 setup 的执行时机
  • 理解为什么没有 this
  • 知道如何通过参数获取 props 和 context

💻 代码示例

setup 执行时机
<script setup>
import { onMounted, onUnmounted } from 'vue'

// setup 阶段可用的
const props = defineProps<{ title: string }>()
const emit = defineEmits<{ change: [value: string] }>()

// 无法使用 this,但可以使用组合式 API
onMounted(() => {
  console.log('组件已挂载')
})

onUnmounted(() => {
  console.log('组件将卸载')  
})
</script>