vue3的getCurrentInstance获取组件实例踩坑记录

news2024/11/14 3:32:49

一、getCurrentInstance基本用法

我们可以通过 getCurrentInstance这个函数来返回当前组件的实例对象,也就是当前vue这个实例对象
Vue2中,可以通过this来获取当前组件实例
Vue3中,在setup中无法通过this获取组件实例,console.log(this)打印出来的值是undefined

在Vue3中,getCurrentInstance()可以用来获取当前组件实例
常见的用途包括:

  1. 访问组件实例的属性:可以通过 getCurrentInstance().ctxgetCurrentInstance().proxy 来获取当前组件实例的属性。例如,可以使用 getCurrentInstance().ctx.$props 访问组件的 props 属性。

  2. 调用组件实例的方法:可以通过 getCurrentInstance().ctxgetCurrentInstance().proxy 来调用当前组件实例的方法。例如,可以使用 getCurrentInstance().ctx.$emit 来触发组件的自定义事件。

  3. 在生命周期钩子中使用:可以在组件的生命周期钩子中使用 getCurrentInstance() 来获取当前组件实例,以便在钩子函数中访问组件实例的属性或调用组件实例的方法。

请注意getCurrentInstance 的返回值是一个组件实例对象,可以通过 .ctx 来访问该实例的上下文对象,或者通过 .proxy 来访问该实例的代理对象。两者的区别在于,通过 .ctx 访问的是真实的组件实例,而通过 .proxy 访问的是一个代理对象,该代理对象可以在模板中直接使用。

基本使用:

