日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解vue 組件注冊(cè)

瀏覽:180日期:2022-10-24 15:56:53

一、了解組件注冊(cè)的兩種方式

1.1 全局組件的注冊(cè)方法

//main.js import Vue from ’vue’ import App from ’./App’ import router from ’./router’ Vue.config.productionTip = false let Hello = { name: ’hello’, template: ’這是全局組件hello’ } Vue.component(’hello’, Hello) new Vue({ el: ’#app’, router, components: { App }, template: ’’ })

上面我們就通過Vue.component()注冊(cè)了一個(gè)全局組件hello,接下來分析源碼實(shí)現(xiàn)的時(shí)候也是基于這個(gè)例子來進(jìn)行的。

1.2 局部組件的注冊(cè)

<template> <div id='app'> <img src='http://www.b3g6.com/bcjs/assets/logo.png'> <HelloWorld/> </div></template><script>import HelloWorld from ’./components/HelloWorld.vue’export default { name: ’App’, components:{ HelloWorld }}</script>

像這樣就注冊(cè)了一個(gè)HelloWorld的局部組件。

二、全局組件注冊(cè)的源碼

1.Vue初始化的時(shí)候,會(huì)調(diào)用initGlobalAPI()

//【代碼塊1】//代碼所在文件:src/core/global-api/index.jsexport function initGlobalAPI(Vue: GlobalAPI){ //...省略其他無關(guān)代碼 initAssetRegisters(Vue) //這個(gè)方法就是用于組件注冊(cè)的方法}

2.在initAssetRegisters()方法中執(zhí)行組件的定義

//【代碼塊2】//代碼所在文件:src/core/global-api/assets.jsexport function initAssetRegister(Vue){ ASSET_TYPES.forEach(type=>{ //ASSET_TYPES包括component、directive、filter Vue[type] = function(id, definition){ //...一些條件判斷 if(type === ’component’ && isPlainObject(definition)){definition.name = definition.name || id definition = this.options._base.extend(definition) //將definition轉(zhuǎn)換為一個(gè)繼承于Vue的構(gòu)造函數(shù) } //...其他類型的處理 this.options[type+’s’][id] = definition //將這個(gè)構(gòu)造函數(shù)掛載到Vue.options.components上 return definition } })}

此時(shí),我們可以單步調(diào)試一下我們上面的例子,來看一下definition一開始是什么,以及執(zhí)行掛載后Vue.options變成了什么樣子:

a.definition: 其實(shí)傳入的時(shí)候就是我們一開始定義的全局組件的具體內(nèi)容

詳解vue 組件注冊(cè)

b.Vue.options: 可以看到我們定義的全局組件hello已經(jīng)存在在Vue.options.components上了

詳解vue 組件注冊(cè)

3.實(shí)例化組件的時(shí)候,代碼會(huì)執(zhí)行到Vue.prototype._init()上面

//【代碼塊3】//代碼所在文件:src/core/instance/init.jsVue.prototype._init = function(options){ //..省略其他無關(guān)代碼 if(options && options._isComponent){ //組件 initInternalComponent(vm, options) }else{ //非組件 vm.$options = mergeOptions( resolveConstructorOptions(vm.constructor), options||{}, vm ) }}

這里將自己定義的組件的options與Vue.options做了一個(gè)合并,并且賦值給了vm.$options,而通過【代碼塊2】我們可以知道全局組件的構(gòu)造函數(shù)已經(jīng)被放在了Vue.options.components上,所以經(jīng)過這一步,vm.$options.components上面也有了全局組件的構(gòu)造函數(shù)。所以現(xiàn)在在任意組件都能拿到全局組件,因?yàn)槿魏谓M件初始化的時(shí)候都會(huì)執(zhí)行這個(gè)合并。

我們可以通過單步調(diào)試上面的例子看一下現(xiàn)在的vm.$options上面有些什么

詳解vue 組件注冊(cè)

4.在創(chuàng)建vnode的過程中,會(huì)執(zhí)行_createElement方法

