Skip to content

setup() 函数

setup() 是 Vue 3 组合式 API 的核心入口函数,它彻底改变了 Vue 组件的组织方式,提供了更灵活的逻辑复用和代码组织能力。

setup() 的基本概念

作用

  • 替代 Vue 2 的 datamethodscomputed 等选项
  • 作为组合式 API 的入口点
  • 在组件创建之前执行,早于所有生命周期钩子

执行时机

  • beforeCreate 之前调用
  • 此时组件实例尚未创建,无法访问 this
javascript
export default {
  beforeCreate() {
    console.log('1. beforeCreate');
  },
  setup() {
    console.log('0. setup'); // 最先执行
  },
  created() {
    console.log('2. created');
  }
}

setup() 的参数

setup() 接收两个参数:

javascript
setup(props, context) {
  // ...
}

props 参数

  • 包含父组件传递的所有 prop
  • 是响应式的,不能使用 ES6 解构(会失去响应性)
  • 如果需要解构,使用 toRefs
javascript
import { toRefs } from 'vue'

export default {
  props: ['title'],
  setup(props) {
    // ❌ 错误:直接解构会失去响应性
    // const { title } = props;
    
    // ✅ 正确:使用 toRefs 保持响应性
    const { title } = toRefs(props)
    console.log(title.value)
  }
}

context 参数

包含三个有用的属性:

属性描述替代 Vue 2 的
attrs非 prop 的 attributethis.$attrs
slots插槽内容this.$slots
emit触发事件的方法this.$emit
javascript
setup(props, { attrs, slots, emit }) {
  // 访问非 prop 属性
  console.log(attrs.class)
  
  // 检查是否有插槽内容
  if (slots.default) {
    console.log('有默认插槽内容')
  }
  
  // 触发自定义事件
  const handleClick = () => {
    emit('change', '新值')
  }
  
  return { handleClick }
}

setup() 的返回值

setup() 返回的对象会:

  1. 暴露给模板使用
  2. 合并到组件实例中(可以通过 this 访问)
javascript
<template>
  <div>{{ count }}</div>
  <button @click="increment">+1</button>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)
    
    const increment = () => {
      count.value++
    }
    
    return {
      count,
      increment
    }
  }
}
</script>

setup() 中使用生命周期钩子

setup() 中使用生命周期需要显式导入:

选项式 API组合式 API
beforeCreate不需要(直接在 setup 中写代码)
created不需要(直接在 setup 中写代码)
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted
javascript
import { onMounted, onUpdated } from 'vue'

setup() {
  onMounted(() => {
    console.log('组件已挂载')
  })
  
  onUpdated(() => {
    console.log('组件已更新')
  })
}

<script setup> 语法糖

Vue 3.2+ 提供了更简洁的 <script setup> 语法:

html
<script setup>
import { ref } from 'vue'

// 变量自动暴露给模板
const count = ref(0)

// 函数自动暴露
const increment = () => {
  count.value++
}

// 生命周期直接使用
import { onMounted } from 'vue'
onMounted(() => {
  console.log('mounted')
})
</script>

<template>
  <button @click="increment">{{ count }}</button>
</template>

<script setup> 的优势:

  1. 更少的样板代码
  2. 更好的 TypeScript 支持
  3. 更好的性能(编译时优化)

最佳实践

  1. 逻辑组织:将相关逻辑组织在一起(替代 Vue 2 的选项分割)
  2. 复用逻辑:将可复用的逻辑提取到 composable 函数中
  3. TypeScript:<script setup> 提供更好的类型推断
  4. 避免 this:在 setup() 中永远不要使用 this
编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!