做爰高潮a片〈毛片〉,尤物av天堂一区二区在线观看,一本久久A久久精品VR综合,添女人荫蒂全部过程av

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

Vue源碼解讀之Component組件注冊(cè)的實(shí)現(xiàn)

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:09:20
文檔

Vue源碼解讀之Component組件注冊(cè)的實(shí)現(xiàn)

Vue源碼解讀之Component組件注冊(cè)的實(shí)現(xiàn):什么是組件? 組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以表現(xiàn)為用 is 特性進(jìn)行了擴(kuò)展的原生 HTML 元素。
推薦度:
導(dǎo)讀Vue源碼解讀之Component組件注冊(cè)的實(shí)現(xiàn):什么是組件? 組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以表現(xiàn)為用 is 特性進(jìn)行了擴(kuò)展的原生 HTML 元素。

什么是組件?

組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以表現(xiàn)為用 is 特性進(jìn)行了擴(kuò)展的原生 HTML 元素。

所有的 Vue 組件同時(shí)也都是 Vue 的實(shí)例,所以可接受相同的選項(xiàng)對(duì)象 (除了一些根級(jí)特有的選項(xiàng)) 并提供相同的生命周期鉤子。

Vue可以有全局注冊(cè)和局部注冊(cè)兩種方式來注冊(cè)組件。

全局注冊(cè)

注冊(cè)方式

全局注冊(cè)有以下兩種注冊(cè)方式:

通過Vue.component 直接注冊(cè)。

Vue.component('button-counter', {
 //data選項(xiàng)必須是一個(gè)函數(shù)
 data: function () {
 return {
 count: 0
 }
 },
 template:'#clickBtn'
 })

通過Vue.extend來注冊(cè)。

 var buttonComponent = Vue.extend({
 name:'button-counter',
 data: function () {
 return {
 count: 0
 }
 },
 template:'#clickBtn'
 });
 Vue.component('button-counter', buttonComponent);

具體過程

Vue初始化時(shí),initGlobalAPI通過調(diào)用initAssetRegisters()進(jìn)行組件注冊(cè)。

function initAssetRegisters (Vue) {
 // 創(chuàng)建組件注冊(cè)的方法
 // ASSET_TYPES在Vue內(nèi)部定義,var ASSET_TYPES = ['component','directive','filter'];
 ASSET_TYPES.forEach(function (type) {
 Vue[type] = function (
 id,
 definition
 ) {
 //這里的definition指的是定義(Function或Object),是函數(shù)或者對(duì)象
 //如果definition不存在,直接返回options內(nèi)type和id對(duì)應(yīng)的
 //這里的options是指全局的組件,指令和過濾器,見圖一
 if (!definition) {
 return this.options[type + 's'][id]
 } else {
 /* istanbul ignore if */
 if ("development" !== 'production' && type === 'component') {
 validateComponentName(id);
 }
 // 如果是component(組件)方法,并且definition是對(duì)象
 if (type === 'component' && isPlainObject(definition)) {
 definition.name = definition.name || id;
 //通過this.options._base.extend方法(也就是Vue.extend方法)將定義對(duì)象轉(zhuǎn)化為構(gòu)造器。
 //Vue.options._base = Vue;
 definition = this.options._base.extend(definition);
 }
 if (type === 'directive' && typeof definition === 'function') {
 definition = { bind: definition, update: definition };
 }
 // 將構(gòu)造器賦值給 this.options[‘component'+ 's'][id]
 //全局的組件,指令和過濾器,統(tǒng)一掛在vue.options上。在init的時(shí)候利用mergeOptions合并策略侵入實(shí)例,供實(shí)例使用。
 this.options[type + 's'][id] = definition;
 return definition
 }
 };
 });
}

圖一:

initAssetRegisters里面通過this.options._base.extend方法將定義對(duì)象轉(zhuǎn)化為構(gòu)造器,而options._base.extend其實(shí)就是Vue.extend。接下來我們就看一下Vue.extend做了什么。

