1、疑难

vue3中应用过getCurrentInstance函数获取组件实例的同学,不晓得你们在应用了getCurrentInstance函数后会不会去想为什么getCurrentInstance函数是一个全局性的函数,它能够获取到组件实例?它是怎么实现的?

2、实现原理

原理为:

  • vue定义了一个全局的currentInstance变量,在执行组件的setup函数前将currentInstance变量赋值为以后组件实例(组件实例早曾经创立好了),接着执行setup函数,setup函数执行结束后将currentInstance变量置为null;至此currentInstance变量更新结束

这里又引发另一个疑难:一个页面中有几十上百个平行或嵌套的组件,调用getCurrentInstance的时候怎么能确保获取的就是以后组件的实例呢?

  • 这得益于js是单线程的,在同一个宏工作中所有代码都是从上往下执行的,并且vue组件也是从整个组件树中从上往下初始化(能够了解为组件的setup函数是从整个组件树中从上往下开始执行,它们是串行的),有了这2个根底条件getCurrentInstance函数的实现形式就行的通。
    currentInstance值变动过程

    组件setup执行程序

留神:getCurrentInstance函数只有在setup函数中的同步代码中调用才无效,在异步代码中有效(如:Promise、事件、网络申请、setTimeout),因为setup函数自身执行结束后currentInstance变量的值会被置为null

这个点在之前的vue官网文档中是有阐明的,但当初的vue官网文档中曾经找不到getCurrentInstance函数的文档了(截止工夫:2023-02-21)