import { getCurrentInstance, onMounted} from 'vue'
export default {
    setup() {
        onMounted(() => {
            const instance = getCurrentInstance()
            console.log('实例', instance)
        })
        return {}
     }

打印出来的内容如下
在这里插入图片描述
我们可以根据自己的需求使用当前实例的一些属性和方法,比如我们获取当前组件中某个div的dom

代码如下:

<template>
    <div id="cx-container" :ref="refName">
    </div>
</template>
<script>
import { getCurrentInstance, onMounted} from 'vue'
export default {
    setup() {
        const refName = 'cxContainer'
        onMounted(() => {
            const instance = getCurrentInstance().ctx
            const dom = instance.$refs[refName]
            console.log('dom', dom)
        })
        return {
       		 refName 
        }
     }
</script>

打印结果如下:
在这里插入图片描述
可以看到成功的获取了dom

注意:这种获取dom方式不推荐使用,具体见下文

二、getCurrentInstance使用注意点

1. getCurrentInstance 只能在 setup 或生命周期钩子中使用

举个例子:

<script>
import { getCurrentInstance, onMounted} from 'vue'
export default {
    setup() {
        const refName = 'cxContainer'
        const onResize = () => {
            const instance = getCurrentInstance()
        	console.log('instance', instance)		
        }
        onMounted(() => {
            window.addEventListener('resize', onResize)
        })
        return {
       		 refName 
        }
     }
</script>

以上代码我们将const instance = getCurrentInstance()放在了onResize函数中,然后在onMounted中监听浏览器尺寸变化,尺寸变化就出发onResize函数。
打印结果如下:
在这里插入图片描述
可以看到instancenull,
这时如果我们将const instance = getCurrentInstance()放到setup函数中,或者onMounted中就可以成功获取实例

如需在 setup或生命周期钩子外使用,先在 setup 中调用 getCurrentInstance() 获取该实例然后再使用。

2. getCurrentInstance线上环境报错问题

本地代码

<script>
    import {getCurrentInstance} from "vue";
    export default {
      setup() {
         const {ctx} = getCurrentInstance();
         console.log('ctx', ctx)
      }
    
</script>

以上代码在本地开发调试没有问题,在线上环境会报错,如果通过这个ctx.$refs[xxx]获取dom,线上就会有问题
解决方案

使用proxy代替ctx,proxy线上不会出现问题

const { proxy } = getCurrentInstance()  

三、在vue3中不推荐使用getCurrentInstance获取组件实例

大家可以看看这位大佬的记录vue3中getCurrentInstance不推荐使用以及在<script setup>中获取全局内容(三种方式)

官方解释:
主要还是 getCurrentInstance 是一个内部的API,并不是公开的API,使用内部API去实现一些业务功能,可能会因为后续 Vue 的版本迭代而造成业务上的 BUG。并且 Vue3 的 Composition API 强调的就是业务的解耦和复用性,依赖组件实例属性并不是一个很好的开发方式。而 vue 相关生态的使用其实就是他们内部的事情了,他们有完善的测试用例可以跑测试,但是我们并没有,如果后续的某一个版本Vue变更了这个API,那么如果没有经过完整测试就部署上去的项目就会出现大规模的BUG反馈了
在这里插入图片描述
如果是获取dom大家可以通过ref获取,比如:

<template>
     <div ref="test">hhhhhh</div>
</template>
<script>
import {ref,onMounted } from 'vue'
export default {
    setup() {
        const test = ref(null)
        
        onMounted(() => {
            console.log('test实例',test.value)
         })
        return {
        	test
		}
	}
</script>

打印结果如下:
在这里插入图片描述
至于其他的一些常用属性和方法,vue3中的setup中提供了props和contexts上下文。官方setup用法
props
在这里插入图片描述
context
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch中关于Nasted嵌套查询的介绍:生动案例,通俗易懂,彻底吸收

题注&#xff1a;随着对ES接触的越来越深入&#xff0c;发现此前了解的ES知识点有点单薄&#xff0c;特此寻来ES知识点汇总成的一个思维导图&#xff0c;全面了解自己掌握了哪些&#xff0c;未掌握哪些。此外&#xff0c;作者斌并没有足够的精力学习ES全部的知识点&#xff0c;…

1024程序员节,飞桨星河社区开发者们一起闯关升级、玩转Prompt应用赢大奖~

1024&#xff0c;是属于每一位程序员/程序媛的节日~ 今年&#xff0c;飞桨给星河社区的开发者们也准备了“超级码力 碰撞未来”系列活动&#xff0c;和大家沉浸式玩转闯关冒险。 冲榜单 零代码打造爆款Prompt应用 飞桨AI Studio星河社区上线新版文心一言专区&#xff0c;帮助…

代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果

代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果 文章链接&#xff1a;K次取反后最大化的数组和 加油站 分发糖果 视频链接&#xff1a;K次取反后最大化的数组和 加油站 分发糖果 目录 代…

STM TIM(二)输出比较

STM TIM&#xff08;二&#xff09;输出比较 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较 输出比较可以通过比较CNT&#xff08;CNT计数器&#xff09;与CCR寄存器&#xff08;捕获/比较寄存器&#xff09;值的关系&#xff0c;来对输出电平进行置1、置0…

Camtasia2024中文免费版电脑录屏软件

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…

如何理解Go言中的Context?

目前看过除了《go语言程序设计》以外最好的教程&#xff1a;https://www.practical-go-lessons.com 原文&#xff1a;https://www.practical-go-lessons.com/chap-37-context 你将在本章中学到什么&#xff1f; 1.什么是上下文&#xff1f; 2.什么是链表&#xff1f; 3.如何…

DAOS学习笔记及思考

DAOS带来的思考 根据daos docs的描述&#xff0c;DAOS是Intel基于NVMe全新设计开发并开源的异步对象存储&#xff0c;充分利用下一代NVMe技术的优势&#xff0c;对外提供KV存储接口&#xff0c;提供非阻塞事物I/O&#xff0c;端到端完整性&#xff0c;细粒度的数据控制&#x…

班级信息收集小程序

老师们&#xff01;这里有一个超级实用的班级信息收集小程序&#xff0c;让你告别繁琐的手动记录成绩&#xff0c;轻松实现学生自助查询成绩&#xff01;是不是很期待&#xff1f; 什么是成绩查询系统&#xff1f; 成绩查询系统是一种基于互联网和数据库技术的应用程序&#x…

基于springboot+vue实现MOBA类游戏攻略平台项目【项目源码+论文说明】

基于springbootvue实现MOBA类游戏攻略平台 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&a…

HTML5+CSS3+JS小实例:打散文字随机浮动特效

实例:打散文字随机浮动特效 技术栈:HTML+CSS+JS 效果: 源码: 【HTML+JS】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

SRS Config 二 Stream Caster

SRS StreamCaster 1 官网简介 Stream Converter侦听特殊的TCP/UDP端口&#xff0c;接受客户端连接和媒体流&#xff0c;并转成RTMP流&#xff0c;推送给SRS。 简单来说&#xff0c;它将其他流转成RTMP流&#xff0c;工作流如下&#xff1a; Client ---PUSH--> Stream Co…

微信小程序云开发笔记-初始化商城小程序

一 下载小程序工具 下载地址 二 创建小程序 三 初始化小程序 1 把cloudfunctions文件夹内所有文件删除 2 把miniprogram\components下所有文件删除 3 pages文件夹里面只保留index文件夹&#xff0c;其他都删除并修改index文件夹下文件 index.js 把数据清空&#xff0c;只保…

GEAR框架: Tractian的敏捷工程文化

GEAR(齿轮)框架是工业初创公司TRACTIAN提出的敏捷开发框架&#xff0c;强调一切以人为中心&#xff0c;客户需求为最高优先级&#xff0c;互动胜于流程的开发文化。原文: The GEAR Framework — Tractian’s Agile Engineering Culture GEAR框架&#xff0c;由TRACTIAN和Pietro…

国外调查问卷项目赚美金是真的吗?

大家好&#xff0c;我是橙河网络&#xff0c;一家问卷公司老板&#xff0c;这几年国外问卷这个项目比较火热&#xff0c;很多人都靠这个项目赚的盆满钵满&#xff0c;这篇文章就详细介绍一下国外调查问卷项目赚美金是真的吗&#xff1f; 国外问卷调查是一种付费的市场调研方法…

「Java开发指南」如何在MyEclipse中使用JPA和Spring管理事务?(二)

本教程中介绍一些基于JPA/ spring的特性&#xff0c;重点介绍JPA-Spring集成以及如何利用这些功能。您将学习如何&#xff1a; 为JPA和Spring设置一个项目逆向工程数据库表来生成实体实现创建、检索、编辑和删除功能启用容器管理的事务 在上文中&#xff08;点击这里回顾>…

ST 2.0 霍尔FOC 的相关难点总结

文章目录 HALL_Init_Electrical_Angle()Clark 变换获取电流park 变换 , 逆park变换逆park变换的幅度限制扇区计算 https://www.zhihu.com/people/Temo/posts每个相位的执行时间计算 &#xff08;如果自己记录的不够清楚&#xff0c;可以打开同目录。资源文件目录下的&#xff1…

【vue3】依赖注 provide、inject(父组件与儿子、孙子、曾孙子组件之间的传值)

一、基本用法&#xff1a; //父组件 import { ref, provide } from vue const radio ref<string>(red) provide(myColor,radio) //注入依赖//儿子组件、孙子组件、曾孙子组件 import { inject } from vue import type { Ref } from vue; const myColor inject<Ref&l…

保护云数据安全的关键环节是什么?

云数据安全是维护数据隐私和保护关键信息的关键一环。在云中存储和处理数据提供了巨大的便利性和效率&#xff0c;但同时也伴随着风险。本文将介绍保护云数据的关键环节是什么! 1、数据加密&#xff1a;在传输和存储数据时使用强加密是保护数据的基本步骤。确保数据在云中存储时…

C++类与对象,构造函数,析构函数,拷贝构造函数

C类与对象&#xff0c;构造函数&#xff0c;析构函数&#xff0c;拷贝构造函数 1. 类的6个默认成员对象2. 构造函数2.1 概念2.2 特性 3. 析构函数3.1 概念3.2 特性 4. 拷贝构造函数4.1 概念4.2 特性 所属专栏&#xff1a;C“嘎嘎" 系统学习❤️ &#x1f680; >博主首页…

uni-app:实现picker下拉列表的默认值设置

效果 分析 1、在data中将index8的初始值设置为-1&#xff0c;表示未选择任何选项&#xff1a; index8: -1, //选择的下拉列表下标 2、在bindPickerChange8事件处理函数中添加条件判断。如果选择的值是-1&#xff0c;则将this.index8设置为"请输入"&#xff0c;否则将…