前言最近摩拜單車小程序需求越來越多,多人協作,甚至多個項目并行。如何合作的更順暢,提升團隊成員開發效率,這便是這段時間思考的問題。 其中很重要的一點就是,小程序功能組件化。但小程序的開發框架目前還不支持component,結合具體開發經驗,我們封裝了wx-component。 思想靜態模板利用微信小程序支持的template特性,在page中使用template去調用組件,并把組件的methods提升到page的屬性中去,這樣便可以在component中使用bindtap等綁定組件“私有”事件方法。 component和page的互相調用在component的私有方法或onLoad等事件中,可以使用parent獲取page對象: this.parent.setData({ text: "my btn text" }) let { text } = this.parent.data 你也可以在page中使用childrens獲取component對象: Page({ data: {}, components: { login: { text: "my login btn text", onLogin() { ... } } }, onLoad() { this.childrens.login.setData({ text: "my text" }) let { text } = this.childrens.login.data } }) props和data在page中聲明組件依賴,可以傳入props,如: Page({ data: {}, components: { // 傳入`props` login: { text: "my login btn text", onLogin() { ... } } } })
你可以在component中通過this.props取到所有的prop值。 component的methods組件私有的方法,但最終會被合并到page的config屬性里,以便于在component的template中調用。 Pagewx-component會重新定義小程序原有的Page方法,所以你只需要在項目根目錄的app.js中require一次就可以,后續無需重新require: /project/app.js require("/libs/wx-component/index") App({ onLaunch() { ... }, globalData: { ... } }) component的onLoad和onUnload這兩個事件對應page的onLoad和onUnload,但不支持onShow等其他page事件,你可以在page的onShow中使用this.childrens獲取組件并調用其私有方法。 推薦的目錄結構├─project 項目 ├─components 功能組件 ├─login 登錄組件 ├─index.wxss ├─index.wxml ├─index.js ├─pages 頁面 component的結構{ // 組件名 // 也可以不填,不填寫會用`components/{X}/index.js`中的X命名 name: "login", // 組件私有數據 data: { item: [1, 2, 3] }, // 組件屬性 // 可以預先定義默認值 // 也可以外部傳入覆蓋默認值 props: { text: "start" }, // 當組件被加載 onLoad() { this.setData({ is_loaded: true }) }, // 當組件被卸載 onUnload() { this.setData({ is_unloaded: true }) }, // 組件私有方法 methods: { getMsg() { ... }, sendMsg() { ... } }, // 其他 .... } API文檔更詳細的API文檔請見Github。 前面的路由于這幾乎是以Hack的方式去解決非靜態微信組件化,data、props和methods的merge也會有些混亂,終究只是更方便更快速的解決業務需求。 期待微信小程序團隊盡快發布Component支持。 |