VUE props 實現(xiàn)原理(源碼解析)

VUE props 實現(xiàn)原理(源碼解析)

前言

我們在使用組件的時候拟枚,都會給組件傳入一些屬性傻粘,但是在使用時瀑志,卻只是關注了它傳遞數(shù)據(jù)的功能,沒有想過它是怎樣的一個原理,具體是怎么實現(xiàn)的井厌。

其實我們平時寫出來的組件港柜,本質(zhì)上就是一個template模板氯夷,而這個template模板在vue中枚粘,會通過render函數(shù)解析庄涡,最終生成一個VNode默色。那我們通過源碼來看一下在生成VNode后,組件屬性是怎樣實現(xiàn)傳遞的。

源碼解析

生成虛擬節(jié)點源碼

在生成虛擬節(jié)點這法精,我們可以看到這樣一段代碼如迟,而這段代碼中摘符,propsData則是所有屬性的一個定義带族,而這個對象的放在了虛擬節(jié)點上蝙砌,那我們可以看看組件初始化時祠饺,這個propsData對象經(jīng)歷了怎么的操作。

 const vnode = new VNode(
    `vue-component-${Ctor.cid}${name ? `-${name}` : ''}`,
    data, undefined, undefined, undefined, context,
    { Ctor, propsData, listeners, tag, children },
    asyncFactory
  )
組件初始化源碼

在下段代碼中,我們可以看到propsData對象是被賦值到了當前實例上的$optionspropsData屬性中懊渡,那我們可以看一下初始化props時肾档,這個propsData對象又經(jīng)過了怎樣的一個過程酣溃。

const opts = vm.$options = Object.create(vm.constructor.options)黔姜、
  const parentVnode = options._parentVnode
  opts._parentVnode = parentVnode
  const vnodeComponentOptions = parentVnode.componentOptions
  opts.propsData = vnodeComponentOptions.propsData
初始化props源碼

在這里,從$options拿到$options對象后蒂萎,聲明了一個叫_props的空對象秆吵。

const propsData = vm.$options.propsData || {}
 const props = vm._props = {}

下面通過vm.$parent判斷一下是不是根元素,如果是根元素五慈,屬性則需要設置為響應式的纳寂,如果不是則不需要。

const isRoot = !vm.$parent 
 if (!isRoot) {//如果是根元素  屬性需要定義成響應式
    toggleObserving(false)
 }

循環(huán)用戶定義了的propsOptions選項泻拦,它會根據(jù)用戶定義的對象來和用戶傳入的值通過validateProp方法來進行一個校驗毙芜,并且拿到最終的結(jié)果value

然后將當前key和value值争拐,通過defineReactive定義到我們前面的_props中腋粥。

最終,將_props對象定義到我們的實例上去架曹,這樣我們就可以通過實例隘冲,直接拿取到屬性了。

 for (const key in propsOptions) {
    keys.push(key)  //校驗用戶定義的屬性和傳入的屬性
    const value = validateProp(key, propsOptions, propsData, vm)
    if (process.env.NODE_ENV !== 'production') {
      
    } else {
      defineReactive(props, key, value)
    }
    if (!(key in vm)) {
      proxy(vm, `_props`, key)
    }
  }

總的來說绑雄,就是將父組件傳給它的屬性展辞,定義到了它自己的實例上了。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绳慎,一起剝皮案震驚了整個濱河市纵竖,隨后出現(xiàn)的幾起案子漠烧,更是在濱河造成了極大的恐慌,老刑警劉巖靡砌,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件已脓,死亡現(xiàn)場離奇詭異,居然都是意外死亡通殃,警方通過查閱死者的電腦和手機度液,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來画舌,“玉大人堕担,你說我怎么就攤上這事∏簦” “怎么了霹购?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長朋腋。 經(jīng)常有香客問我齐疙,道長,這世上最難降的妖魔是什么旭咽? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任贞奋,我火速辦了婚禮,結(jié)果婚禮上穷绵,老公的妹妹穿的比我還像新娘轿塔。我一直安慰自己,他們只是感情好仲墨,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布勾缭。 她就那樣靜靜地躺著,像睡著了一般宗收。 火紅的嫁衣襯著肌膚如雪漫拭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天混稽,我揣著相機與錄音,去河邊找鬼审胚。 笑死匈勋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的膳叨。 我是一名探鬼主播洽洁,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菲嘴!你這毒婦竟也來了饿自?” 一聲冷哼從身側(cè)響起汰翠,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昭雌,沒想到半個月后复唤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡烛卧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年佛纫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片总放。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呈宇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出局雄,到底是詐尸還是另有隱情甥啄,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布炬搭,位于F島的核電站型豁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尚蝌。R本人自食惡果不足惜迎变,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飘言。 院中可真熱鬧衣形,春花似錦、人聲如沸姿鸿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛预。三九已至句狼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間热某,已是汗流浹背腻菇。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昔馋,地道東北人筹吐。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像秘遏,于是被迫代替她去往敵國和親丘薛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容