欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue 2閱讀理解之initRender與callHook組件詳解

 更新時(shí)間:2022年08月24日 15:23:32   作者:MiyueFE  
這篇文章主要為大家介紹了Vue 2閱讀理解之initRender與callHook組件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

initRender 組件渲染初始化

initEvents 事件系統(tǒng)初始化完成之后,緊接著的就是組件實(shí)例的渲染部分的初始化 initRender。

initRender 函數(shù)定義位于 src/core/instance/render.ts 文件內(nèi),基本定義如下:

 export function initRender(vm: Component) {
   vm._vnode = null
   vm._staticTrees = null
   const options = vm.$options
   const parentVnode = (vm.$vnode = options._parentVnode!)
   const renderContext = parentVnode && (parentVnode.context as Component)
   vm.$slots = resolveSlots(options._renderChildren, renderContext)
   vm.$scopedSlots = parentVnode
     ? normalizeScopedSlots(vm.$parent!, parentVnode.data!.scopedSlots, vm.$slots)
     : emptyObject
   vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)
   vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)
   const parentData = parentVnode && parentVnode.data
   if (__DEV__) {
     defineReactive(
       vm,
       '$attrs',
       (parentData && parentData.attrs) || emptyObject,
       () => !isUpdatingChildComponent && warn(`$attrs is readonly.`, vm),
       true
     )
     defineReactive(
       vm,
       '$listeners',
       options._parentListeners || emptyObject,
       () => !isUpdatingChildComponent && warn(`$listeners is readonly.`, vm),
       true
     )
   } else {
     // 將 defineReactive 的第四個(gè)參數(shù)設(shè)為 null 重新執(zhí)行上面的步驟,即省略校驗(yàn)和報(bào)錯(cuò)部分
   }
 }

這部分其實(shí)比較好理解:

首先是 清空 組件的 VNode 對(duì)象和靜態(tài)dom節(jié)點(diǎn)樹(shù);并獲取到該實(shí)例的 父組件虛擬dom樹(shù)對(duì)象 parentVnode父組件實(shí)例指向 renderContext

然后是處理 當(dāng)前組件的 slots 插槽對(duì)象 ,以及標(biāo)準(zhǔn)化處理組件的數(shù)據(jù)域插槽

給組件添加兩個(gè) 組件創(chuàng)建方法,但是這兩個(gè)方法有細(xì)微差別:

  • _c 表示使用內(nèi)部 render 函數(shù),不需要額外的標(biāo)準(zhǔn)化處理
  • $createElement 則表示使用的是用戶(hù)自己編寫(xiě)的 render 函數(shù),需要內(nèi)部重新進(jìn)行一次標(biāo)準(zhǔn)化處理
  • 這兩個(gè)方法最終其實(shí)都是調(diào)用的 _createElement 方法,只是標(biāo)準(zhǔn)函數(shù)(即 _c)使用 simpleNormalizeChildren() 處理,而用戶(hù)自定義 render (即 $createElement)使用 normalizeChildren() 處理

最后對(duì) attrs∗∗和∗∗attrs** 和 **attrs∗∗和∗∗listeners 進(jìn)行響應(yīng)式處理。這一步主要是為了提供給高階組件使用,當(dāng)使用 attrs∗∗和∗∗attrs** 和 **attrs∗∗和∗∗listeners 進(jìn)行綁定數(shù)據(jù)與事件透?jìng)鲿r(shí),可以正確觸發(fā)高階組件內(nèi)部的狀態(tài)更新。

整個(gè)過(guò)程其實(shí)就是解析了組件的 options 配置項(xiàng)與父組件的綁定參數(shù),并對(duì)插槽和數(shù)據(jù)域插槽進(jìn)行不同處理,最后給組件添加 _createElement 的事件指向綁定,并響應(yīng)式處理兩個(gè)組件內(nèi)部沒(méi)有直接定義的參數(shù)/事件。

callHook('beforeCreate')

因?yàn)檫@部分篇幅較少,所以把 callHook() 方法也一并看了。

這個(gè)方法從名字上就可以看出,是用來(lái)觸發(fā)生命周期鉤子的回調(diào)函數(shù)。在之前的 mergeOptions 配置合并 中已經(jīng)知道,Vue 組件在實(shí)例化的時(shí)候會(huì)對(duì) options 中的生命周期鉤子函數(shù)定義進(jìn)行標(biāo)準(zhǔn)化處理,最后每個(gè)生命周期對(duì)應(yīng)的都是一個(gè) 函數(shù)數(shù)組(如果有定義了鉤子函數(shù)的話(huà))。

該方法的定義如下:

 export function callHook(vm: Component, hook: string, args?: any[], setContext = true) {
   pushTarget()
   const prev = currentInstance
   setContext && setCurrentInstance(vm)
   const handlers = vm.$options[hook]
   const info = `${hook} hook`
   if (handlers) {
     for (let i = 0, j = handlers.length; i < j; i++) {
       invokeWithErrorHandling(handlers[i], vm, args || null, vm, info)
     }
   }
   if (vm._hasHookEvent) {
     vm.$emit('hook:' + hook)
   }
   setContext && setCurrentInstance(prev)
   popTarget()
 }

