精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:來談?wù)刅ue3的Provide和Inject實(shí)現(xiàn)多級(jí)傳遞的原理

開發(fā) 前端
在孫子組件中,他的parent就是子組件。前面我們講過了如果沒有在組件內(nèi)使用provide?注入東西(很明顯這里的子組件確實(shí)沒有注入任何東西),那么就會(huì)直接使用他的父組件的provides?屬性對(duì)象,所以這里的子組件是直接使用的是父組件中的provides?屬性對(duì)象。

前言

沒有看過provide和inject函數(shù)源碼的小伙伴可能覺得他們實(shí)現(xiàn)數(shù)據(jù)多級(jí)傳遞非常神秘,其實(shí)他的源碼非常簡(jiǎn)單,這篇文章歐陽來講講provide和inject函數(shù)是如何實(shí)現(xiàn)數(shù)據(jù)多級(jí)傳遞的。ps:本文中使用的Vue版本為3.5.13。

看個(gè)demo

先來看個(gè)demo,這個(gè)是父組件,代碼如下:

<template>
  <ChildDemo />
</template>

<script setup>
import ChildDemo from "./child.vue";
import { ref, provide } from "vue";
// 提供響應(yīng)式的值
const count = ref(0);
provide("count", count);
</script>

在父組件中使用provide為后代組件注入一個(gè)count響應(yīng)式變量。

再來看看子組件child.vue代碼如下:

<template>
  <GrandChild />
</template>
<script setup>
import GrandChild from "./grand-child.vue";
</script>

從上面的代碼可以看到在子組件中什么事情都沒做,只渲染了孫子組件。

我們?cè)賮砜纯磳O子組件grand-child.vue,代碼如下:

<script setup>
import { inject } from "vue";

// 注入響應(yīng)式的值
const count = inject("count");
console.log("inject count is:", count);
</script>

從上面的代碼可以看到在孫子組件中使用inject函數(shù)拿到了父組件中注入的count響應(yīng)式變量。

provide函數(shù)

我們先來debug看看provide函數(shù)的代碼,給父組件中的provide函數(shù)打個(gè)斷點(diǎn),如下圖:

圖片圖片

刷新頁面,此時(shí)代碼將會(huì)停留在斷點(diǎn)處。讓斷點(diǎn)走進(jìn)provide函數(shù),代碼如下:

function provide(key, value) {
  if (!currentInstance) {
    if (!!(process.env.NODE_ENV !== "production")) {
      warn$1(`provide() can only be used inside setup().`);
    }
  } else {
    let provides = currentInstance.provides;
    const parentProvides = currentInstance.parent && currentInstance.parent.provides;
    if (parentProvides === provides) {
      provides = currentInstance.provides = Object.create(parentProvides);
    }
    provides[key] = value;
  }
}

首先判斷currentInstance是否有值,如果沒有就說明當(dāng)前沒有vue實(shí)例,也就是說當(dāng)前調(diào)用provide函數(shù)的地方是不在setup函數(shù)中執(zhí)行的,然后給出警告provide只能在setup中使用。

然后走進(jìn)else邏輯中,首先從當(dāng)前vue實(shí)例中取出存的provides屬性對(duì)象。并且通過currentInstance.parent.provides拿到父組件vue實(shí)例中的provides屬性對(duì)象。

這里為什么需要判斷if (parentProvides === provides)呢?

因?yàn)樵趧?chuàng)建子組件時(shí)會(huì)默認(rèn)使用父組件的provides屬性對(duì)象作為父組件的provides屬性對(duì)象。代碼如下:

const instance: ComponentInternalInstance = {
  uid: uid++,
  vnode,
  type,
  parent,
  provides: parent ? parent.provides : Object.create(appContext.provides),
  // ...省略
}

從上面的代碼可以看到如果有父組件,那么創(chuàng)建子組件實(shí)例的時(shí)候就直接使用父組件的provides屬性對(duì)象。

