Vue3 Composition API
选项式API
下面代码我们用选项式API来实现一个简易的计数器:
1 | export default { |
使用data、methods等组件来编写组件确实很有效,然而当组件开始变多变大时,逻辑的关注点列表也开始增长,在选项式API中,组件的逻辑的数据和方法被分别保存在data和methods中,这样的碎片化开发导致组件难以阅读和理解。在组合式API中,可以把一个逻辑的数据和方法收集在一起。
setup
函数
setup
在组件被创建之前执行,它被作为组合式API的入口。
在
setup
中应该避免使用this
,因为它会找不到组件实例,setup
发生在data
、property
、computed
、methods
之前,所以他们在setup
中无法被获取
把setup
添加到组件中。
1 | export default { |
setup
函数可以返回变量、函数,可以把Vue2中的data
、methods
中的数据和函数放在setup
中。
1 | function setup() { |
这里定义了一个计数器,但是无法生效,因为counter
变量是非响应式的,这意味着无论调用多少次counterAdd
函数,counter
的值始终为0。
参数
props
props
是setup
函数的第一个参数,props
是响应式的,因此不能使用解构。
1 | export default { |
如果需要解构,可以使用toRefs
函数来完成:
1 | import { toRefs } from 'vue' |
context
context
是setup
的第二个参数,它是一个普通的对象,暴露了其他能在setup
中能用的值。
1 | export default { |
因为context
是一个普通的对象,因此可以使用解构:
1 | export default { |
结合mustache使用
如果 setup
返回一个对象,那么该对象的值以及传递给 setup
的 props
参数中的值就都可以在模板中访问到:
1 | <template> |
setup
中返回的refs
在mustache中是会被自动解包的,因此不用在模板中使用.value
使用this
setup
中的this
与组件选项中的this
是完全不同的,所以在setup
中应该要避免使用this
。
ref
响应式变量
在Vue3中,我们可以通过一个新的ref
函数来创建响应式变量。
1 | import { ref } from 'vue' |
ref
函数将接受的参数包裹在一个带有value
值的对象中返回,然后使用value
可以访问响应式变量的值。
1 | import { ref } from 'vue' |
这样我们可以把计数器应用改成使用响应式变量。
1 | import { ref } from 'vue' |
在setup
中注册生命周期钩子
为了让组合式API和选项式API一样完整,还需要在setup
中注册生命周期钩子函数,组合式API的生命周期钩子与选项式相同,只是加上了前缀on
,如mounted
变成了onMounted
。
将其添加到setup
中:
1 | import { ref, onMounted} from 'vue' |
watch
响应式更改
Vue3中的watch
和选项式API的watch
很类似,它接受三个参数:
- 要监听的响应式变量
callback
- 可选的配置选项
Vue3中watch
的用法:
1 | import { ref, watch } from 'vue' |
以上写法等同于选项式API中的以下写法
1 | export default { |
将watch
应用到计数器中
1 | import { ref, onMounted, watch } from 'vue' |
computed
属性
和ref
和watch
一样,也可以从Vue中导入computed
函数创建计算属性。
1 | import { ref, computed } from 'vue' |
我们给computed
函数传递了一个函数,它是类似getter
的callback
,输出的是一个类似ref
的只读的响应式变量,一样使用value
访问它的值。
实现代码复用
把组件里的数据和函数都放在setup
里会使setup
函数变得非常大,为了避免这样,我们要将组件的代码提取到一个独立的组合式函数中:
1 | // @/src/components/counter.js |
然后我们在组件中使用它
1 | import counterSetup from '@/src/components/counter.js' |
生命周期钩子
选项式 API | 组合式API |
---|---|
beforeCreate |
Not needed* |
created |
Not needed* |
beforeMount |
onBeforeMount |
mounted |
onMounted |
beforeUpdate |
onBeforeUpdate |
updated |
onUpdated |
beforeUnmount |
onBeforeUnmount |
unmounted |
onUnmounted |
errorCaptured |
onErrorCaptured |
renderTracked |
onRenderTracked |
renderTriggered |
onRenderTriggered |
activated |
onActivated |
deactivated |
onDeactivated |