第三节: 一文带你全面理解 vue3 新增 setup 选项的使用

前言

上一节, 我们分析了官网中通用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);
  },
});

控制台输出结果:

img

你应该很明确看到,在组件实例对象上, 具有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钩子函数时, 组件对象还未创建完成. 就像vue2beforeCreate钩子函数一样, 无法通过this获取组件对象

如果你此时查看vue3文档中的组件生命周期图, 你就会发现setup钩子函数是在beforeCreate钩子函数之前调用的, beforeCreate钩子函数都无法通过this获取的上下文组件对象, setup可想而知

vue3组件生命周期图:

img


2.3. setup 钩子函数获取组件实例对象

在某些场景下, 我们可能需要通过组件对象访问组件上的数据, 但我们又无法通过this来获取到组件对象, 那该怎么办呢?

其实你不用担心, vue3给我们提供了一个全局的getCurrentInstance函数, 获取组件实例对象.

但需要注意的是getCurrentInstance获取的组件对象和this获取的组件对象不太一样.我们通过示例查看getCurrentInstance返回值

示例:

<template
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员付杰

欢迎投喂, 一起共享知识的盛宴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值