詳解Vue2.0組件的繼承與擴(kuò)展
前言
本文將介紹vue2.0中的組件的繼承與擴(kuò)展,主要分享slot、mixins/extends和extend的用法。
一、slot
1.默認(rèn)插槽和匿名插槽
slot
用來(lái)獲取組件中的原內(nèi)容,此方式用于父組件向子組件傳遞“標(biāo)簽數(shù)據(jù)”。有的時(shí)候?yàn)椴宀厶峁┠J(rèn)的內(nèi)容是很有用的,例如,一個(gè)<my-hello>
組件可能希望這個(gè)按鈕的默認(rèn)內(nèi)容是“如果沒有原內(nèi)容,則顯示該內(nèi)容”,但是同時(shí)允許用戶覆寫為別的內(nèi)容。
<body> <div id="itany"> <my-hello>180812</my-hello> </div> <template id="hello"> <div> <h3>welcome to xiamen</h3> <slot>如果沒有原內(nèi)容,則顯示該內(nèi)容</slot>// 默認(rèn)插槽 </div> </template> <script> var vm=new Vue({ el:'#itany', components:{ 'my-hello':{ template:'#hello' } } }); </script>
2.具名插槽
有些時(shí)候我們需要多個(gè)插槽,<slot>
元素有一個(gè)特殊的特性:name。這個(gè)特性可以用來(lái)定義額外的插槽:
<div id="itany"> <my-hello> <ul slot="s1"> <li>aaa</li> <li>bbb</li> <li>ccc</li> </ul> <ol slot="s2"> <li>111</li> <li>222</li> <li>333</li> </ol> </my-hello> </div> <template id="hello"> <div> <slot name="s2"></slot> <h3>welcome to xiamen</h3> <slot name="s1"></slot> </div> </template> <script> var vm=new Vue({ el:'#itany', components:{ 'my-hello':{ template:'#hello' } } }); </script>
二、mixins
1.mixins簡(jiǎn)介
混入 (mixins) 是一種分發(fā) Vue 組件中可復(fù)用功能的非常靈活的方式?;烊雽?duì)象可以包含任意組件選項(xiàng)。當(dāng)組件使用混入對(duì)象時(shí),所有混入對(duì)象的選項(xiàng)將被混入該組件本身的選項(xiàng)。mixins 選項(xiàng)接受一個(gè)混合對(duì)象的數(shù)組。
2.mixins用途
一般有兩種用途:
1、在你已經(jīng)寫好了構(gòu)造器后,需要增加方法或者臨時(shí)的活動(dòng)時(shí)使用的方法,這時(shí)用混入會(huì)減少源代碼的污染。
2、很多地方都會(huì)用到的公用方法,用混入的方法可以減少代碼量,實(shí)現(xiàn)代碼重用。
例如下面的例子:實(shí)現(xiàn)每次數(shù)據(jù)變化時(shí)都能夠在控制臺(tái)打印出提示:"數(shù)據(jù)發(fā)生變化"
<h1>Mixins</h1> <hr> <div id="app"> <p>num:{{ num }}</p> <P> <button @click="add">增加數(shù)量<tton> </P> </div> <script type="text/javascript"> var addLog = { //額外臨時(shí)加入時(shí),用于顯示日志 updated: function () { console.log("數(shù)據(jù)發(fā)生變化,變化成" + this.num + "."); } } Vue.mixin({// 全局注冊(cè)一個(gè)混入,影響注冊(cè)之后所有創(chuàng)建的每個(gè) Vue 實(shí)例 updated: function () { console.log("我是全局的混入") } }) var app = new Vue({ el: '#app', data: { num: 1 }, methods: { add: function () { this.num++; } }, updated() { console.log("我是原生的update") }, mixins: [addLog]//混入 })
3.mixins的調(diào)用順序
上例說(shuō)明了:從執(zhí)行的先后順序來(lái)說(shuō),混入對(duì)象的鉤子將在組件自身鉤子之前調(diào)用,如果遇到全局混入(Vue.mixin
),全局混入的執(zhí)行順序要前于混入和組件里的方法。
三、extends
1.extends用法
extends選項(xiàng)允許聲明擴(kuò)展另一個(gè)組件,而無(wú)需使用 Vue.extend
。
通過外部增加對(duì)象的形式,對(duì)構(gòu)造器進(jìn)行擴(kuò)展。它和混入mixins非常的類似。只不過接收的參數(shù)是簡(jiǎn)單的選項(xiàng)對(duì)象或構(gòu)造函數(shù),所以extends只能單次擴(kuò)展一個(gè)組件。
<h1>Extends</h1> <hr> <div id="app"> num:{{ num }} <p> <button @click="add">add</button> </p> </div> <script type="text/javascript"> var bbb = { updated() { console.log("我是被擴(kuò)展出來(lái)的"); }, methods: { add: function () { //跟原生的方法沖突,取原生的方法,這點(diǎn)跟混入一樣 console.log('我是被擴(kuò)展出來(lái)的add方法!'); this.num++; } } }; var app = new Vue({ el: '#app', data: { num: 1 }, methods: { add: function () { console.log('我是原生add方法'); this.num++; } }, updated() { console.log("我是擴(kuò)展出來(lái)的"); }, extends: bbb// 接收對(duì)象和函數(shù) })
從上面的例子也可看出,執(zhí)行的先后順序和mixins一樣,另外擴(kuò)展的方法與原生的沖突時(shí),擴(kuò)展的方法不生效,這點(diǎn)跟混入一樣。
2.extends和mixins優(yōu)先級(jí)比較
var extend={ data:{extendData:'我是extend的data'}, created:function(){ console.log('這是extend的created'); } } var mixin={ data:{mixinData:'我是mixin的data'}, created:function(){ console.log('這是mixin的created'); } } 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 })
由此可以得出,相對(duì)于mixins,extends觸發(fā)的優(yōu)先級(jí)更高
四、extend
Vue.extend只是創(chuàng)建一個(gè)構(gòu)造器,它是為了創(chuàng)建可復(fù)用的組件。其主要用來(lái)服務(wù)于Vue.component,用來(lái)生成組件
<div id="itany"> <hello></hello> <my-world></my-world> </div> <script> /** * 方式1:先創(chuàng)建組件構(gòu)造器,然后由組件構(gòu)造器創(chuàng)建組件 */ //1.使用Vue.extend()創(chuàng)建一個(gè)組件構(gòu)造器 var MyComponent = Vue.extend({ template: '<h3>Hello World</h3>' }); //2.使用Vue.component(標(biāo)簽名,組件構(gòu)造器),根據(jù)組件構(gòu)造器來(lái)創(chuàng)建組件 Vue.component('hello', MyComponent); /** * 方式2:直接創(chuàng)建組件(推薦) */ // Vue.component('world',{ Vue.component('my-world', { template: '<h1>你好,世界</h1>' }); var vm = new Vue({ //這里的vm也是一個(gè)組件,稱為根組件Root el: '#itany', data: {} }); </script>
如果有需要源代碼,請(qǐng)猛戳源代碼
參考文章
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3 style CSS 變量注入的實(shí)現(xiàn)
本文主要介紹了Vue3 style CSS 變量注入的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07詳解Electron中如何使用SQLite存儲(chǔ)筆記
這篇文章主要為大家介紹了Electron中如何使用SQLite存儲(chǔ)筆記示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11詳解vue-cli構(gòu)建項(xiàng)目反向代理配置
本篇文章主要介紹了詳解vue-cli構(gòu)建項(xiàng)目反向代理配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-09-09vue開發(fā)中后臺(tái)系統(tǒng)復(fù)雜表單優(yōu)化技巧
這篇文章主要為大家介紹了vue開發(fā)中后臺(tái)系統(tǒng)復(fù)雜表單的優(yōu)化技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07vue 如何將二維數(shù)組轉(zhuǎn)化為一維數(shù)組
這篇文章主要介紹了vue 如何將二維數(shù)組轉(zhuǎn)化為一維數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04