Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 概览

  • 响应式系统

  • runtime运行时

  • runtime-core

    • nextTick
    • watch和watchEffect
    • provide和inject
      • schedule调度器
      • directive自定义指令
    • compiler编译

    • 《Vue3源码》笔记
    • runtime-core
    东流
    2024-07-10
    目录

    provide和inject

    # 概述

    provide和inject是Vue3中新增的两个 API,用于实现组件间的通信,这种特性可以使得父组件向其所有子组件提供依赖项,而不需要通过props属性一层层传递。 如果provide提供的值是响应式的,如reactive或者ref创建的,那么injecct注入对应的 key,获取的值也将是响应式的,反之亦然。

    # 源码分析

    # provide

    provide 可以提供任何类型的数据,包括基本类型、对象、函数、响应式对象等。

    function provide(key, value) {
      if (!currentInstance);
      else {
        let provides = currentInstance.provides;
        const parentProvides =
          currentInstance.parent && currentInstance.parent.provides;
        if (parentProvides === provides) {
          provides = currentInstance.provides = Object.create(parentProvides); //保证父子组件的provides是独立的
        }
        provides[key] = value;
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    # inject

    inject 可以注入提供的任何类型的值,并且能够响应式地追踪注入的响应式对象或 ref。

    function inject(key, defaultValue, treatDefaultAsFactory = false) {
      const instance = currentInstance || currentRenderingInstance;
      if (instance || currentApp) {
        const provides = instance
          ? instance.parent == null
            ? instance.vnode.appContext && instance.vnode.appContext.provides
            : instance.parent.provides
          : currentApp._context.provides;
        if (provides && key in provides) {
          return provides[key];
        } else if (arguments.length > 1) {
          return treatDefaultAsFactory && shared.isFunction(defaultValue)
            ? defaultValue.call(instance && instance.proxy)
            : defaultValue;
        } else;
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    编辑 (opens new window)
    上次更新: 2024/07/11, 09:44:06
    watch和watchEffect
    schedule调度器

    ← watch和watchEffect schedule调度器→

    最近更新
    01
    GeoJSON
    05-08
    02
    Circle
    04-15
    03
    CircleMarker
    04-15
    更多文章>
    Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式