26-mini-vue getCurrentInstance

实现 getCurrentInstance

  1. 作用

    • getCurrentInstance 用于获取当前组件实例,通常在 setup 函数中使用
    • 可以获取组件的 propsslotsemit 等信息
    • 只能在 setup 函数或生命周期钩子中使用
    • 还可以获取虚拟节点的类型,根据不同类型做不同的处理
  2. 实现思路

    • 创建一个全局变量来存储当前正在执行的组件实例
    • setup 函数执行前,将当前实例存储到全局变量中
    • setup 函数执行后,清空全局变量
    • getCurrentInstance 函数返回当前存储的实例
  3. 具体实现

    js 复制代码
    // runtime-core/component.ts
    let currentInstance = null; // ✅ 创建全局变量存储当前实例
    
    export function getCurrentInstance() {
      return currentInstance; // ✅ 返回当前实例
    }
    
    function setupStatefulComponents(instance: any) {
      const Component = instance.vnode.type;
      const { setup } = Component;
      instance.proxy = new Proxy({ _: instance }, PublicInstanceProxyHandlers);
      if (setup) {
        currentInstance = instance; // ✅ 在 setup 执行前,保存当前实例
        const setupResult = setup(shallowReadonly(instance.props), {
          emit: instance.emit,
        });
        currentInstance = null; // ✅ setup 执行后,清空当前实例
        handleSetupResult(instance, setupResult);
      }
    }
  4. 导出 getCurrentInstance

    js 复制代码
    // runtime-core/index.ts
    export { createApp } from "./createApp";
    export { h } from "./h";
    export { renderSlots } from "./helpers/renderSlots";
    export { createTextVNode } from "./vnode";
    export { getCurrentInstance } from "./component"; // ✅ 导出 getCurrentInstance
  5. 使用示例

    js 复制代码
    // example/App.js
    import { h, getCurrentInstance } from "../../lib/guide-mini-vue.esm.js";
    
    export const App = {
      name: "App",
      setup() {
        const instance = getCurrentInstance(); // ✅ 获取当前组件实例
        console.log("当前组件实例:", instance);
        console.log("props:", instance.props);
        console.log("slots:", instance.slots);
        return {};
      },
      render() {
        return h("div", {}, "app");
      },
    };
  6. 注意事项

    • getCurrentInstance 只能在 setup 函数执行期间调用
    • 如果在 setup 函数外部调用,会返回 null
    • 主要用于高级场景,如组件库开发、工具函数等
  7. 重构

    优点: 将 currentInstance 相关的逻辑进行封装,代码更加清晰易懂,后续维护也更方便。

js 复制代码
// runtime-core/component.ts
function setupStatefulComponents(instance: any) {
 const Component = instance.vnode.type
 const { setup } = Component
 // 注意:这里的虚拟节点是属于 component 的
 instance.proxy = new Proxy({_: instance}, PublicInstanceProxyHandlers)
 if(setup) {
  setCurrentInstance(instance)
  const setupResult = setup(shallowReadonly(instance.props),{
    emit: instance.emit
  })
  setCurrentInstance(null)
  handleSetupResult(instance, setupResult) // 将状态结果进心处理
 }
}

let currentInstance = null; // ✅ 创建全局变量存储当前实例
export function getCurrentInstance(instance: any) {
  return currentInstance
}
export function setCurrentInstance(instance: any) { // ✅ 设置当前实例
  currentInstance = instance
}
相关推荐
Z兽兽2 小时前
React@18+Vite项目配置env文件
前端·react.js·前端框架
SuniaWang3 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
A_nanda3 小时前
根据AI提示排查vue前端项目
前端·javascript·vue.js
happymaker06264 小时前
web前端学习日记——DAY05(定位、浮动、视频音频播放)
前端·学习·音视频
~无忧花开~4 小时前
React状态管理完全指南
开发语言·前端·javascript·react.js·前端框架
LegendNoTitle4 小时前
计算机三级等级考试 网络技术 选择题考点详细梳理
服务器·前端·经验分享·笔记·php
@大迁世界4 小时前
1.什么是 ReactJS?
前端·javascript·react.js·前端框架·ecmascript
BJ-Giser5 小时前
Cesium 基于EZ-Tree的植被效果
前端·可视化·cesium
王码码20356 小时前
Flutter for OpenHarmony:Flutter 三方库 algoliasearch 毫秒级云端搜索体验(云原生搜索引擎)
android·前端·git·flutter·搜索引擎·云原生·harmonyos
发现一只大呆瓜6 小时前
深入浅出 AST:解密 Vite、Babel编译的底层“黑盒”
前端·面试·vite