
经过一段时间的学习,我对 Vue 3 的 setup 有了初步的理解。Vue 3 在这方面做了许多更新,主要体现在 setup 函数的使用上。为了更深入地理解 setup,我查阅了官方文档,并对其进行了翻译和解读。
官方文档中提到了在使用 setup 函数时需要注意的两点:
1. 本章节的示例使用的是单页面组件语法。
2. 读者应已了解组件的 API 指引和响应式原理,若你是初学者,建议先阅读组件API指引部分。
接下来,我们深入探讨 setup 函数的两个主要参数:props 和 context。
在 setup 函数中,第一个参数是 props,正如我们在标准组件中所期待的那样,props 在 setup 函数内部是响应式的。当我们传入新的 props 时,它会进行更新。
例如,在一个名为 MyBook.vue 的组件中:
vue
export default {
props: {
title: String
},
setup(props) {
console.log(props.title)
}
由于 props 是响应式的,我们不能使用 ES6 的解构赋值语法,否则会失去其响应式特性。如果需要解构 props,我们可以使用内置的 toRefs 工具函数。
第二个参数是 context,它是一个常规的 JavaScript 对象,包含三个组件属性:attrs、slots 和 emit。
在 setup 函数中:
vue
export default {
setup(props, context) {
console.log(context.attrs) // 非响应式对象
console.log(context.slots) // 非响应式对象
console.log(context.emit) // 方法,用于触发事件
}
因为 context 是一个 JavaScript 对象,所以它不是响应式的。这意味着我们可以安全地使用 ES6 的解构赋值语法。但是需要注意,attrs 和 slots 是有状态的,并且它们不是响应式的。如果我们想基于 attrs 和 slots 的变化做一些额外的事情,应该在生命周期函数 onUpdated 中实现。
在 setup 函数执行的时候,组件实例还没有被创建出来,因此我们只能访问到 props、attrs、slots 和 emit。换句话说,我们无法在 setup 函数中访问到 data、computed 和 methods。
如果 setup 函数返回一个对象,其中的属性可以在 template 中访问到,包括传入的 props。返回的 refs 对象在 template 中使用时会被自动解包,因此我们不需要显式地使用 .value 来获取值。
setup 还可以返回一个渲染函数,这个函数可以直接利用代码块中声明的其它响应式对象。需要注意的是,在渲染函数中,我们需要显式地 ref 的值。
在 setup 函数中,this 不代表当前激活的组件实例。因为 setup 被调用的时机在其他组件钩子函数之前,所以 this 在 setup 内部的表现和其他函数不一样,这可能会引起困惑。也就是说,在 setup 中,我们不能像原来在 mounted 和 created 等钩子函数中那样使用 this。
Vue 3 的 setup 函数为我们提供了更多的灵活性和可控性,但要正确使用它,我们需要了解其工作原理并遵循其规则。
