精品欧美一区二区三区在线观看 _久久久久国色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)

国产高清精品在线| 欧美绝顶高潮抽搐喷水合集| 亚洲欧美日韩一区二区| 国产精品福利视频| 亚洲精品男人的天堂| 日韩精品一区二区久久| 日韩午夜在线影院| 日本熟妇人妻xxxxx| 国内精品久久久久久野外| av一区二区不卡| 国产精品亚洲综合天堂夜夜| 久久伊人成人网| 国产日产精品一区二区三区四区的观看方式 | 日韩国产成人在线| 欧美日韩在线大尺度| 亚洲天堂免费观看| 女同性αv亚洲女同志| av资源亚洲| 91超碰免费在线| 成av人片一区二区| 91精品免费视频| 国产又黄又猛又粗又爽| 欧美三区不卡| 色阁综合伊人av| 欧美熟妇精品黑人巨大一二三区| a一区二区三区亚洲| 色域天天综合网| 欧美又粗又长又爽做受| 暖暖日本在线观看| 久久久久国产一区二区三区四区| 成人在线免费观看一区| 一级爱爱免费视频| 久久综合亚州| 欧美一级成年大片在线观看| 国产性生活网站| 婷婷激情图片久久| 国产一区二区三区视频免费| 亚洲综合网在线观看| 日韩av影院| 欧美精品一区二区三区四区 | 国产91在线观看| 国产精品一区电影| 日韩欧美一级大片| 日韩av在线播放中文字幕| 2019国产精品自在线拍国产不卡| 久青草免费视频| 欧美日韩亚洲一区在线观看| 欧美精品日韩三级| 国产少妇在线观看| 68国产成人综合久久精品| 中文字幕亚洲综合| 欧美a在线播放| jlzzjlzz亚洲女人| 亚洲色图美腿丝袜| av黄色免费网站| 国产一区99| 中日韩美女免费视频网址在线观看 | 一区二区中文字幕| 亚洲午夜精品久久久久久高潮| 久久久久亚洲AV成人无在| 日韩午夜电影免费看| 欧美日韩一级二级三级| www.国产视频.com| av日韩在线免费观看| 日韩一二三区视频| 亚洲激情 欧美| 日韩精品免费一区二区三区竹菊 | 亚洲人成久久| 欧美又大粗又爽又黄大片视频| 欧美h在线观看| 秋霞午夜鲁丝一区二区老狼| 国产日韩精品一区二区| 国产精品女人久久久| 国产成人亚洲综合a∨猫咪| 国产亚洲福利社区| 精品成人一区二区三区免费视频| 国产欧美精品一区二区色综合朱莉| 性欧美videosex高清少妇| 久cao在线| 性久久久久久久久久久久| 国产极品美女高潮无套久久久| 日韩高清成人| 91麻豆精品国产| 天堂www中文在线资源| 蜜乳av综合| 日韩中文字幕免费| 日本三级中文字幕| 奇米777欧美一区二区| 亚洲精品免费一区二区三区| 色呦呦中文字幕| 国产日韩欧美高清| av动漫在线播放| 深夜福利视频一区二区| 欧美日韩国产精选| 久久av一区二区三| 不卡一区2区| 欧美高清不卡在线| 无码人妻av免费一区二区三区| 国产精品一区二区久久不卡| 爽爽爽爽爽爽爽成人免费观看| 中文字幕亚洲欧美日韩| 欧美性片在线观看| 校园春色综合网| 日韩av片电影专区| www.色播.com| 成人羞羞国产免费网站| 欧洲精品二区| 一本色道a无线码一区v| 日本美女视频一区| 亚洲精品一级二级三级| 久久久精品日本| 欧产日产国产69| 国产精品一区二区免费不卡| 日韩av不卡播放| 不卡一本毛片| 天天干在线影院| 成人福利在线观看视频| 精品久久久久久久久久久久久久| 自拍偷拍21p| 欧美综合精品| 国产精品三级在线观看| 日韩精品亚洲视频| 亚洲高清在线播放| 精品国产午夜肉伦伦影院| 色狠狠一区二区| 性一交一黄一片| 最新在线中文字幕| 视频在线在亚洲| 国内精品国语自产拍在线观看| 999国产在线视频| 捆绑调教美女网站视频一区| 精品一卡二卡三卡四卡日本乱码| 怡红院在线播放| 欧美美女一区二区| 日韩女同一区二区三区| 久久成人免费| 免费在线成人av电影| 国内激情视频在线观看| 亚洲第一二三四五区| 国产一级黄色av| 国产精品99久久久久久久女警| 宅男av一区二区三区| 久久精品国产福利| 最近中文字幕日韩精品| 中文字幕无码乱码人妻日韩精品| 99精品在线| 狠狠操狠狠色综合网| 日本精品一区在线| 天天做天天爱天天综合网| 成人www视频在线观看| 欧美激情视频在线播放| 欧美精选一区二区| 欧美做爰爽爽爽爽爽爽| 激情六月婷婷综合| 欧美一区二区福利| 中国色在线日|韩| 亚洲欧美日韩在线一区| 69成人免费视频| 91麻豆福利精品推荐| 国产免费成人在线| 网曝91综合精品门事件在线| 国模吧一区二区| 免费观看a视频| 亚洲国产日韩精品| 国产老熟女伦老熟妇露脸| 亚洲一级网站| 国产精品一级久久久| 91九色porn在线资源| 精品国产一区二区三区四区四 | 国产毛片精品| 欧美激情精品久久久久久变态 | 成人综合婷婷国产精品久久| av影院在线播放| 亚洲精品一区二区三区在线| 欧美疯狂xxxx大交乱88av| 亚洲第一视频在线| 日韩欧美精品网址| 中文字幕第24页| 美国毛片一区二区| 黄色污污在线观看| 成人h动漫免费观看网站| 欧美二区在线播放| 色播色播色播色播色播在线| 欧美亚洲国产一区二区三区va| 免费精品在线视频| 韩国成人福利片在线播放| 日本黄大片在线观看| 群体交乱之放荡娇妻一区二区| 国产成人一区二区| 日韩视频 中文字幕| 992tv国产精品成人影院| 正在播放欧美一区| 国产高清免费在线观看| 欧美日韩国产在线| 亚洲激情图片网| 成人午夜激情视频| 毛葺葺老太做受视频| 亚洲色图插插| 欧美日韩精品久久| 日韩成人综合网| 97国产精品久久| av在线播放av| 亚洲二区中文字幕| 中文字幕 国产| 精品久久久久久久久中文字幕| 欧美xxxx精品| 成人动漫中文字幕| 久久撸在线视频| 国产视频一区在线观看一区免费| 色综合666| 亚洲视频一起| 国产精品国产福利国产秒拍| 免费看电影在线| 日韩视频精品在线| 五月激情婷婷综合| 欧美精品777| 黄色一级视频免费看| 亚洲丝袜制服诱惑| 在线免费观看成年人视频| 国产综合色视频| aa在线免费观看| 欧美福利网址| 小说区视频区图片区| 美女精品一区最新中文字幕一区二区三区 | 日本免费在线观看| 日韩电影免费观看中文字幕| 国产精品久久婷婷| 欧美综合视频在线观看| 欧美三日本三级少妇99| 亚洲另类春色国产| 91ts人妖另类精品系列| 久久一区二区三区四区| 国产男女无遮挡猛进猛出| 狠狠色狠狠色综合系列| 欧美综合在线观看视频| 亚洲大片在线| 热久久免费视频精品| 校园春色 亚洲| 99久久精品免费看国产| 俄罗斯女人裸体性做爰| 九一九一国产精品| 日本黄大片一区二区三区| 蘑菇福利视频一区播放| 黄色免费视频大全| av不卡在线看| 日韩不卡视频一区二区| 欧美天天在线| 9色视频在线观看| 亚洲午夜精品一区二区国产 | 少妇精品视频一区二区| 精品福利一区二区三区免费视频| 国产免费高清视频| 777xxx欧美| 国产精品一区二区人人爽| 91精品在线免费| 国产色视频在线| 正在播放一区二区| 国产美女永久免费| 精品日产免费二区日产免费二区| 91精品国产自产在线老师啪| 国产欧美自拍| 国产日韩欧美在线| 日韩福利影视| 成人做爽爽免费视频| 亚洲ww精品| 91精品视频播放| 亚洲国产视频二区| 国产一区高清视频| 日韩av影院| 日韩久久久久久久| 成人网18免费网站| 中文精品视频一区二区在线观看| 一区二区中文字| 欧美大黑帍在线播放| 久久久噜噜噜| 成年网站在线播放| 久久99精品久久久久| 黄色片子免费看| 国产成人亚洲精品青草天美| www.88av| 国产精品视频一二| www色aa色aawww| 精品国产福利在线| 波多野结衣电影在线播放| 欧美日韩国产成人在线91| 国产日韩欧美视频在线观看| 亚洲国语精品自产拍在线观看| 日韩大胆人体| 俺也去精品视频在线观看| 男女免费观看在线爽爽爽视频| 国产精品高清网站| 国产精一区二区| 色综合天天天天做夜夜夜夜做| 精品人妻无码一区二区三区换脸| 日韩理论片网站| 国产一级视频在线| 在线一区二区三区做爰视频网站| 91久久精品无码一区二区| 国产婷婷97碰碰久久人人蜜臀 | 在线播放 亚洲| 伊人久久亚洲美女图片| 婷婷激情四射五月天| 激情欧美日韩一区二区| 欧美熟妇一区二区| 亚洲精品美国一| 老熟妇一区二区三区| 欧美精品一区二区三| 午夜老司机在线观看| 国内精品久久久久| 欧美xxxx网站| 久久日韩精品| 亚洲天堂免费| 黄网站欧美内射| 日韩黄色免费网站| 中文字幕在线视频播放| 国产精品欧美久久久久一区二区| 亚洲视频免费播放| 欧美成人a∨高清免费观看| 成人三级黄色免费网站| 韩国19禁主播vip福利视频| jizzyou欧美16| 日韩激情久久| 亚洲美女色禁图| 亚洲一区二区偷拍| 国产精品福利电影一区二区三区四区 | 国产精品亚洲片在线播放| 国产女教师bbwbbwbbw| 日韩精品国产欧美| 蜜桃传媒一区二区亚洲av | 亚洲激情免费视频| 麻豆精品在线观看| 在线观看日本中文字幕| 亚洲电影一区二区三区| 国产农村妇女毛片精品久久| 一本一本久久a久久精品牛牛影视| av免费不卡国产观看| 国产精品二区在线| 欧美成人亚洲| 亚洲第一成肉网| 中文字幕在线观看一区二区| 波多野结衣毛片| 亚洲裸体xxxx| 高清全集视频免费在线| 国产z一区二区三区| 亚洲激情播播| 欧美乱大交xxxxx潮喷l头像| 成人免费视频视频| 久久久久久av无码免费网站| 欧美一级片在线| 污片在线免费观看| 亚洲最大激情中文字幕| 女人天堂亚洲aⅴ在线观看| 在线播放av网址| 亚洲午夜精品在线| 高潮毛片7777777毛片| 麻豆国产精品va在线观看不卡| 香蕉大人久久国产成人av| 樱空桃在线播放| 国产一区二区精品久久99| 久久久久人妻一区精品色欧美| 欧美va亚洲va| av丝袜在线| 日本成人黄色免费看| 日韩成人精品在线观看| 懂色av蜜桃av| 欧美亚洲丝袜传媒另类| 国产理论在线观看| 亚洲专区在线视频| 希岛爱理一区二区三区| zjzjzjzjzj亚洲女人| 精品国产乱码久久久久酒店| 五月婷中文字幕| 国产精品免费在线免费| 天天影视欧美综合在线观看| 午夜激情视频网| 欧美日韩免费观看中文| 黄色大片在线免费观看| 国产精品日韩欧美| 精品av久久久久电影| 中文字幕丰满孑伦无码专区| 色哟哟国产精品| 成年人在线观看| caoporen国产精品| 翔田千里一区二区| 夜夜春很很躁夜夜躁| 精品欧美久久久| 亚洲欧美小说色综合小说一区| 欧美日韩免费观看一区| 国产乱色国产精品免费视频| 男人天堂中文字幕| 一级做a爰片久久毛片美女图片| 日韩激情综合| 久草热视频在线观看| 国产欧美日韩久久| 婷婷丁香花五月天| 国产精品人成电影| 亚洲激情女人| 999精品视频在线观看播放| 亚洲韩国日本中文字幕| 成人在线观看免费播放|