`setup` 函数的作用是什么?它的参数和返回值分别是什么?

你想了解 Vue 中 setup 函数的核心作用、参数构成和返回值规则,这是理解 Vue 3 组合式 API 的关键知识点。

一、setup 函数的核心作用

setup 是 Vue 3 组合式 API 的入口函数,替代了 Vue 2 中的 datamethodscomputed 等选项式写法,主要作用有:
  1. 作为组件逻辑的「统一入口」,集中编写数据定义、方法、生命周期逻辑等;
  2. 在组件实例创建前执行(早于 beforeCreate 钩子),是组合式 API 的执行上下文;
  3. 实现逻辑复用:可以将组件逻辑抽离成独立函数,在 setup 中调用,解决 Vue 2 混合(mixins)的命名冲突、来源不清晰等问题;
  4. 完全脱离 this 指向(setupthisundefined),避免了选项式 API 中 this 指向不明确的问题。

二、setup 函数的参数

setup 接收两个固定参数,均为可选:

1. 第一个参数:props(组件接收的属性)

  • 类型:对象,包含父组件传递且在 props 选项中声明的属性;
  • 特性:
    • 是「响应式」的,当父组件传递的属性变化时,props 会自动更新;
    • 不能直接解构(解构会丢失响应式),如需解构需用 toRefs/toRef 处理;
    • 遵循 Vue 的单向数据流,不能直接修改 props 中的值。
示例:
vue
<template>
  <div>{{ title }}</div>
</template>

<script>
import { toRefs } from 'vue'
export default {
  props: {
    title: {
      type: String,
      required: true
    }
  },
  setup(props) {
    // 解构 props 并保留响应式
    const { title } = toRefs(props)
    console.log(title.value) // 访问需加 .value(Ref 特性)
    return { title }
  }
}
</script>

2. 第二个参数:context(上下文对象)

  • 类型:普通对象(非响应式),包含组件的核心上下文信息,解构不会丢失特性;
  • 核心属性:
    • attrs:非响应式对象,包含父组件传递但未在 props 中声明的属性(对应 Vue 2 的 $attrs);
    • slots:非响应式对象,包含组件的插槽内容(对应 Vue 2 的 $slots);
    • emit:函数,用于触发自定义事件(对应 Vue 2 的 $emit);
    • expose:函数,用于显式暴露组件内部的属性 / 方法(供父组件通过 ref 访问)。
示例:
vue
<template>
  <button @click="handleClick">点击触发事件</button>
</template>

<script>
export default {
  setup(props, { emit, attrs, slots }) {
    // 访问未声明的 props 属性
    console.log(attrs.class)
    // 触发自定义事件
    const handleClick = () => {
      emit('custom-click', '参数')
    }
    return { handleClick }
  }
}
</script>

三、setup 函数的返回值

setup 的返回值决定了模板中能访问的变量 / 方法,主要有两种情况:

1. 返回「普通对象」(最常用)

  • 作用:对象中的属性 / 方法会被暴露到模板中,模板可直接使用;
  • 注意:
    • 如果返回的是 Ref 类型(如 ref(0)),模板中访问时无需加 .value,Vue 会自动解包;
    • Reactive 类型(如 reactive({}))可直接返回,模板中直接访问属性。
示例:
vue
<template>
  <div>{{ count }}</div>
  <button @click="addCount">+1</button>
</template>

<script>
import { ref } from 'vue'
export default {
  setup() {
    const count = ref(0)
    const addCount = () => {
      count.value++
    }
    // 返回对象,模板可访问 count 和 addCount
    return { count, addCount }
  }
}
</script>

2. 返回「渲染函数」

  • 作用:替代模板,直接通过 JS 编写渲染逻辑;
  • 场景:适合动态生成 DOM 结构的复杂场景。
示例:
vue
<script>
import { h, ref } from 'vue'
export default {
  setup() {
    const count = ref(0)
    const addCount = () => count.value++
    // 返回渲染函数,替代 template 模板
    return () => h('div', [
      h('p', `计数:${count.value}`),
      h('button', { onClick: addCount }, '+1')
    ])
  }
}
</script>

特殊说明:

  • setup 不建议返回 Promise(虽然 Vue 支持,但需配合 Suspense 组件,且模板无法访问异步数据);
  • 如果使用 <script setup> 语法糖,无需手动返回 —— 变量 / 方法会自动暴露到模板,本质是 Vue 编译时自动处理了返回逻辑。

总结

  1. 核心作用:Vue 3 组合式 API 的入口,集中编写组件逻辑,替代选项式 API,支持逻辑复用;
  2. 参数props(响应式,组件接收的属性)和 context(非响应式,包含 attrs/slots/emit 等上下文);
  3. 返回值:主要返回普通对象(供模板访问变量 / 方法),也可返回渲染函数(替代模板),<script setup> 语法糖无需手动返回。

免责声明:
1.本站所有源码支持免费互换,所有资源来源于网络,分享目的仅供大家学习和交流!不得使用于非法商业用途,不得违反国家法律。否则后果自负!(下载即表示同意遵守此条例!) 所有资源,不能保证完全去除后门和源码的完整性!(建议先用D盾 等查杀软件先扫描一遍!)且都不包含技术服务请大家谅解!
2.根据二○○二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理, 通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可, 不向其支付报酬!鉴于此,也希望大家按此说明研究!
3.本站所有源码均收集来源于网络,若此源码资源等文章侵犯您的合法权益,请私信联系站长,并于24小时内删除下架。
4.本站所有源码仅限学习,交流使用,请勿上线或非法使用,一切法律责任均于此站无关。
5.侵权联系邮箱:188773464@qq.com
6.若您最终确认购买,则视为您100%认同并接受以上所述全部内容。

源码下载网 技术社区 `setup` 函数的作用是什么?它的参数和返回值分别是什么? https://svipm.com.cn/21146.html

相关文章

猜你喜欢