//【代碼塊4】//代碼所在文件:src/core/vdom/create-element.jsexport function _createElement(context, tag, data, children, normalization){ if(typeof tag === ’string’){ //... if(config.isReservedTag(tag)){ //...保留的html標(biāo)簽 }else if(isDef(Ctor = resolveAsset(context.$options, ’component’, tag))){ //已經(jīng)注冊(cè)過的全局組件 vnode = createComponent(Ctor, data, context, children, tag) }else{ //不是內(nèi)置標(biāo)簽也不是已經(jīng)注冊(cè)過的組件,就創(chuàng)建一個(gè)全新的vnode vnode = new VNode(tag, data, children,undefined, undefined, context ) } }}

上面代碼中有一個(gè)比較重要的方法resolveAsset(),用于判斷在context.$options.compononts(即vm.$options.components)上面是否能找到這個(gè)組件的構(gòu)造函數(shù),如果能找到,返回這個(gè)構(gòu)造函數(shù),(具體方法見【代碼塊5】)根據(jù)【代碼塊3】我們可以知道如果這個(gè)組件是全局注冊(cè)的組件,那么我們就可以得到這個(gè)構(gòu)造函數(shù),并進(jìn)入這個(gè)else if判斷,通過createComponent()得到vnode。

5.上面四步已經(jīng)實(shí)現(xiàn)了整個(gè)流程,現(xiàn)在補(bǔ)充看一下resolveAsset()

//【代碼塊5】//代碼所在文件:src/core/utils/options.jsexport function resolveAsset(options, type, id, warnMissing){ //options即上面調(diào)用的時(shí)候傳入的context.$options, //由【代碼塊3】,vm.$options是由我們自定義的options以及Vue上的options合并而來的 //type現(xiàn)在是components const assets = options[type] // check local registration variations first if (hasOwn(assets, id)) return assets[id] const camelizedId = camelize(id) if (hasOwn(assets, camelizedId)) return assets[camelizedId] const PascalCaseId = capitalize(camelizedId) if (hasOwn(assets, PascalCaseId)) return assets[PascalCaseId] // fallback to prototype chain const res = assets[id] || assets[camelizedId] || assets[PascalCaseId] if (process.env.NODE_ENV !== ’production’ && warnMissing && !res) { warn( ’Failed to resolve ’ + type.slice(0, -1) + ’: ’ + id, options ) } return res }

先通過 const assets = options[type] 拿到 assets,然后再嘗試拿 assets[id],這里有個(gè)順序,先直接使用 id 拿,如果不存在,則把 id 變成駝峰的形式再拿,如果仍然不存在則在駝峰的基礎(chǔ)上把首字母再變成大寫的形式再拿,如果仍然拿不到則報(bào)錯(cuò)。這樣說明了我們?cè)谑褂?Vue.component(id, definition) 全局注冊(cè)組件的時(shí)候,id 可以是連字符、駝峰或首字母大寫的形式。

三、局部組件的注冊(cè)

1.extend()

組件在執(zhí)行render()的時(shí)候,會(huì)執(zhí)行createComponent函數(shù),在這個(gè)函數(shù)里面會(huì)執(zhí)行extend()函數(shù)生成一個(gè)構(gòu)造函數(shù),也是在這個(gè)extend()函數(shù)中,執(zhí)行了一個(gè)options的合并

//【代碼塊5】//代碼所在文件:src/core/global-api/extend.jsVue.entend = function(extendOptions){ //... Sub.options = mergeOptions( Super.options, //Vue的options extendOptions //定義組件的那個(gè)對(duì)象 ) //...}

可以看出這里是將自己傳入的options(即定義組件的那個(gè)對(duì)象)與Vue.options合并,然后放到Sub.options上,同時(shí),因?yàn)镾ub.options上面合并了Vue的options,所以組件里面也可以拿到全局注冊(cè)的組件。

2.組件初始化

