微信小程序組件化開發代碼實現 : 因此wepy更適合大型小程序(當你有足夠理由使用它時),就像Vuex官方文檔中提到的那樣:若是您的應用夠簡單,您最好不要使用 Vuex。一個簡單的 global event bus 就足夠您所需了。 1.// src/components/tab.wxml 2.<view class="tab"> 3.<view class="tab_item tab_message{{tabActive == 0 ? ' active' : ''}}" bindtap="tabChange(0)"> 4.<image class="icon" src="../images/message{{tabActive == 0 ? '_active' : ''}}.png">image> 5.<text class="title">微信text> 6.view> 7.... 8.view> 而對於js能夠簡單封裝成對象,而後直接與頁面對象合併便可:微信小程序 1.// src/components/tab.js 2.export default class { 3.data: { 4.tabActive: { 5.twoWay: true 6.} 7.}, 8.change (idx, evt) { 9.this.active = +idx; 10.} 11.} 不少人都會想到這樣調用:微信 1.// src/pages/index.wxml 2.<include src="../components/tab.wxml"/> 3.... 4.// src/pages/index.js 5.import tab from '../components/tab.js' 6.let page = { 7.... 8.} 9.Object.assign(page, tab) 10.Page(page) 直接用Object.assign來實現最大的壞處就是父頁面沒法監聽組件事件,好比在例子中tab頁籤被點擊的時候,tab組件內部須要作樣式的變化,而對於父頁面也須要監聽這個事件來展示對應的內容。 1.// src/components/tab.js 2.export default class { 3.tabActive: { 4.twoWay: true 5.}, 6.change (idx, evt) { 7.this.active = +idx; 8.} 9.} 10.// src/pages/index.js 11.import tab from '../components/tab.js' 12.import {combine} from '../util.js' 13.let page = { 14.tabClick(event) { 15.... 16.} 17.... 18.} 19.combine(page, tab) 20.Page(page) 而對於combine函數只須要判斷數據類型而後執行對應的操做便可。框架 1.// util.js 2./** 3.* 組件對象與頁面對象融合 4.* @param {Object} target 頁面對象 5.* @param {Object} source 組件對象,支持不定參數 6.* return {Object} 返回一個融合後的頁面對象 7.*/ 8.let combine = (target, ...source) => { 9.source.forEach(function(arg) { 10.if('object' === typeof arg) { 11.for(let p in arg) { 12.if('object' === typeof arg[p]) { 13.// 對於對象,直接採用 Object.assign 14.target[p = target[p || {} 15.Object.assign(target[p], arg[p]) 16.} else if('function' === typeof arg[p]) { 17.// 函數進行融合,先調用組件事件,而後調用父頁面事件 18.let fun = target[p ? target[p : function(){} 19.delete target[p 20.target[p = function() { 21.arg[p].apply(this, arguments) 22.fun.apply(this, arguments) 23.} 24.} else { 25.// 基礎數據類型,直接覆蓋 26.target[p = target[p || arg[p 27.} 28.} 29.} 30.}) 31.} 32.export default { 33.combine 34.} 這種方案彷佛簡單明瞭地實現了組件化,可是有一個問題,那就是組件地複用。 總結 |