這里可以分成一下幾步來(lái)理解:

  • pushTarget() :在組件的 Dep 依賴(lài)中插入一個(gè) undefined 元素并將當(dāng)前依賴(lài)指向設(shè)置為 undefined,來(lái)禁止生命周期鉤子函數(shù)執(zhí)行時(shí)的依賴(lài)收集
  • 遍歷 options 中對(duì)應(yīng)的鉤子函數(shù)數(shù)組,調(diào)用 invokeWithErrorHandling 來(lái)執(zhí)行(這里其實(shí)與 initEvnets 中注冊(cè)組件事件的方法是一致的)
  • 如果 _hasHookEventtrue,即父組件有設(shè)置子組件的生命周期監(jiān)聽(tīng)函數(shù),則用 $emit 拋出對(duì)應(yīng)生命周期事件
  • popTarget() :刪除之前插入的 undefined 元素,并恢復(fù) Dep 依賴(lài)對(duì)象中的依賴(lài)收集效果
  • 兩個(gè) setCurrentInstance:這部分則是為了適配 V3 的寫(xiě)法而新增的部分,主要是保證在生命周期的鉤子函數(shù)中使用 getCurrentInstance() 方法獲取當(dāng)前組件實(shí)例時(shí)能正確獲取到當(dāng)前的組件狀態(tài),但是在鉤子函數(shù)執(zhí)行完之后會(huì)恢復(fù)到之前的狀態(tài)

以上就是Vue 2閱讀理解之initRender與callHook組件詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue2 組件initRender callHook的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue3 axios配置以及cookie的使用方法實(shí)例演示

    Vue3 axios配置以及cookie的使用方法實(shí)例演示

    這篇文章主要介紹了Vue3 axios配置以及cookie的使用方法,需要的朋友可以參考下
    2023-02-02
  • vue切換頁(yè)面(路由)時(shí)如何保持滾動(dòng)條回到頂部

    vue切換頁(yè)面(路由)時(shí)如何保持滾動(dòng)條回到頂部

    這篇文章主要介紹了vue 切換頁(yè)面(路由)時(shí)如何保持滾動(dòng)條回到頂部問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • MAC+PyCharm+Flask+Vue.js搭建系統(tǒng)

    MAC+PyCharm+Flask+Vue.js搭建系統(tǒng)

    最近新做了個(gè)項(xiàng)目,使用的是MAC+PyCharm+Flask+Vue.js搭建系統(tǒng),本文就來(lái)分享一下搭建步驟,感興趣的可以了解一下
    2021-05-05
  • vue.js實(shí)現(xiàn)插入數(shù)值與表達(dá)式的方法分析

    vue.js實(shí)現(xiàn)插入數(shù)值與表達(dá)式的方法分析

    這篇文章主要介紹了vue.js實(shí)現(xiàn)插入數(shù)值與表達(dá)式的方法,結(jié)合實(shí)例形式分析了vue.js常見(jiàn)的3種插入數(shù)值實(shí)現(xiàn)方式,并總結(jié)了vue.js插值與表達(dá)式相關(guān)使用技巧,需要的朋友可以參考下
    2018-07-07
  • vue?路由跳轉(zhuǎn)打開(kāi)新窗口被瀏覽器攔截問(wèn)題處理

    vue?路由跳轉(zhuǎn)打開(kāi)新窗口被瀏覽器攔截問(wèn)題處理

    這篇文章主要介紹了vue?路由跳轉(zhuǎn)打開(kāi)新窗口被瀏覽器攔截問(wèn)題處理,下面文章操作中所遇到相關(guān)問(wèn)題解決的內(nèi)容介紹詳細(xì),需要的小伙伴可以參考一下
    2022-03-03
  • vue2老項(xiàng)目vite升級(jí)改造過(guò)程記錄

    vue2老項(xiàng)目vite升級(jí)改造過(guò)程記錄

    目前vite主要默認(rèn)是支持給vue3使用的,并且如果使用官方的cli創(chuàng)建的項(xiàng)目一樣會(huì)默認(rèn)使用vue3去構(gòu)建項(xiàng)目,此時(shí)對(duì)于一些vue2的老項(xiàng)目就顯得不友好了,下面這篇文章主要給大家介紹了關(guān)于vue2老項(xiàng)目vite升級(jí)改造的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • vue2如何獲取上頁(yè)的url地址

    vue2如何獲取上頁(yè)的url地址

    這篇文章主要介紹了vue2如何獲取上頁(yè)的url地址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue3監(jiān)聽(tīng)路由的變化代碼示例

    vue3監(jiān)聽(tīng)路由的變化代碼示例

    在vue項(xiàng)目中假使我們?cè)谕粋€(gè)路由下,只是改變路由后面的參數(shù)值,期望達(dá)到數(shù)據(jù)的更新,這篇文章主要給大家介紹了關(guān)于vue3監(jiān)聽(tīng)路由的變化的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • vue中v-if和v-show使用區(qū)別源碼分析

    vue中v-if和v-show使用區(qū)別源碼分析

    這篇文章主要為大家介紹了vue中v-if和v-show使用區(qū)別源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Vue中$attrs和$listeners詳解以及使用方法

    Vue中$attrs和$listeners詳解以及使用方法

    最近在研究Vue的組件庫(kù),之前也用過(guò)$attrs和$listeners,官方文檔描述的不太詳細(xì),也沒(méi)有太好的例子,下面這篇文章主要給大家介紹了關(guān)于Vue中$attrs和$listeners詳解以及使用的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評(píng)論