//【代碼塊6(同代碼塊3)】//代碼所在文件:src/core/instance/init.jsVue.prototype._init = function(options){ //.. if(options && options._isComponent){ initInternalComponent(vm, options) }else{ vm.$options = mergeOptions( resolveConstructorOptions(vm.constructor), options||{}, vm ) }}

組件初始化的過程中會(huì)進(jìn)入if判斷語句,執(zhí)行initInternalComponent()

3.initInternalComponent()

//【代碼塊7】//代碼所在文件:src/core/instance/init.jsexport function initInternalComponent (vm: Component, options: InternalComponentOptions) { const opts = vm.$options = Object.create(vm.constructor.options) //vm.constructor即為Sub,在代碼塊5中,我們已經(jīng)將局部組件放在了Sub.options上 //所以這里將局部組件的構(gòu)造函數(shù)放在了vm.$options上 //這樣在執(zhí)行【代碼塊4】的時(shí)候同樣也能通過resolveAsset得到局部注冊(cè)組件的構(gòu)造函數(shù) const parentVnode = options._parentVnode opts.parent = options.parent opts._parentVnode = parentVnode //將componentOptions里面的別的屬性賦值給opts const vnodeComponentOptions = parentVnode.componentOptions opts.propsData = vnodeComponentOptions.propsData opts._parentListeners = vnodeComponentOptions.listeners opts._renderChildren = vnodeComponentOptions.children opts._componentTag = vnodeComponentOptions.tag if (options.render) { opts.render = options.render opts.staticRenderFns = options.staticRenderFns }}

四、總結(jié)

由于全局注冊(cè)的組件是將組件的構(gòu)造函數(shù)擴(kuò)展到了Vue.options.components上,而組件在初始化的時(shí)候都會(huì)將自身options與Vue.options合并,擴(kuò)展到當(dāng)前組件的vm.$options.components下,所以全局組件能在任意組件被使用。而局部注冊(cè)的組件是將組件的構(gòu)造函數(shù)擴(kuò)展到了當(dāng)前組件的vm.$options.components下,所以只能在當(dāng)前組件使用。

