縱觀現代前端框架中(不論ng react vue ) 基本四架馬車 聲明式渲染 路由 組件化 狀態管理。 反觀小程序開發環境 缺失蠻多特性的 好在 11月初微信團隊,發布了官方的component 化方案, 我們基本上可以告別現有的hack辦法去實現 component 化。 hack方式
使用template實現組件化
實現一個組件方便快速理解,下面使用官方組件化方案 實現一個模態彈窗 easyModal. 請結合源碼看 https://gitee.com/sherlock221...
閱讀前 請先讀通官方自定義組件文檔 組件分析
首先分成2個小組件 來實現這個模態彈窗 基本模態彈窗 具備
1.顯示/隱藏 增強型模態彈窗 具備
1.基礎模態彈窗功能 基本模態窗
首先在base文件夾下直接右鍵創建component -> baseModal Component({ options : { multipleSlots: true }, /** * 組件的屬性列表 */ properties: { backdrop: { type: Boolean, value: true }, animated : { type: Boolean, value: true }, modalSize : { type: String, value: "md" }, animationOption : { type : Object, value : { duration : 300 } } }, } 下來創建 data,isShow控制 彈窗顯示和隱藏 animation則是彈窗動畫函數. /** * 組件的初始數據 */ data: { isShow : false, animation : '' }, 在生命周期函數 ready中初始化animation ready: function () { this.animation = wx.createAnimation({ duration: this.data.animationOption.duration, timingFunction: "linear", delay: 0 }); }, 組件有2個public方法 show hide 方法, private 有執行動畫 和 切換顯隱的方法 methods: { hideModal : function(e){ if(e){ let type = e.currentTarget.dataset.type; if (type == 'mask' && !this.data.backdrop) { return; } } if (this.data.isShow) this._toggleModal(); }, showModal : function(){ if (!this.data.isShow) { this._toggleModal(); } }, _toggleModal : function(){ if(!this.data.animated){ this.setData({ isShow: !this.data.isShow }) } else{ let isShow = !this.data.isShow; this._executeAnimation(isShow); } }, _executeAnimation: function (isShow) { ...... } } 可以通過animated屬性來判斷 組件是否需要調用_executeAnimation 來執行動畫顯示 頁面結構 <view animation="{{animationData}}" hidden="{{!isShow}}" class='modal'> <view data-type="mask" catchtap='hideModal' class='modal-mask' >view> <view class='modal-layer modal-layer-radius {{modalSize == "sm" ? " modal-layer-sm" : " modal-layer-md" }} ' > <view class='modal-header'> <slot name="header">slot> view> <view class='modal-body'> <slot name="body">slot> view> <view class='modal-footer'> <slot name="footer">slot> view> view> view>
slot 節點,用于承載組件使用者提供的wxml結構。 options : { multipleSlots: true },
下來創建樣式wxss /** 模態 **/ .modal{ position: fixed; top: 0rpx; left: 0rpx; right: 0rpx; bottom: 0rpx; width: 100%; height: 100%; z-index: 100; } ..............
@import "../../style/font.wxss"; 這樣會增加組件和業務的耦合度 公共組件不建議使用 接下來可以在業務界面中去使用 <base-modal id="thridModal"> <view slot="header" class='modal-header'> 頭部 view> <view slot="body" class='modal-body'> 中間 view> <view slot="footer" class='modal-footer'> 尾部 view> base-modal> 別忘了在業務頁面的json中引入組件 { "usingComponents": { "base-modal": "/component/easyModal/base/baseModal" } } 還記得我們上面baseModal 有兩個public方法 怎么樣去調用呢 這里介紹下
我們給 onReady: function () { this.thridModal = this.selectComponent("#thridModal"); }, 然后就可以調用實例的public的方法. this.thridModal.showModal(); this.thridModal.hideModal(); 增強模態窗增強模態窗是基于baseModal的. { "component": true, "usingComponents": { "base-modal" : "../base/baseModal" } } 注意 增強模態窗口 需要包含 基本模態窗口 json中引用才能使用 <base-modal id="baseModal" modalSize="{{modalSize}}" animated="{{animated}}" backdrop="{{backdrop}}"> <view slot="header" class='modal-header'> <text>{{title}}text> view> <view slot="body" class='modal-body'> <slot>slot> view> <view slot="footer" class='modal-footer'> <text catchtap='_cancelModal' class='btn btn-default'>{{cancelText}}text> <text catchtap='_confirmModal' class='btn btn-primary'>{{confirmText}}text> view> base-modal> 說下event部分 確定 取消按鈕是需要 向外部page 發送事件通知的其進行業務操作的 //cancel _cancelModal : function(){ this.hide(); this.triggerEvent("cancelEvent"); }, //success _confirmModal : function(){ this.triggerEvent("confirmEvent"); } 通過triggerEvent觸發事件 這點和官網文檔沒有區別. 業務Page界面: <easy-modal id="easyModal" title="這個是標題 01" bind:cancelEvent="_cancelEvent" bind:confirmEvent="_confirmEventFirst" > <view class='modal-content'> <text> 這是內容部分 01 text> <text> 這是內容部分 01 text> <text> 這是內容部分 01 text> |