组合式 API:setup()
基本使用
setup()
钩子是在组件中使用组合式 API 的入口,通常只在以下情况下使用:
- 需要在非单文件组件中使用组合式 API 时。
- 需要在基于选项式 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()
解决这个问题: