1.使用vue構(gòu)造器,創(chuàng)建一個(gè)子類,參數(shù)是包含組件選項(xiàng)的對(duì)象;
2.是全局的
// 創(chuàng)建構(gòu)造器 var Profile = Vue.extend({ template: '<p>{{extendData}}</br>實(shí)例傳入的數(shù)據(jù)為:{{propsExtend}}</p>',//template對(duì)應(yīng)的標(biāo)簽最外層必須只有一個(gè)標(biāo)簽 data: function () { return { extendData: '這是extend擴(kuò)展的數(shù)據(jù)', } }, props:['propsExtend'] }) // 創(chuàng)建 Profile 實(shí)例,并掛載到一個(gè)元素上。可以通過(guò)propsData傳參. new Profile({propsData:{propsExtend:'我是實(shí)例傳入的數(shù)據(jù)'}}).$mount('#app-extend')
結(jié)論:
Vue.extend實(shí)際是創(chuàng)建一個(gè)構(gòu)造器,對(duì)應(yīng)的初始化構(gòu)造器,并將其掛載到標(biāo)簽上
github源碼,請(qǐng)戳這里 ,歡迎star
1.將通過(guò) Vue.extend 生成的擴(kuò)展實(shí)例構(gòu)造器注冊(cè)(命名)為一個(gè)全局組件,參數(shù)可以是Vue.extend()擴(kuò)展的實(shí)例,也可以是一個(gè)對(duì)象(會(huì)自動(dòng)調(diào)用extend方法)
2.兩個(gè)參數(shù),一個(gè)組件名,一個(gè)extend構(gòu)造器或者對(duì)象
//1.創(chuàng)建組件構(gòu)造器 var obj = { props: [], template: '<p><p>{{extendData}}</p></p>',//最外層只能有一個(gè)大盒子,這個(gè)和<tempalte>對(duì)應(yīng)規(guī)則一致 data: function () { return { extendData: '這是Vue.component傳入Vue.extend注冊(cè)的組件', } }, }; var Profile = Vue.extend(obj); //2.注冊(cè)組件方法一:傳入Vue.extend擴(kuò)展過(guò)得構(gòu)造器 Vue.component('component-one', Profile) //2.注冊(cè)組件方法二:直接傳入 Vue.component('component-two', obj) //3.掛載 new Vue({ el: '#app' }); //獲取注冊(cè)的組件 (始終返回構(gòu)造器) var oneComponent=Vue.component('component-one'); console.log(oneComponent===Profile)//true,返回的Profile構(gòu)造器
值可以是一個(gè)混合對(duì)象數(shù)組,混合實(shí)例可以包含選項(xiàng),將在extend將相同的選項(xiàng)合并
mixins代碼:
var mixin={ data:{mixinData:'我是mixin的data'}, created:function(){ console.log('這是mixin的created'); }, methods:{ getSum:function(){ console.log('這是mixin的getSum里面的方法'); } } } var mixinTwo={ data:{mixinData:'我是mixinTwo的data'}, created:function(){ console.log('這是mixinTwo的created'); }, methods:{ getSum:function(){ console.log('這是mixinTwo的getSum里面的方法'); } } } var vm=new Vue({ el:'#app', data:{mixinData:'我是vue實(shí)例的data'}, created:function(){ console.log('這是vue實(shí)例的created'); }, methods:{ getSum:function(){ console.log('這是vue實(shí)例里面getSum的方法'); } }, mixins:[mixin,mixinTwo] }) //打印
結(jié)論:
1.mixins執(zhí)行的順序?yàn)閙ixins>mixinTwo>created(vue實(shí)例的生命周期鉤子);
2.選項(xiàng)中數(shù)據(jù)屬性如data,methods,后面執(zhí)行的回覆蓋前面的,而生命周期鉤子都會(huì)執(zhí)行
extends用法和mixins很相似,只不過(guò)接收的參數(shù)是簡(jiǎn)單的選項(xiàng)對(duì)象或構(gòu)造函數(shù),所以extends只能單次擴(kuò)展一個(gè)組件
var extend={ data:{extendData:'我是extend的data'}, created:function(){ console.log('這是extend的created'); }, methods:{ getSum:function(){ console.log('這是extend的getSum里面的方法'); } } } var mixin={ data:{mixinData:'我是mixin的data'}, created:function(){ console.log('這是mixin的created'); }, methods:{ getSum:function(){ console.log('這是mixin的getSum里面的方法'); } } } var vm=new Vue({ el:'#app', data:{mixinData:'我是vue實(shí)例的data'}, created:function(){ console.log('這是vue實(shí)例的created'); }, methods:{ getSum:function(){ console.log('這是vue實(shí)例里面getSum的方法'); } }, mixins:[mixin], extends:extend }) //打印結(jié)果 這是extend的created 這是mixin的created 這是vue實(shí)例的created 這是vue實(shí)例的getSum里面的方法
結(jié)論:
1.extends執(zhí)行順序?yàn)?extends>mixins>mixinTwo>created
2.定義的屬性覆蓋規(guī)則和mixins一致
注冊(cè)一個(gè)局部組件
//1.創(chuàng)建組件構(gòu)造器 var obj = { props: [], template: '<p><p>{{extendData}}</p></p>',//最外層只能有一個(gè)大盒子,這個(gè)和<tempalte>對(duì)應(yīng)規(guī)則一致 data: function () { return { extendData: '這是component局部注冊(cè)的組件', } }, }; var Profile = Vue.extend(obj); //3.掛載 new Vue({ el: '#app', components:{ 'component-one':Profile, 'component-two':obj } });
1.是開(kāi)發(fā)vue的插件,這個(gè)方法的第一個(gè)參數(shù)是 Vue 構(gòu)造器,第二個(gè)參數(shù)是一個(gè)可選的選項(xiàng)對(duì)象(可選)
2.vue.use方法可以調(diào)用install方法,會(huì)自動(dòng)阻止多次注冊(cè)相同插件
var MyPlugin = {}; MyPlugin.install = function (Vue, options) { // 2. 添加全局資源,第二個(gè)參數(shù)傳一個(gè)值默認(rèn)是update對(duì)應(yīng)的值 Vue.directive('click', { bind(el, binding, vnode, oldVnode) { //做綁定的準(zhǔn)備工作,添加時(shí)間監(jiān)聽(tīng) console.log('指令my-directive的bind執(zhí)行啦'); }, inserted: function(el){ //獲取綁定的元素 console.log('指令my-directive的inserted執(zhí)行啦'); }, update: function(){ //根據(jù)獲得的新值執(zhí)行對(duì)應(yīng)的更新 //對(duì)于初始值也會(huì)調(diào)用一次 console.log('指令my-directive的update執(zhí)行啦'); }, componentUpdated: function(){ console.log('指令my-directive的componentUpdated執(zhí)行啦'); }, unbind: function(){ //做清理操作 //比如移除bind時(shí)綁定的事件監(jiān)聽(tīng)器 console.log('指令my-directive的unbind執(zhí)行啦'); } }) // 3. 注入組件 Vue.mixin({ created: function () { console.log('注入組件的created被調(diào)用啦'); console.log('options的值為',options) } }) // 4. 添加實(shí)例方法 Vue.prototype.$myMethod = function (methodOptions) { console.log('實(shí)例方法myMethod被調(diào)用啦'); } } //調(diào)用MyPlugin Vue.use(MyPlugin,{someOption: true }) //3.掛載 new Vue({ el: '#app' });
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com