Vue.extend = function (extendOptions) {
 extendOptions = extendOptions || {};
 var Super = this;
 var SuperId = Super.cid;
 //組件緩存
 var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
 //如果組件已經(jīng)被緩存在extendOptions上則直接取出
 if (cachedCtors[SuperId]) {
 return cachedCtors[SuperId]
 }

 //如果有name屬性,檢驗(yàn)name拼寫是否合法
 var name = extendOptions.name || Super.options.name;
 if ("development" !== 'production' && name) {
 validateComponentName(name);
 }

 var Sub = function VueComponent (options) {
 this._init(options);
 };
 //將vue上原型的方法掛在Sub.prototype中,Sub的實(shí)例同時(shí)也繼承了vue.prototype上的所有屬性和方法。
 //關(guān)于 prototype的學(xué)習(xí):http://www.cnblogs.com/dolphinX/p/3286177.html
 Sub.prototype = Object.create(Super.prototype);
 //Sub構(gòu)造函數(shù)修正,學(xué)習(xí)于https://www.cnblogs.com/SheilaSun/p/4397918.html
 Sub.prototype.constructor = Sub;
 Sub.cid = cid++;
 //通過vue的合并策略合并添加項(xiàng)到新的構(gòu)造器上
 Sub.options = mergeOptions(
 Super.options,
 extendOptions
 );
 //緩存父構(gòu)造器
 Sub['super'] = Super;

 // 處理props和computed響應(yīng)式配置項(xiàng)
 if (Sub.options.props) {
 initProps$1(Sub);
 }
 if (Sub.options.computed) {
 initComputed$1(Sub);
 }

 // allow further extension/mixin/plugin usage
 Sub.extend = Super.extend;
 Sub.mixin = Super.mixin;
 Sub.use = Super.use;

 //在新的構(gòu)造器上掛上vue的工具方法
 ASSET_TYPES.forEach(function (type) {
 Sub[type] = Super[type];
 });
 // enable recursive self-lookup
 if (name) {
 Sub.options.components[name] = Sub;
 }

 // keep a reference to the super options at extension time.
 // later at instantiation we can check if Super's options have
 // been updated.
 Sub.superOptions = Super.options;
 Sub.extendOptions = extendOptions;
 Sub.sealedOptions = extend({}, Sub.options);

 //緩存組件構(gòu)造器在extendOptions上
 cachedCtors[SuperId] = Sub;
 return Sub
 };

vue.extend返回了一個(gè)帶有附加Option的vue構(gòu)造器。這個(gè)構(gòu)造器被命名為Sub,等待render時(shí)候初始化。

initAssetRegisters完成之后,options下掛載了全局組件button-counter,如圖:

接下來調(diào)用new Vue()渲染vue整體的生命周期

局部注冊(cè)

如果不需要全局注冊(cè),或者是讓組件使用在其它組件內(nèi),可以用選項(xiàng)對(duì)象的components屬性實(shí)現(xiàn)局部注冊(cè)。

注冊(cè)方式

new Vue({
 el: '#components-demo',
 components:{
 'button-counter':{
 template:'#clickBtn',
 data: function () {
 return {
 count: 0
 }
 }
 }
 }
 })

具體過程

Vue局部組件注冊(cè)也是通過initAssetRegisters()方法調(diào)用Vue.extend,不同的是在createComponent()時(shí),initMixin()里面有判斷

if (options && options._isComponent) {
 //因?yàn)閂ue動(dòng)態(tài)合并策略非常慢,并且內(nèi)部組件的選項(xiàng)都不需要特殊處理。
 //調(diào)用initInternalComponent快捷方法,內(nèi)部組件實(shí)例化。
 initInternalComponent(vm, options);
 }
 else {
 vm.$options = mergeOptions(
 resolveConstructorOptions(vm.constructor),
 options || {},
 vm
 );
 }
function initInternalComponent (vm, options) {
 var opts = vm.$options = Object.create(vm.constructor.options);
 // 這樣做是因?yàn)樗葎?dòng)態(tài)枚舉更快。
 var parentVnode = options._parentVnode;
 opts.parent = options.parent;
 opts._parentVnode = parentVnode;

 var 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;
 }
}

opts的結(jié)構(gòu)如圖所示:

局部注冊(cè)和全局注冊(cè)不同的是,只有該類型的組件才可以訪問局部注冊(cè)的子組件,而全局注冊(cè)是擴(kuò)展到 Vue.options 下。在所有組件創(chuàng)建的過程中,都會(huì)從全局的 Vue.options.components 擴(kuò)展到當(dāng)前組件的 vm.$options.components 下,這就是全局注冊(cè)的組件能被任意使用的原因。

組件名定義

定義組件名的方式有兩種:

使用短橫線形式

Vue.component('button-counter', {})

引用這個(gè)自定義元素時(shí),必須用 <button-counter></button-counter>

使用駝峰的形式

Vue.component('buttonCounter', { })

此時(shí)在引用這個(gè)自定義元素時(shí),兩種命名方法都可以使用。也就是說,<buttonCounter><button-counter> 都是可行的。

注意,直接在 DOM (即非字符串的模板) 中使用時(shí)只有短橫線是有效的。如下:

<div id="components-demo">
 <button-counter></button-counter>
</div>

可參考:https://www.gxlcms.com/article/144050.htm

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Vue源碼解讀之Component組件注冊(cè)的實(shí)現(xiàn)

Vue源碼解讀之Component組件注冊(cè)的實(shí)現(xiàn):什么是組件? 組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以表現(xiàn)為用 is 特性進(jìn)行了擴(kuò)展的原生 HTML 元素。
推薦度:
標(biāo)簽: VUE 代碼 組件
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 鹤庆县| 灵武市| 枣阳市| 阿克苏市| 昭觉县| 江都市| 沙雅县| 黔南| 澳门| 阳山县| 锦州市| 塔城市| 琼中| 吉木乃县| 芮城县| 盐山县| 鄂托克前旗| 宣汉县| 兴义市| 浮山县| 沧州市| 马边| 贺州市| 宜都市| 海安县| 阳原县| 西吉县| 南召县| 凤台县| 怀安县| 新丰县| 亳州市| 邯郸县| 合川市| 河东区| 桑日县| 库车县| 宝鸡市| 方城县| 宕昌县| 高唐县|