所以這里在provide函數(shù)中需要判斷if (parentProvides === provides),如果相等說明當(dāng)前父組件和子組件是共用的同一個(gè)provides屬性對(duì)象。此時(shí)如果子組件調(diào)用了provide函數(shù),說明子組件需要?jiǎng)?chuàng)建自己的provides屬性對(duì)象。

并且新的屬性對(duì)象還需要能夠訪問到父組件中注入的內(nèi)容,所以這里以父組件的provides屬性對(duì)象為原型去創(chuàng)建一個(gè)新的子組件的,這樣在子組件中不僅能夠訪問到原型鏈中注入的provides屬性對(duì)象,也能夠訪問到自己注入進(jìn)去的provides屬性對(duì)象。

最后就是執(zhí)行provides[key] = value將當(dāng)前注入的內(nèi)容存到provides屬性對(duì)象中。

inject函數(shù)

我們?cè)賮砜纯磇nject函數(shù)是如何隔了一層子組件從父組件中如何取出數(shù)據(jù)的,還是一樣的套路,給孫子組件中的inject函數(shù)打個(gè)斷點(diǎn)。如下圖:

圖片圖片

將斷點(diǎn)走進(jìn)inject函數(shù),代碼如下:

export function inject(
  key: InjectionKey<any> | string,
  defaultValue?: unknown,
  treatDefaultAsFactory = false,
) {
  // fallback to `currentRenderingInstance` so that this can be called in
  // a functional component
  const instance = currentInstance || currentRenderingInstance

  // also support looking up from app-level provides w/ `app.runWithContext()`
  if (instance || currentApp) {
    const provides = currentApp
      ? currentApp._context.provides
      : instance
        ? instance.parent == null
          ? instance.vnode.appContext && instance.vnode.appContext.provides
          : instance.parent.provides
        : undefined

    if (provides && key in provides) {
      return provides[key]
    } else if (arguments.length > 1) {
      return treatDefaultAsFactory && isFunction(defaultValue)
        ? defaultValue.call(instance && instance.proxy)
        : defaultValue
    } else if (__DEV__) {
      warn(`injection "${String(key)}" not found.`)
    }
  } else if (__DEV__) {
    warn(`inject() can only be used inside setup() or functional components.`)
  }
}

首先拿到當(dāng)前渲染的vue實(shí)例賦值給本地變量instance。接著使用if (instance || currentApp)判斷當(dāng)前是否有vue實(shí)例,如果沒有看看有沒有使用app.runWithContext手動(dòng)注入了上下文,如果注入了那么currentApp就有值。

接著就是一串三元表達(dá)式,如果使用app.runWithContext手動(dòng)注入了上下文,那么就優(yōu)先從注入的上下文中取出provides屬性對(duì)象。

如果沒有那么就看當(dāng)前組件是否滿足instance.parent == null,也就是說當(dāng)前組件是否是根節(jié)點(diǎn)。如果是根節(jié)點(diǎn)就取app中注入的provides屬性對(duì)象。

如果上面的都不滿足就去取父組件中注入的provides屬性對(duì)象,前面我們講過了在inject函數(shù)階段,如果子組件內(nèi)沒有使用inject函數(shù),那么就會(huì)直接使用父組件的provides屬性對(duì)象。如果子組件中使用了inject函數(shù),那么就以父組件的provides屬性對(duì)象為原型去創(chuàng)建一個(gè)新的子組件的provides屬性對(duì)象,從而形成一條原型鏈。

所以這里的孫子節(jié)點(diǎn)的provides屬性對(duì)象中當(dāng)然就能夠拿到父組件中注入的count響應(yīng)式變量,那么if (provides && key in provides)就滿足條件,最后會(huì)走到return provides[key]中將父組件中注入的響應(yīng)式變量count原封不動(dòng)的返回。

還有就是如果我們inject一個(gè)沒有使用provide存入的key,并且傳入了第二個(gè)參數(shù)defaultValue,此時(shí)else if (arguments.length > 1)就滿足條件了。

在里面會(huì)去判斷是否傳入第三個(gè)參數(shù)treatDefaultAsFactory,如果這個(gè)參數(shù)的值為true,說明第二個(gè)參數(shù)defaultValue可能是一個(gè)工廠函數(shù)。那么就執(zhí)行defaultValue.call(instance && instance.proxy)將defaultValue的當(dāng)中工廠函數(shù)的執(zhí)行結(jié)果進(jìn)行返回。

如果第三個(gè)參數(shù)treatDefaultAsFactory的值不為true,那么就直接將第二個(gè)參數(shù)defaultValue當(dāng)做默認(rèn)值返回。

總結(jié)

這篇文章講了使用provide和inject函數(shù)是如何實(shí)現(xiàn)數(shù)據(jù)多級(jí)傳遞的。

在創(chuàng)建vue組件實(shí)例時(shí),子組件的provides屬性對(duì)象會(huì)直接使用父組件的provides屬性對(duì)象。如果在子組件中使用了provide函數(shù),那么會(huì)以父組件的provides屬性對(duì)象為原型創(chuàng)建一個(gè)新的provides屬性對(duì)象,并且將provide函數(shù)中注入的內(nèi)容塞到新的provides屬性對(duì)象中,從而形成了原型鏈。

在孫子組件中,他的parent就是子組件。前面我們講過了如果沒有在組件內(nèi)使用provide注入東西(很明顯這里的子組件確實(shí)沒有注入任何東西),那么就會(huì)直接使用他的父組件的provides屬性對(duì)象,所以這里的子組件是直接使用的是父組件中的provides屬性對(duì)象。所以在孫子組件中可以直接使用inject函數(shù)拿到父組件中注入的內(nèi)容。

責(zé)任編輯:武曉燕 來源: 前端歐陽
相關(guān)推薦

2021-05-27 10:36:34

ProvideInjectVue3

2021-12-09 08:49:14

Vue 3 Provide Inject

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2024-04-11 13:10:00

Vue3Reactive響應(yīng)性

2024-06-13 08:01:19

2022-06-29 16:59:21

Vue3Vue2面試

2018-10-22 14:28:26

面試官數(shù)據(jù)公司

2024-03-14 14:56:22

反射Java數(shù)據(jù)庫連接

2024-12-06 07:00:00

2024-07-31 08:28:37

DMAIOMMap

2024-09-20 08:36:43

零拷貝數(shù)據(jù)傳輸DMA

2024-03-22 06:56:24

零拷貝技術(shù)數(shù)據(jù)傳輸數(shù)據(jù)拷貝

2025-07-18 07:19:00

2025-03-07 00:00:10

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2020-12-09 10:29:53

SSH加密數(shù)據(jù)安全

2024-09-25 12:26:14

2025-10-31 02:00:00

