添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
直接跳到内容

组合式 API:setup()

基本使用

setup() 钩子是在组件中使用组合式 API 的入口,通常只在以下情况下使用:

  1. 需要在非单文件组件中使用组合式 API 时。
  2. 需要在基于选项式 API 的组件中集成基于组合式 API 的代码时。

注意

对于结合单文件组件使用的组合式 API,推荐通过 <script setup> 以获得更加简洁及符合人体工程学的语法。

我们可以使用 响应式 API 来声明响应式的状态,在 setup() 函数中返回的对象会暴露给模板和组件实例。其他的选项也可以通过组件实例来获取 setup() 暴露的属性:

在模板中访问从 setup 返回的 ref 时,它会 自动浅层解包 ,因此你无须再在模板中为它写 .value 。当通过 this 访问时也会同样如此解包。

setup() 自身并不含对组件实例的访问权,即在 setup() 中访问 this 会是 undefined 。你可以在选项式 API 中访问组合式 API 暴露的值,但反过来则不行。

setup() 应该 同步地 返回一个对象。唯一可以使用 async setup() 的情况是,该组件是 Suspense 组件的后裔。

访问 Props

setup 函数的第一个参数是组件的 props 。和标准的组件一致,一个 setup 函数的 props 是响应式的,并且会在传入新的 props 时同步更新。

请注意如果你解构了 props 对象,解构出的变量将会丢失响应性。因此我们推荐通过 props.xxx 的形式来使用其中的 props。

如果你确实需要解构 props 对象,或者需要将某个 prop 传到一个外部函数中并保持响应性,那么你可以使用 toRefs() toRef() 这两个工具函数:

Setup 上下文

传入 setup 函数的第二个参数是一个 Setup 上下文 对象。上下文对象暴露了其他一些在 setup 中可能会用到的值:

该上下文对象是非响应式的,可以安全地解构:

attrs slots 都是有状态的对象,它们总是会随着组件自身的更新而更新。这意味着你应当避免解构它们,并始终通过 attrs.x slots.x 的形式使用其中的属性。此外还需注意,和 props 不同, attrs slots 的属性都 不是 响应式的。如果你想要基于 attrs slots 的改变来执行副作用,那么你应该在 onBeforeUpdate 生命周期钩子中编写相关逻辑。

暴露公共属性

expose 函数用于显式地限制该组件暴露出的属性,当父组件通过 模板引用 访问该组件的实例时,将仅能访问 expose 函数暴露出的内容:

与渲染函数一起使用

setup 也可以返回一个 渲染函数 ,此时在渲染函数中可以直接使用在同一作用域下声明的响应式状态:

返回一个渲染函数将会阻止我们返回其他东西。对于组件内部来说,这样没有问题,但如果我们想通过模板引用将这个组件的方法暴露给父组件,那就有问题了。

我们可以通过调用 expose() 解决这个问题: