基于angular實現(xiàn)模擬微信小程序swiper組件
這段時間的主業(yè)是完成一個家政類小程序,終于是過審核發(fā)布了。不得不說微信的這個小程序生態(tài)還是頗有想法的,拋開他現(xiàn)有的一些問題不說,其提供的組件系統(tǒng)乍一看還是蠻酷的。比如其提供的一個叫swiper的視圖組件,就可以在寫界面的時候省不少時間和代碼,輪播圖片跟可滑動列表都可以用。導致現(xiàn)在回來寫angular項目時也想整一個這樣的組件出來,本文就將使用angular的組件能力和服務能力完成這么一個比較通用,耦合度較低的swiper出來。
首先要選擇使用的技術(shù),要實現(xiàn)的是與界面打交道的東西,自然是實現(xiàn)成一個組件,最終要實現(xiàn)的效果是寫下這樣的代碼就可以完成一個可以滑動的視圖來:
然后要把最基本的組件定義寫出來,顯然這里要定義兩個組件。第一個是父級組件,選擇器名字就叫ytm-swipers,目前做的事情僅僅是做一個外殼定義基本樣式,使用時的子標簽都會插入在ng-content標簽中。
1 @Component({ 2 selector: 'ytm-swipers', 3 template: ` 4
5
第二個就是子視圖了,在父級組件下,每個子組件都會沾滿父級組件,只有當前的子組件會顯示,當切換視圖時實際做的就是更改這些子組件的顯示方式,說的最簡單的話,這個子組件還是僅僅用來加一個子外殼,給外殼添加基本樣式,實際的頁面內(nèi)容原封不動放在ng-content標簽中。
1 @Component({ 2 selector: 'swiper', 3 template: ` 4
7
下一步是要讓這兩個父子組件完成心靈的溝通,講道理其實可以直接使用ElementRef強行取到DOM來操作,不過這里使用的是組件內(nèi)服務。和普通的服務使用上沒差別,不過其provider是聲明在某個組件里的,所以此服務只有在此組件以及子組件中可以注入使用。
組件內(nèi)服務
用到的變量包括: changing變量保證同時只能進行一個切換,保證切換完成才能進行下一個切換;swiperList裝填所有的視圖的id,這個id在視圖初始化的時候生成;displayList數(shù)組只會有三個成員,裝填的依次是當前視圖在swiperList中的索引,下一個視圖的索引,上一個視圖的索引;current變量用戶指示當前顯示的視圖的id。實際視圖中的顯示的控制就是使用ngClass指令來根據(jù)displayList和視圖id附加相應的類,當前視圖會正好顯示,前一視圖會在左邊剛好遮擋,后一視圖會在右邊剛好遮擋。
同時服務還要提供幾個方法:Add用于添加制定id的視圖,Next用于切換到下一個視圖(左滑時調(diào)用),Prev用于切換到前一個視圖(右滑時調(diào)用),再來一個Skip用于直接切換到指定id的視圖。
在子視圖中注入此服務,需要在子視圖初始化時生成一個id并Add到視圖列表中:
1 export class YTMSwiperViewComponent { 2 public childId: number; 3 constructor(@Optional() @Host() public swiper: SwiperService) { 4 this.childId = this.swiper.swiperList.length; 5 this.swiper.Add(this.swiper.swiperList.length); 6 } 7 }
這個id其實就是已有列表的索引累加,且一旦有新視圖被初始化,都會添加到列表中(支持動態(tài)加入很酷,雖然不知道會有什么隱藏問題發(fā)生)。
父組件中首先必須要配置一個provider聲明服務:
1 @Component({ 2 selector: 'ytm-swipers', 3 template: ` 4
5
然后就是要監(jiān)聽手勢滑動事件,做出相應的切換。以及傳入一個current變量,每當此變量更新時都要切換到對應id的視圖去,實際使用效果就是:
父組件實現(xiàn)
此外代碼中還添加了一個回調(diào)函數(shù),可以再視圖完成切換時執(zhí)行傳入的回調(diào),這個使用的是angular的EventEmitter能力。
以上就是全部實現(xiàn)了,實際的使用示例像這樣:
視圖的切換有了兩種方式,一是手勢滑動,不過沒有寫實時拖動,僅僅是判斷左右滑做出反應罷了,二是更新[current]節(jié)點的值。
整個組件的實現(xiàn)沒有使用到angular一些比較底層的能力,僅僅是玩弄css樣式以及組件嵌套并通過服務交互,以及Input、Output與外界交互。相比之下ionic的那些組件就厲害深奧多了,筆者還有很長的路要走。
第二部分:如何開通一個小商店