2025-02-28 00:00:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲欧美日韩精品久久久| 中文字幕亚洲自拍| 欧美日韩亚洲第一| 9色在线视频网站| 国产一区在线观看视频| 欧美肥婆姓交大片| 伊人网在线视频观看| 久久伊人国产| 成人福利视频在线| 日韩三级视频中文字幕| 日本网站免费在线观看| 成人动漫在线免费观看| 国产成人精品免费网站| 日本精品视频在线观看| 久草综合在线视频| 制服下的诱惑暮生| 国产超碰人人模人人爽人人添| 中文字幕亚洲精品乱码| 国产午夜精品久久久| 国产999免费视频| 周于希免费高清在线观看| 亚洲欧洲视频在线观看| 日韩欧美激情电影| 色婷婷综合中文久久一本| 宅男噜噜99国产精品观看免费| 人人妻人人澡人人爽久久av | 日本视频精品一区| 7788色淫网站小说| 国产福利一区二区三区在线播放| 亚洲综合偷拍欧美一区色| 欧美在线播放一区二区| 人妻无码一区二区三区久久99| 在线免费看91| 国产欧美自拍| 亚洲成人动漫av| 在线观看福利一区| www在线免费观看| 久久一区二区视频| 懂色中文一区二区三区在线视频| 奇米影视首页 狠狠色丁香婷婷久久综合 | 亚洲激情另类| 久久久精品一区| 波多野结衣欲乱| 在线观看黄色国产| 欧美精品啪啪| 久久精品国产免费观看| 国产aaaaaaaaa| 欧美日韩性在线观看| 日韩精品电影网| 精品一区二区视频在线观看| jizz国产精品| 精品国产a毛片| 国产精品手机在线观看| 欧美福利在线播放网址导航| 亚洲成人在线网| 国产精品入口麻豆| 欧美亚洲国产日韩| 亚洲精品一区二三区不卡| 极品粉嫩小仙女高潮喷水久久| 人妖一区二区三区| 亚洲人成网站在线播| 无码人妻丰满熟妇啪啪欧美| 成人精品亚洲| 久久亚洲精品一区| 久久免费精彩视频| 日韩网站在线| 国产成人一区三区| 夜夜嗨aⅴ一区二区三区| 精品在线免费观看| aa日韩免费精品视频一| 欧洲成人一区二区三区| 91在线国产观看| 天堂av一区二区| 91中文在线| 欧美日韩国产精品一区二区不卡中文 | 成人性生交大片免费观看嘿嘿视频| 国产亲伦免费视频播放| 夫妻av一区二区| 欧洲精品码一区二区三区免费看| 伊人在线视频| 性做久久久久久久久| 国产精品欧美激情在线观看| 国产精品原创视频| 91精品国产麻豆| 欧洲一级黄色片| 欧美aaaa视频| 91精品国产九九九久久久亚洲| 波多野结衣视频网址| 国产乱理伦片在线观看夜一区| 韩国精品一区二区三区六区色诱| 黄色网址在线播放| 一区二区三区在线视频免费| 国产精品免费入口| 精品久久国产一区| 亚洲免费一在线| tube国产麻豆| 久久国产日韩| 97中文在线| 国产精品免费观看| 亚洲综合在线视频| jizz18女人| 日韩中文av| 精品中文字幕在线| 在线观看色网站| 97精品国产露脸对白| 中文字幕一区二区三区最新| 色在线免费观看| 日韩一区二区在线观看视频| 极品人妻videosss人妻| 99热免费精品在线观看| 成人疯狂猛交xxx| 国产在线三区| 日韩欧美a级成人黄色| 色欲无码人妻久久精品| 色乱码一区二区三区网站| 欧美中文字幕在线| 亚洲欧美日韩免费| 亚洲一区二区三区视频在线| 日本国产一级片| 精品日韩免费| 日本精品视频在线| 四虎影视在线播放| 天天影视网天天综合色在线播放 | 波多野结衣一区二区三区在线 | 极品盗摄国产盗摄合集| 毛片av中文字幕一区二区| 欧美精品久久久| 在线观看的网站你懂的| 欧美精品亚洲一区二区在线播放| 国内精品卡一卡二卡三| 久久一区视频| 免费国产一区二区| 欧美调教sm| 日韩www在线| 性无码专区无码| 91在线视频免费观看| 国产精品333| 狠狠久久伊人| 午夜精品一区二区三区视频免费看 | 特一级黄色录像| 国精品**一区二区三区在线蜜桃| 亚洲蜜桃av| 懂色aⅴ精品一区二区三区| 国产一区二区三区视频免费| 91麻豆精品在线| 欧美高清在线一区二区| 国产九九在线视频| 欧美成人激情| 91亚洲精品丁香在线观看| 黄色网页在线播放| 日韩无一区二区| 五月天婷婷网站| 93久久精品日日躁夜夜躁欧美| 性一交一乱一伧国产女士spa| 538任你躁精品视频网免费| 久久久久久这里只有精品| 手机看片一区二区| 一本一道久久a久久精品| 亚洲黄色小说视频| 激情都市一区二区| 国产乱淫av片杨贵妃| 欧美调教在线| 国产精品91一区| 亚洲成a人v欧美综合天堂麻豆| 制服丝袜av成人在线看| 久草视频免费在线| 97国产一区二区| 亚洲国产成人va在线观看麻豆| 欧美一区成人| 国产综合 伊人色| 成人涩涩视频| 欧美日本中文字幕| 日本大臀精品| 欧美日韩国产三级| 国产福利久久久| 久久蜜桃av一区二区天堂| 麻豆三级在线观看| 欧美日韩免费观看一区=区三区| 久久国产精品久久精品国产| av在线不卡精品| 欧美激情三级免费| 国产美女性感在线观看懂色av| 911精品国产一区二区在线| 精品久久免费视频| 国产精品免费人成网站| 中文字幕人妻熟女在线| 视频一区二区三区中文字幕| 看全色黄大色大片| 亚洲国产合集| 91亚洲精品久久久久久久久久久久| 97caopor国产在线视频| 亚洲欧美成人精品| www.97av| 欧美系列亚洲系列| 91蜜桃视频在线观看| 国产精品入口麻豆九色| 亚洲成人av免费在线观看| 日韩中文字幕麻豆| 成人性免费视频| 欧美a级成人淫片免费看| 久久久久九九九| 日本伊人久久| 国产精自产拍久久久久久| 99在线视频影院| 日本黄色动态图| 成人不卡视频| 色综合久久悠悠| 大胆av不用播放器在线播放| 91精品国产高清一区二区三区| www.com国产| 国产精选久久| 欧洲亚洲妇女av| 激情图片在线观看高清国产| 一区二区三区无码高清视频| 秋霞视频一区二区| 日韩一区二区在线播放| 一二三四区在线| 欧美专区亚洲专区| 精品人妻无码一区二区性色| 亚洲国产乱码最新视频 | 鲁一鲁一鲁一鲁一av| 国产视频一区三区| 日韩亚洲欧美一区二区| 我不卡伦不卡影院| 一本色道久久综合亚洲二区三区| 国产成人高清| 蜜桃传媒视频麻豆一区 | 亚洲在线欧美| 成人网18免费网站| 日韩在线第一区| 狠狠色狠狠色综合婷婷tag| 欧美国产综合视频| 网友自拍一区| 欧美久久在线| 亚洲都市激情| 日韩av电影免费播放| 真实原创一区二区影院| 蜜桃视频在线观看91| 欧美重口另类| 女人一区二区三区| 国产欧美一区二区精品久久久| 欧美一区1区三区3区公司 | 国产日产欧美一区二区三区| 日本黄色网址大全| 久久午夜老司机| 中文字幕第20页| 国产精品人人做人人爽人人添| 永久免费av无码网站性色av| 中文字幕电影一区| 黄色录像一级片| 亚洲精品免费在线播放| 久久久精品91| 午夜电影久久久| 欧美一区二区三区四| 色综合 综合色| 亚洲午夜在线播放| 538在线一区二区精品国产| 精品二区在线观看| 精品国产露脸精彩对白 | 久久精品电影网站| 91黄色在线| 午夜精品一区二区三区在线播放| 国产拍在线视频| 国产精品96久久久久久又黄又硬| 欧美视频免费看| av成人午夜| 久久爱www成人| 一区二区精品在线观看| 欧美日韩天堂| 青青草原av在线播放| 蜜臀99久久精品久久久久久软件| 激情文学亚洲色图| 成人va在线观看| 蜜桃久久精品成人无码av| 中文字幕永久在线不卡| 国产精彩视频在线| 欧美视频在线观看一区二区| 99国产揄拍国产精品| 亚洲加勒比久久88色综合| 可以在线观看的av| 欧美大胆a视频| 韩国美女久久| 亚洲淫片在线视频| 视频国产一区| 日本a在线天堂| 久久久人人人| 三大队在线观看| 国产色爱av资源综合区| 青青操视频在线播放| 在线视频国产一区| 好吊视频一区二区三区| 最近2019中文字幕mv免费看 | 日韩一区二区三区观看| 男操女在线观看| 欧美多人乱p欧美4p久久| 日本精品不卡| 国产麻豆乱码精品一区二区三区 | 日韩网站免费观看高清| 高潮在线视频| 成人黄色在线免费| 国产一区二区精品福利地址| 妞干网在线播放| 久久精品av麻豆的观看方式| 色噜噜在线观看| 一区二区三区精品在线| 欧美 亚洲 另类 激情 另类| 亚洲国产精品人人爽夜夜爽| 国产人成网在线播放va免费| 国产精品av网站| 色狠狠久久av综合| 91午夜在线观看| 国产一区美女在线| 久久久精品成人| 色综合色综合色综合色综合色综合| 亚洲av少妇一区二区在线观看 | 日韩精品另类天天更新| 夜久久久久久| 精品国产乱码久久久久夜深人妻| 综合自拍亚洲综合图不卡区| 进去里视频在线观看| 亚洲老头老太hd| 男人的天堂免费在线视频| 亚洲xxx自由成熟| 亚洲国产成人精品女人| 手机视频在线观看| 国产欧美日韩另类一区| 久久夜色精品国产噜噜亚洲av| 亚洲国产女人aaa毛片在线| 蜜臀av在线播放| av资源站久久亚洲| 欧美日韩调教| 久久久久无码精品| 亚洲精品久久嫩草网站秘色| 国产高清视频免费观看| 久久成人综合视频| 精品久久国产一区| 日韩视频一二三| 国产成人免费在线观看不卡| 国产欧美小视频| 91精品欧美一区二区三区综合在| 在线观看免费黄色| 91老司机在线| 欧美 日韩 国产一区二区在线视频 | 国产乱码字幕精品高清av| 三级在线观看免费大全| 91精品国模一区二区三区| 大地资源网3页在线观看| 91免费在线视频网站| 欧美a级一区| 国产a级黄色片| 欧美性高潮在线| se在线电影| 亚洲a区在线视频| 亚洲无线视频| 久久精品一区二区免费播放 | 成人激情在线| 天天久久综合网| 亚洲国产aⅴ成人精品无吗| 色哟哟国产精品色哟哟| 欧美最猛黑人xxxx黑人猛叫黄| 免费欧美激情| 日韩欧美亚洲另类| 亚洲国产综合91精品麻豆| 国产又爽又黄网站亚洲视频123| 奇门遁甲1982国语版免费观看高清| 精品国产91乱码一区二区三区四区| 午夜国产一区二区三区| 亚洲精品你懂的| 国 产 黄 色 大 片| 日韩av不卡电影| 99精品视频在线观看播放| 国产老头和老头xxxx×| 香蕉乱码成人久久天堂爱免费| 六十路在线观看| 91免费综合在线| 久久精品网址| 一区视频免费观看| 精品第一国产综合精品aⅴ| 蜜桃在线视频| 国产一区一区三区| 97aⅴ精品视频一二三区| 91久久久久国产一区二区| 国模精品一区二区三区色天香| 久草成人资源| aaaaa黄色片| 日本韩国一区二区三区视频| 在线heyzo| 日韩久久久久久久| 成人午夜又粗又硬又大| 中文字幕av片| 国外成人免费在线播放 | 国产欧美日本一区视频| 韩国av永久免费| 成人黄色网免费| 久久先锋影音| 久久免费视频6| 欧美精品18+| 色呦呦呦在线观看| 欧美精品二区三区四区免费看视频| 国产呦精品一区二区三区网站|