以上就是詳解vue 組件注冊(cè)的詳細(xì)內(nèi)容,更多關(guān)于vue 組件注冊(cè)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲天堂av影院| 国产视频一区二区在线播放| 国产精品一区二区中文字幕| 亚洲网址在线观看| 九九在线精品| 日韩在线看片| 伊人网在线播放| 日韩免费看片| 91九色精品| 欧美日韩精品一本二本三本| 婷婷亚洲五月| 日韩中文字幕不卡| 久久午夜视频| 久久激情五月激情| 国产午夜一区| 精品国产18久久久久久二百| 精品午夜视频| 亚洲女同av| 欧美国产91| 亚洲伊人精品酒店| 亚洲精品护士| 国产日韩视频在线| 日韩不卡免费高清视频| 免费精品国产| 日本少妇一区二区| 亚洲精品成人图区| av成人国产| 欧美黑人做爰爽爽爽| 日韩在线观看一区| 日韩在线黄色| 国产盗摄——sm在线视频| 欧美~级网站不卡| 日本午夜精品久久久| 日韩不卡一区| 日韩精品一二三区| 精品欧美视频| 午夜国产一区二区| 欧美激情福利| 免费视频久久| 性感美女一区二区在线观看| 深夜福利一区| 亚洲高清久久| 欧美xxxx中国| 91精品国产自产观看在线| 日韩久久视频| 国产欧美日韩一区二区三区四区 | 亚洲天堂av影院| 日韩高清国产一区在线| 欧美日韩国产在线观看网站 | 国产日本精品| 日韩中出av| 日韩一区二区三区四区五区| 免费在线看一区| 巨乳诱惑日韩免费av| 亚洲一区国产| 日韩精品一级中文字幕精品视频免费观看 | 欧美国产极品| 亚洲少妇一区| 美女福利一区二区三区| 日韩精品乱码av一区二区| 亚洲成人不卡| 在线亚洲一区| 黄色在线网站噜噜噜| 亚洲影视一区二区三区| 欧美日韩一二三四| 精品91福利视频| 欧美xxxx性| 国产剧情在线观看一区| 亚洲欧美一级| 亚洲欧美一级| 亚洲精品一级| 日韩中文字幕| 日产欧产美韩系列久久99| 日韩在线a电影| 日韩专区在线视频| 99国产精品久久久久久久| 久久精品国产99国产精品| 中文字幕一区二区av| 午夜日韩在线| 夜夜精品视频| 日韩专区欧美专区| 亚洲精品护士| 国产欧美午夜| 欧美黄页在线免费观看| 国产精品视频一区二区三区综合| 亚洲3区在线| 欧美一区成人| 国产日本久久| 精品国产a一区二区三区v免费| 国产精品久久免费视频| 久久av影视| 日韩中文字幕| 免费亚洲一区| 国产欧美三级| 在线中文字幕播放| 99久久亚洲精品| 蜜桃一区二区三区在线观看| 亚洲一级淫片| 国产精品theporn| 中文字幕色婷婷在线视频| 国产成人精品一区二区三区视频 | 韩国精品主播一区二区在线观看| 日韩av中文字幕一区二区 | 精品视频黄色| 影院欧美亚洲| 蜜桃精品视频| 午夜国产一区二区| 国产精品宾馆| 亚洲无线一线二线三线区别av| 亚洲a级精品| 999国产精品永久免费视频app| 国产精品女主播一区二区三区| 一区二区视频欧美| 国产精品任我爽爆在线播放| 亚洲精品一级二级| 日韩成人av影视| 午夜欧美精品| 蜜臀久久精品| 国产精品sm| 日本成人在线不卡视频| 亚洲a一区二区三区| 你懂的国产精品永久在线| 天堂成人国产精品一区| 成人精品久久| 欧美视频久久| 激情欧美一区二区三区| 精品国产亚洲日本| 男女性色大片免费观看一区二区| 色老板在线视频一区二区| 欧美激情麻豆| 综合一区在线| 亚洲一区二区日韩| 久久国产精品久久w女人spa| 久久久久久久久丰满| 狂野欧美性猛交xxxx| 国产视频一区三区| 久久亚洲成人| 天堂资源在线亚洲| 久久亚洲在线| 久久精品影视| 99成人在线| 99亚洲视频| 亚洲国内欧美| 欧美日韩黑人| 国产日韩专区| 久久国产66| 7777精品| 老司机精品视频在线播放| 国产黄色一区| 成人台湾亚洲精品一区二区| 国产精品久久久久久模特| 国产丝袜一区| 99久久亚洲精品蜜臀| 国产高清视频一区二区| 日韩一区二区三免费高清在线观看| 亚洲一区国产| 国产精品毛片在线| 88xx成人免费观看视频库| 日韩中文视频| 亚洲精品.com| 国产精品美女| 亚洲人亚洲人色久| 久久黄色影视| 国产suv精品一区二区四区视频 | 国产精品99一区二区| 色婷婷久久久| 一本色道久久精品| 亚洲欧美日韩国产综合精品二区| 午夜精品成人av| 激情综合自拍| 亚洲免费一区三区| 国产日韩欧美三级| 日韩成人免费| 国产精品亚洲二区| 国产伦久视频在线观看| 国产精品社区| 欧美1区二区| 国产精品人人爽人人做我的可爱| 欧美精品观看| 欧洲激情综合| 99在线|亚洲一区二区| 国产精品美女| 国产高清一区| 大香伊人久久精品一区二区| 国产精品网在线观看| 国产欧美日韩精品一区二区三区| 日本视频一区二区| 奇米狠狠一区二区三区| 中文字幕免费精品| 日韩精品高清不卡| 国产三级一区| 岛国精品一区| 免费日韩一区二区三区| 国产精品一区二区免费福利视频| 91国内精品| 国产一区2区在线观看| 手机在线电影一区| 亚洲一级高清| 日韩午夜av在线| 日韩中文字幕区一区有砖一区|