Search K
Appearance
Appearance
📊 SEO元描述:2024年最新Vue3 setup函数教程,详解执行时机、参数处理、返回值优化。包含完整实战案例,适合Vue3开发者掌握组合式API核心机制。
核心关键词:Vue3 setup函数、setup执行时机、setup参数、Vue3组合式API、前端响应式编程
长尾关键词:setup函数怎么用、Vue3 setup参数详解、setup返回值处理、setup函数最佳实践、Vue3组件初始化
通过本节setup函数详解,你将系统性掌握:
setup函数是什么?这是Vue3开发者必须深入理解的核心概念。setup函数是Composition API的入口点,也是组件初始化的关键阶段。
💡 核心理念:setup函数将组件的逻辑从选项式API的分散结构中解放出来,提供了一个统一的逻辑组织空间。
setup函数在组件生命周期中的位置非常特殊:
// 🎉 setup执行时机示例
export default {
name: 'MyComponent',
// 1. setup函数最早执行
setup(props, context) {
console.log('1. setup执行 - 此时组件实例还未创建')
console.log('this:', this) // undefined
// 在这里进行所有的组合式API调用
const count = ref(0)
onBeforeCreate(() => {
console.log('2. beforeCreate - 实例初始化之后,数据观测之前')
})
onCreated(() => {
console.log('3. created - 实例创建完成')
})
onBeforeMount(() => {
console.log('4. beforeMount - 挂载开始之前')
})
onMounted(() => {
console.log('5. mounted - 挂载完成')
})
return {
count
}
}
}setup函数接收两个参数:props和context
// 🎉 props参数使用示例
export default {
props: {
title: String,
count: {
type: Number,
default: 0
},
user: Object
},
setup(props, context) {
// ✅ 正确:直接访问props
console.log('标题:', props.title)
console.log('计数:', props.count)
// ✅ 正确:props是响应式的
watchEffect(() => {
console.log('标题变化:', props.title)
})
// ❌ 错误:不要解构props,会失去响应性
// const { title, count } = props
// ✅ 正确:如需解构,使用toRefs
const { title, count } = toRefs(props)
return {
// 可以直接返回props中的数据
title: props.title
}
}
}context对象包含三个重要属性:
// 🎉 context参数详解
export default {
emits: ['update', 'delete'],
setup(props, context) {
// context包含三个属性
const { attrs, slots, emit } = context
// 1. attrs - 非prop的attribute
console.log('attrs:', attrs)
// 包含class、style等非prop属性
// 2. slots - 插槽内容
console.log('slots:', slots)
// 可以访问具名插槽和默认插槽
// 3. emit - 事件发射器
const handleUpdate = () => {
emit('update', { id: 1, name: '更新的数据' })
}
const handleDelete = () => {
emit('delete', props.id)
}
// 在模板中使用插槽
const renderSlots = () => {
return (
<div>
{slots.header?.()}
<div>主要内容</div>
{slots.footer?.()}
</div>
)
}
return {
handleUpdate,
handleDelete,
renderSlots
}
}
}setup函数的返回值决定了模板可以访问的数据和方法:
// 🎉 返回对象示例
export default {
setup() {
const count = ref(0)
const message = ref('Hello')
const increment = () => {
count.value++
}
const computedValue = computed(() => {
return count.value * 2
})
// 返回对象,暴露给模板
return {
count,
message,
increment,
computedValue,
// 可以重命名
doubleCount: computedValue
}
}
}// 🎉 返回渲染函数示例
import { h, ref } from 'vue'
export default {
setup() {
const count = ref(0)
const increment = () => {
count.value++
}
// 返回渲染函数
return () => h('div', [
h('p', `计数: ${count.value}`),
h('button', { onClick: increment }, '增加')
])
}
}返回值最佳实践:
💼 性能提示:setup函数只执行一次,返回的响应式数据会被Vue的响应式系统持续追踪,因此要注意避免创建不必要的响应式数据。
Vue3.2引入了<script setup>语法糖,简化了setup函数的使用:
<!-- 🎉 传统setup函数 -->
<template>
<div>{{ count }}</div>
<button @click="increment">增加</button>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const count = ref(0)
const increment = () => {
count.value++
}
return {
count,
increment
}
}
}
</script><!-- 🎉 setup语法糖 -->
<template>
<div>{{ count }}</div>
<button @click="increment">增加</button>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
const increment = () => {
count.value++
}
// 顶层变量自动暴露给模板
</script>通过本节setup函数详解的学习,你已经掌握:
<script setup>语法A: setup函数在组件实例创建之前执行,此时组件实例尚未创建,因此无法访问this。这是设计上的考虑,鼓励使用更明确的参数传递方式。
A: setup函数本身不能是async函数,但可以在setup内部使用异步操作。如果需要异步setup,可以考虑使用Suspense组件。
A: 可以使用getCurrentInstance()函数获取当前组件实例,但不推荐在生产代码中使用,主要用于库开发。
A: 不建议在同一个组件中混用。如果使用了<script setup>,就不应该再使用传统的setup函数。
A: setup函数只执行一次,性能开销很小。但要注意避免在setup中创建不必要的响应式数据或执行昂贵的计算。
// 调试setup函数执行
export default {
setup(props, context) {
console.log('setup开始执行')
console.log('props:', props)
console.log('context:', context)
// 使用Vue DevTools
const count = ref(0)
// 调试响应式数据
watchEffect(() => {
console.log('count变化:', count.value)
})
return {
count
}
}
}// 问题:响应性丢失
// ❌ 错误做法
const { title } = props // 失去响应性
// ✅ 正确做法
const title = toRef(props, 'title')
// 或
const { title } = toRefs(props)"setup函数是Vue3 Composition API的核心,掌握它就掌握了现代Vue开发的关键。记住:setup是组织逻辑的地方,而不仅仅是数据的容器。"