前言
上一节, 我们分析了官网中通用API
的前三个, 后面两个我们慢慢分析. 从今天这一章开始,我们进入Vue3
的核心, 即组合式API 的学习.
首先我们从组合式API 的入口开始分析, 理解setup
钩子函数的使用
1. setup 钩子函数的认识
钩子函数, 相信学过vue2
的同学都很熟悉了, vue2
组件的生命周期钩子函数会在组件不同的生命周期阶段调用.
但钩子函数的本质, 其实就是组件选项对象的方法. 我们通常说的选项都是选项对象的属性.
vue3
选项对象中新增了一个钩子函数, 即setup
作为组合式API的入口, 也就是说我们以后学习的组合式API 都需要在setup
钩子函数中使用.
示例:
import {
defineComponent } from "vue";
export default defineComponent({
// 钩子函数
setup() {
return {
};
},
});
和data
钩子函数一样, setup
函数返回一个数据对象.
不同的是,setup
函数返回值除了可以是数据对象, 也可以是一个渲染函数.
2. setup基本使用
setup
钩子函数的使用,我们在上一章中也提及过:
setup
函数可以返回一个渲染函数, 渲染函数返回通过h
创建的vnode
setup
函数可以返回一个对象, 对象的数据可以在模板上直接使用
因为之前的学习, 我们知道,只有组件实例对象上的数据才可以被模板直接使用,
接下来我们分析一下setup
返回对象中数据在组件实例对象上是如何存放的.
2.1. setup 钩子函数返回对象
setup
钩子函数 是vue3
新增的选项, 是组件内部使用组合式API的入口, 在setup()
函数中返回的对象
会暴露给模板和组件实例, 其他选项也可以通过组件实例来获取setup()
暴露的属性
我们使用mounted
钩子函数输出组件实例对象, 即this
的值, 查看setup
返回值是否在组件实例对象上
示例:
import {
defineComponent } from "vue";
export default defineComponent({
setup() {
// 声明数据
const msg = "hello";
// 返回数据对象
return {
msg };
},
mounted() {
console.log("this", this);
},
});
控制台输出结果:
你应该很明确看到,在组件实例对象上, 具有setup
返回的数据msg
, 因此setup
返回对象中的数据,可以直接在模板中使用
2.2. setup 钩子函数中不能通过this 获取组件对象
上个实例中我们在mounted
钩子函数中通过this
访问组件实例对象. 如果我们在setup
中需要使用组件实例对象怎么办? , 我们第一反应应该是使用this
来获取, 看示例
示例:
import {
defineComponent, } from "vue";
export default defineComponent({
setup() {
console.log("this", this);
// 声明响应式数据
const msg = "hello ";
// 返回数据对象
return {
msg };
}
});
运行结果:
// 控制台输出结果
this undefined
通过控制台输出的结果, 你就会发现, 在setup
中使用this
无法获取到组件的实例对象.
主要原因在于:
setup 钩子先于组件实例化对象创建之前调用
记住这句话,很重要, 也就是说在执行setup
钩子函数时, 组件对象还未创建完成. 就像vue2
中beforeCreate
钩子函数一样, 无法通过this
获取组件对象
如果你此时查看vue3
文档中的组件生命周期图, 你就会发现setup
钩子函数是在beforeCreate
钩子函数之前调用的, beforeCreate
钩子函数都无法通过this
获取的上下文组件对象, setup
可想而知
vue3
组件生命周期图:
2.3. setup 钩子函数获取组件实例对象
在某些场景下, 我们可能需要通过组件对象访问组件上的数据, 但我们又无法通过this
来获取到组件对象, 那该怎么办呢?
其实你不用担心, vue3
给我们提供了一个全局的getCurrentInstance
函数, 获取组件实例对象.
但需要注意的是getCurrentInstance
获取的组件对象和this
获取的组件对象不太一样.我们通过示例查看getCurrentInstance
返回值
示例:
<template