摘要:我們就來(lái)說(shuō)說(shuō)如何創(chuàng)建一個(gè)靈活的高復(fù)用的組件。在一款優(yōu)秀的組件庫(kù)中有這么兩個(gè)組件與。什么是官方說(shuō)法混入是一種分發(fā)組件中可復(fù)用功能的非常靈活的方式。對(duì)象可以包含實(shí)例中的所有選項(xiàng),當(dāng)組件使用對(duì)象時(shí),對(duì)象中的所有選項(xiàng)將和組件中的選項(xiàng)進(jìn)行合并。
我們都知道 Vue 采用的是一種組件化開(kāi)發(fā)模式,組件在 Vue 中一個(gè)非常重要的核心概念。每個(gè)組件都是一個(gè)完整的實(shí)例,組件的創(chuàng)建,組件間的通訊,組件如何更好的復(fù)用,以及整個(gè)的生命周期的鉤子。所以你會(huì)發(fā)現(xiàn)它都是圍繞組件展開(kāi)的。
我們就來(lái)說(shuō)說(shuō)如何創(chuàng)建一個(gè)靈活的高復(fù)用的組件。之前分享過(guò)一篇「slot」內(nèi)容分發(fā)的文章,它可以讓我們組件的內(nèi)容更加的靈活。有興趣的可以看下。
《Vue一個(gè)案例引發(fā)「內(nèi)容分發(fā)slot」的最全總結(jié).md》
今天主要分享的是組件中另一種分發(fā),功能的分發(fā)「mixins」,也叫混入。在開(kāi)始之前呢,我們先看個(gè)案例,先從案例中看出個(gè)大概,然后帶著問(wèn)題去學(xué)習(xí)知識(shí)點(diǎn)會(huì)更加的高效,這也是我個(gè)人比較常用的學(xué)習(xí)方式。
在 Element(一款優(yōu)秀的組件庫(kù))中有這么兩個(gè)組件MessageBox 與 Dialog。
官方說(shuō)法:
從場(chǎng)景上說(shuō),MessageBox 的作用是美化系統(tǒng)自帶的 alert、confirm 和 prompt,因此適合展示較為簡(jiǎn)單的內(nèi)容。如果需要彈出較為復(fù)雜的內(nèi)容,請(qǐng)使用 Dialog。
所以你會(huì)發(fā)現(xiàn),這兩個(gè)組件非常的相似,他們共享一些相同的基本功能,如:打開(kāi)/關(guān)閉之間的狀態(tài)切換。但用法上又各有不同。請(qǐng)看下面的例子
// Message Box打開(kāi) Message Box // Dialog打開(kāi) Dialog 這是一段信息
相似的組件,相同基本功能,這時(shí)你不得不做出選擇,是將它們分成兩個(gè)不同的組件?還是只保留一個(gè)?
顯然這兩種做法都不完美,如果分成兩個(gè)組件,后期有功能的變動(dòng)話,就會(huì)去修改多次,帶來(lái)維護(hù)成本。如果保留一個(gè),但是用法上又各有不同,這可怎么辦呢?
有同學(xué)也會(huì)有疑問(wèn),不就兩個(gè)組件嗎?能帶來(lái)多少維護(hù)成本?其實(shí)不僅如此,類似于這種狀態(tài)切換的功能還有提示框,彈出框等等。
所以 Vue 給我們提供了一種方案叫功能的分發(fā)「mixins」。
什么是 Mixins官方說(shuō)法:混入 (mixins) 是一種分發(fā) Vue 組件中可復(fù)用功能的非常靈活的方式。
簡(jiǎn)單來(lái)說(shuō)就是可以讓不同的組件「共用」某個(gè)功能。
Mixins 對(duì)象可以包含 Vue 實(shí)例中的所有選項(xiàng),當(dāng)組件使用 Mixins 對(duì)象時(shí),Mixins 對(duì)象中的所有選項(xiàng)將和組件中的選項(xiàng)進(jìn)行合并。
既然如此那我們就來(lái)嘗試用 Mixins 對(duì)象 去修改上面兩個(gè)組件。讓它們可以共用一個(gè)方法。以下組件都是自己書(shū)寫的簡(jiǎn)單實(shí)現(xiàn),只實(shí)現(xiàn)狀態(tài)切換的基本功能。
//mixins.js export const showMixin = { data: function () { return { isShowing: true }; }, methods: { toggle() { this.isShowing = !this.isShowing; } } } //MessageBox//省略
可以看到,我們把兩個(gè)組件的相同功能給剝離出來(lái),采用 mixins 對(duì)象的方式然后在組件中引入即可,這樣以來(lái)組件就會(huì)有更好的靈活性。
有聰明的小伙伴應(yīng)該就會(huì)有疑問(wèn)了,如果 mixins 對(duì)象中的選項(xiàng)和組件實(shí)例中的選項(xiàng)相同時(shí)會(huì)怎么辦?這也是我們下面要說(shuō)到的問(wèn)題,Vue 中給出了我們幾個(gè)決策機(jī)制,一起來(lái)看看。
選項(xiàng)的合并data 對(duì)象的合并
當(dāng)組件與混入對(duì)象的 data 對(duì)象發(fā)生沖突時(shí),以組件中的優(yōu)先,如何沒(méi)有沖突將會(huì)進(jìn)行遞歸合并。
const mixin = { data: function() { return { hero: "蠻三刀", text: "來(lái)自mixins中的「上單一霸」" }; } }; export default { name: "DialogBox", mixins: [mixin], data() { return { text: "來(lái)自組件中的「上單一霸」" }; }, mounted() { console.log(this.$data); // {hero: "蠻三刀",text: "來(lái)自組件中的「上單一霸」"} } };
鉤子函數(shù)的合并
鉤子函數(shù)將會(huì)被全部調(diào)用,因?yàn)橥^子函數(shù)將會(huì)被合并成一個(gè)數(shù)組,但 mixins 中的鉤子會(huì)優(yōu)先于組件中的鉤子執(zhí)行。
const mixin = { created() { console.log("mixins中的上單一霸"); }, mounted() { console.log("mixins中的中單一霸"); } }; export default { name: "DialogBox", mixins: [mixin], created() { console.log("組件中的上單一霸"); }, mounted() { console.log("組件中的中單一霸"); } }; //mixins中的上單一霸 //組件中的上單一霸 //mixins中的中單一霸 //組件中的中單一霸
3.值為對(duì)象類型的合并
像methods、watch等值為對(duì)象類型的會(huì)合并成一個(gè)對(duì)象,如有沖突將采用組件中的。
const mixin = { methods: { say() { console.log("mixins組件上單一霸"); }, do() { console.log("mixins偷塔"); } } }; export default { name: "DialogBox", mixins: [mixin], methods: { say() { console.log("組件上單一霸"); } }, mounted() { this.say(); //組件上單一霸 this.do(); //mixins偷塔 } };
通過(guò)上面一些案例的解釋,你應(yīng)該熟悉了如何利用 混入對(duì)象去創(chuàng)建一個(gè)高復(fù)用組件了,不妨去嘗試一下。
最后,希望大家能夠有所收獲。如果你覺(jué)得本文不錯(cuò)歡迎點(diǎn)贊轉(zhuǎn)發(fā)。
關(guān)注微信公眾號(hào):六小登登,學(xué)習(xí)更多干貨文章,領(lǐng)取全套學(xué)習(xí)資源。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101940.html
摘要:插件分類插件通常會(huì)為添加全局功能,插件的編寫方法一般分為類,如上圖所示的插件應(yīng)當(dāng)有一個(gè)公開(kāi)方法。 前言 前段時(shí)間看到黃軼老師的一篇文章感觸頗多。特別是下面這一段話 插件 Vue 化引發(fā)的一些思考這篇文章我不僅僅是要教會(huì)大家封裝一個(gè) scroll 組件,還想傳遞一些把第三方插件(原生 JS 實(shí)現(xiàn))Vue 化的思考過(guò)程。很多學(xué)習(xí) Vue.js 的同學(xué)可能還停留在 XX 效果如何用 Vue....
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
摘要:入口文件,影響全局,作用是引入全局使用的庫(kù)公共的樣式和方法設(shè)置路由等。項(xiàng)目里總會(huì)有一些復(fù)用的組件,例如彈出框發(fā)送手機(jī)驗(yàn)證碼圖片上傳等,將它們作為通用組件,避免重復(fù)工作結(jié)構(gòu)如下可以根據(jù)功能模塊建立文件夾,放置本功能會(huì)用到的通用組件。 上一篇文章 https://segmentfault.com/a/11... 介紹了項(xiàng)目里文件夾的分類和作用,這次主要說(shuō)明 src 文件夾里具體的文件分類和...
閱讀 3755·2021-11-22 13:52
閱讀 3628·2019-12-27 12:20
閱讀 2401·2019-08-30 15:55
閱讀 2154·2019-08-30 15:44
閱讀 2273·2019-08-30 13:16
閱讀 585·2019-08-28 18:19
閱讀 1893·2019-08-26 11:58
閱讀 3447·2019-08-26 11:47