摘要:在中,我們是否也有一些手段或特性來(lái)提高組件的復(fù)用程度和靈活性呢答案當(dāng)然是有的,那就是。成果通過(guò)實(shí)現(xiàn),我們成功將注入的邏輯抽離了出來(lái),這樣每次需要共享組件的狀態(tài)和方法時(shí),混入該即可。
03 使用 mixin 來(lái)增強(qiáng) Vue 組件 目標(biāo)
之前一篇文章中,我們雖然將 toggle 組件劃分為了 toggle-button、toggle-on 和 toggle-off 三個(gè)子組件,且一切運(yùn)行良好,但是這里面其實(shí)是存在一些問(wèn)題的:
toggle 組件的內(nèi)部狀態(tài)和方法只能和這三個(gè)子組件共享,我們期望第三方的組件也可以共享這些狀態(tài)和方法
inject 的注入邏輯我們重復(fù)編寫(xiě)了三次,如果可以的話,我們更希望只聲明一次(DRY原則)
inject 的注入邏輯當(dāng)前為硬編碼,某些情況下,我們可能期望進(jìn)行動(dòng)態(tài)地配置
如果熟悉 react 的讀者這里可能馬上就會(huì)想到 HOC(高階組件) 的概念,而且這也是 react 中一個(gè)很常見(jiàn)的模式,該模式能夠提高 react 組件的復(fù)用程度和靈活性。在 vue 中,我們是否也有一些手段或特性來(lái)提高組件的復(fù)用程度和靈活性呢?答案當(dāng)然是有的,那就是 mixin。
實(shí)現(xiàn)關(guān)于 mixin 本身的知識(shí),這里就不做過(guò)多贅述了,不熟悉的讀者可以去官方文檔了解。我們通過(guò)聲明一個(gè)叫作 toggleMixin 的 mixin 來(lái)抽離公共的注入邏輯,如下:
export const withToggleMixin = { inject: { toggleComp: "toggleComp" } };
之后,每當(dāng)需要注入 toggle 組件提供的依賴項(xiàng)時(shí),就混入當(dāng)前 mixin,如下:
mixins: [withToggleMixin]
如果關(guān)于注入的邏輯,我們?cè)黾右恍╈`活性,比如期望自由地聲明注入依賴項(xiàng)的 key 時(shí),我們可以借由 HOC 的概念,聲明一個(gè)高階 mixin(可以簡(jiǎn)稱 HOM ?? 皮一下,很開(kāi)心),如下:
export function withToggle(parentCompName = "toggleComp") { return { inject: { [parentCompName]: "toggleComp" } }; }
這個(gè) HOC mixin 可以按如下的方式使用:
mixins: [withToggle("toggle")]
這樣在當(dāng)前的組件中,調(diào)用 toggle 組件相關(guān)狀態(tài)和方法時(shí),就不再是 this.toggleComp,而是 this.toggle。
成果通過(guò)實(shí)現(xiàn) toggleMixin,我們成功將注入的邏輯抽離了出來(lái),這樣每次需要共享 toggle 組件的狀態(tài)和方法時(shí),混入該 mixin 即可。這樣就解決了第三方組件無(wú)法共享其狀態(tài)和方法的問(wèn)題,在在線實(shí)例代碼中,我實(shí)現(xiàn)了兩個(gè)第三方組件,分別是 custom-button 和 custom-status-indicator,前者是自定義開(kāi)關(guān),使用 withToggleMixin 來(lái)混入注入邏輯,后者是自定義的狀態(tài)指示器,使用 withToggle 高階函數(shù)來(lái)混入注入邏輯。
你可以下面的鏈接來(lái)看看這個(gè)組件的實(shí)現(xiàn)代碼以及演示:
sandbox: 在線演示
github: part-3
總結(jié)mixin 作為一種分發(fā) Vue 組件中可復(fù)用功能的非常靈活的方式,可以在很多場(chǎng)景下大展身手,尤其在一些處理公共邏輯的組件,比如通知、表單錯(cuò)誤提示等,使用這種模式尤其有用。
目錄github gist
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98523.html
摘要:寫(xiě)在前頭去年,曾經(jīng)閱讀過(guò)一系列關(guān)于高級(jí)組件模式的文章,今年上半年,又抽空陸陸續(xù)續(xù)地翻譯了一系列關(guān)于高級(jí)組件模式的文章,碰巧最近接手了一個(gè)公司項(xiàng)目,前端這塊的技術(shù)棧是。同時(shí)這個(gè)組件還擁有一個(gè)屬性,用來(lái)初始化的狀態(tài)值。 寫(xiě)在前頭 去年,曾經(jīng)閱讀過(guò)一系列關(guān)于高級(jí) react 組件模式的文章,今年上半年,又抽空陸陸續(xù)續(xù)地翻譯了一系列關(guān)于高級(jí) angular 組件模式的文章,碰巧最近接手了一個(gè)公...
摘要:編寫(xiě)復(fù)合組件目標(biāo)我們需要實(shí)現(xiàn)的需求是能夠使使用者通過(guò)組件動(dòng)態(tài)地改變包含在它內(nèi)部的內(nèi)容。成果通過(guò)復(fù)合組件的方式,我們將組件劃分為了三個(gè)更小的職責(zé)更加單一的子組件。 02 編寫(xiě)復(fù)合組件 目標(biāo) 我們需要實(shí)現(xiàn)的需求是能夠使使用者通過(guò) 組件動(dòng)態(tài)地改變包含在它內(nèi)部的內(nèi)容。 熟悉 vue 的童鞋可能馬上會(huì)想到不同的解決方案,比如使用 slot 并配合 v-if,我們這里采用另外一種方法,利用 vu...
摘要:你可以下面的鏈接來(lái)看看這個(gè)組件的實(shí)現(xiàn)代碼以及演示在線演示總結(jié)當(dāng)期望獲得子元素或者子組件的引用時(shí),切記使用和來(lái)解決問(wèn)題。 05 使用 $refs 訪問(wèn)子組件引用 目標(biāo) 在之前的文章中,詳細(xì)闡述了子組件獲取父組件所提供屬性及方法的一些解決方案,如果我們想在父組件之中訪問(wèn)子組件的一些方法和屬性怎么辦呢?設(shè)想以下一個(gè)場(chǎng)景: 當(dāng)前的 custom-button 組件中,有一個(gè) input 元素...
摘要:在中,這種類型的組件也可以叫做函數(shù)式組件。這種組件和普通組件相比的優(yōu)勢(shì)主要在于,它是無(wú)狀態(tài)的,這意味著它的可測(cè)試性和可讀性更好,同時(shí)一些情況下,渲染開(kāi)銷也更小。 09 使用 Functional 組件 目標(biāo) 到此為止,我們的 toggle 組件已經(jīng)足夠強(qiáng)大以及好用了,因此這篇文章不會(huì)再為它增加新的特性。如果你是從第一篇文章一直讀到這里的讀者,你一定會(huì)發(fā)現(xiàn),整篇文章中,我?guī)缀鯖](méi)有對(duì) to...
摘要:使用替換目標(biāo)在第三篇文章中,我們使用來(lái)抽離了注入依賴項(xiàng)的公共邏輯。成果通過(guò)作用域插槽,我們有效地避免了第三方組件由于混入而可能造成的命名沖突以及隱式依賴等問(wèn)題。 04 使用 slot 替換 mixin 目標(biāo) 在第三篇文章中,我們使用 mixin 來(lái)抽離了注入 toggle 依賴項(xiàng)的公共邏輯。在 react 中,類似的需求是通過(guò) HOC 的方式來(lái)解決的,但是仔細(xì)想想的話,react 在早...
閱讀 961·2023-04-26 02:49
閱讀 1172·2021-11-25 09:43
閱讀 2541·2021-11-18 10:02
閱讀 2919·2021-10-18 13:32
閱讀 1281·2019-08-30 13:54
閱讀 2074·2019-08-30 12:58
閱讀 3008·2019-08-29 14:06
閱讀 2154·2019-08-28 18:10