程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Vue2

  • Vue3

    • 初识Vue3
    • 组合式API
    • Vue3中的data数据
    • vue3 的 script标签
    • setup函数中执行顺序
    • toRefs() 与 toRef()
    • computed()
    • Vue3弱化this
    • watch() 和 watchEffec()
    • define函数用法
    • defineExpose() 和 ref 属性
    • vue.config.js
    • 生命周期
    • Vue3全局API调用
    • 自定义 Hook
    • 传递数据(props)
    • 路由
    • pinia
    • 组件通信
    • getCurrentInstance() 和 nextTick()
      • 1. getCurrentInstance()
        • 什么是 getCurrentInstance?
        • 它能干什么?
        • 用法
        • 常见的功能
        • 举个例子
        • 用人话总结
      • 2. nextTick()
        • 概念
        • 语法
        • 常见场景
        • 总结
    • Vue3 新组件
  • vue3 + TS 项目集成

  • Vue全家桶
  • Vue3
scholar
2024-08-05
目录

getCurrentInstance() 和 nextTick()

# getCurrentInstance() 和 nextTick()

# 1. getCurrentInstance()

# 什么是 getCurrentInstance?

简单来说,getCurrentInstance 是 Vue 3 提供的一个“内部工具”,它可以让你在代码中偷偷拿到当前组件的“身份证”,也就是组件的各种信息和功能。

# 它能干什么?

  1. 拿到当前组件的信息,比如它的名字、父组件是谁。
  2. 访问一些特殊的东西,比如:
    • 组件的 props(传入的数据)。
    • 插槽内容(slots)。
    • ref(页面上标记的元素或子组件)。
  3. 调用组件的功能,比如发事件(emit)或者访问父组件。
  4. 用在复杂场景,比如和第三方库整合、写插件。

# 用法

import { getCurrentInstance } from 'vue';

const instance = getCurrentInstance(); // 获取当前组件的实例
1
2
3

你现在就拿到了当前组件的“身份证”,可以通过它访问各种东西。

# 常见的功能

  1. proxy 这个是当前组件的代理对象,等同于以前的 this,你可以用它访问组件里的数据和方法。

    const instance = getCurrentInstance();
    console.log(instance.proxy); // 访问当前组件的数据和方法
    
    1
    2
  2. props 获取传给组件的 props。

    const instance = getCurrentInstance();
    console.log(instance.props); // 当前组件接收的 props
    
    1
    2
  3. refs 获取模板里定义的 ref,比如某个 DOM 元素或子组件。

    const instance = getCurrentInstance();
    console.log(instance.refs); // 访问 ref 引用
    
    1
    2
  4. emit 用来触发自定义事件,比如告诉父组件“我干了件事”。

    const instance = getCurrentInstance();
    instance.emit('custom-event', 'payload'); // 触发事件
    
    1
    2
  5. parent 和 root

    • parent:指向父组件。
    • root:指向根组件(最外面的那个)。

# 举个例子

假如我们想知道当前组件的名字和接收的 props,还想打印整个实例,可以这样做:

<template>
  <div>
    <h1>组件实例信息</h1>
    <p>组件名称: {{ instance.type.name }}</p>
    <button @click="logInstance">打印实例信息</button>
  </div>
</template>

<script setup>
import { getCurrentInstance } from 'vue';

const instance = getCurrentInstance(); // 获取当前组件的实例

function logInstance() {
  console.log('当前组件实例:', instance); // 打印整个实例信息
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 用人话总结

  1. getCurrentInstance 是 Vue 的“万能钥匙”,可以让你拿到当前组件的很多信息。
  2. 它就像一个窗口,可以偷偷看见 Vue 的“后台系统”。
  3. 主要用在高级场景,比如需要访问组件实例或者与外部库整合时。

一句话理解: getCurrentInstance 就是帮你拿到当前组件的“内部说明书”,让你可以更灵活地操作组件。

# 2. nextTick()

# 概念

nextTick 是 Vue 提供的一个“小助手”,它的作用是: 等 Vue 把页面上的内容(DOM)更新完之后,再执行一些代码。

Vue 会稍微“攒一攒”更新的操作,不是每改一次数据都立刻更新屏幕,这样性能更高。如果你想在数据变化后立刻操作屏幕上的东西,就需要用 nextTick 来保证 “页面先更新好,再执行你的代码”。

# 语法

import { nextTick } from 'vue';

nextTick(() => {
  // 页面更新完成后执行的代码
});
1
2
3
4
5
  • 参数:一个回调函数,在页面更新完成后执行。
  • 返回值:一个 Promise,可以用 .then() 来处理后续逻辑。

# 常见场景

  1. 数据变化后操作页面内容 数据更新后,页面内容(DOM)可能还没改过来。如果你急着操作,会遇到旧的内容。用 nextTick 可以确保页面改好了再去操作。
  2. 动画和过渡效果 在加动画时,必须保证页面内容已经更新完成,这样动画才会正确运行。
  3. 测试中等待页面更新 在自动化测试里,等页面更新完成再检查结果,可以用 nextTick。

示例

数据更新后操作 DOM

<template>
  <div>
    <h1>计数示例</h1>
    <p>当前计数: {{ count }}</p>
    <button @click="incrementCount">增加计数</button>
  </div>
</template>

<script setup>
import { ref, nextTick } from 'vue';

// 定义一个计数器
const count = ref(0);

function incrementCount() {
  count.value++; // 数据更新
  console.log('计数增加到:', count.value);

  // 使用 nextTick,等页面更新后再弹出信息
  nextTick(() => {
    alert(`计数已更新: ${count.value}`); // 确保显示的是最新的计数
    console.log('页面更新后:', count.value);
  });
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

发生了什么?

  1. 点击按钮,count 增加。
  2. Vue 更新页面,但它不会立即完成。
  3. nextTick 确保页面更新完成后,弹出最新的计数。

# 总结

用人话来说: nextTick 就是告诉 Vue: “我知道你需要花点时间把页面更新好,那我等等你,等你弄完我再继续干别的事。”

用它可以确保:

  • 数据改了后,页面内容确实更新好了,再去操作屏幕上的东西。
  • 在动画、测试等需要“页面先准备好”的场景中,保证操作是对的。

一句话:“等 Vue 把屏幕上的东西改好,我再出手。”

编辑此页 (opens new window)
上次更新: 2025/02/01, 02:18:15
组件通信
Vue3 新组件

← 组件通信 Vue3 新组件→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式