導讀微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務的免費應用程序,由張小龍所帶領的騰訊廣州研發中心產品團隊打造 [2] 。微信支持跨通信運營商、跨操作系統平臺... 微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務的免費應用程序,由張小龍所帶領的騰訊廣州研發中心產品團隊打造 [2] 。微信支持跨通信運營商、跨操作系統平臺通過網絡快速發送免費(需消耗少量網絡流量)語音短信、視頻、圖片和文字,同時,也可以使用通過共享流媒體內容的資料和基于位置的社交插件“搖一搖”、“漂流瓶”、“朋友圈”、”公眾平臺“、”語音記事本“等服務插件。
下文要講的是小程序框架 minapp 中實現雙向綁定的原理,在 minapp 中,你只需要在 wxml 模板中給組件的屬性名后加上 .sync 就可以實現雙向綁定。下面為了解釋其原理,過程可能會說的稍微復雜些,但其實 minapp 框架已經處理了那些繁雜的細節! 首先,要使數據雙向綁定,應該避免過多的數據源。 并不是所有數據都需要雙向綁定,也并不是所有數據都是對外的,子組件還可以有它自己的一個內部數據。所以這就涉及到我們要說的第二個問題:區分哪些數據需要雙向綁定,哪些數據又需要子組件自己維護。 用過 vue 的應該都知道,在 vue 中要實現雙向綁定,需要在模板中做特殊處理。比如要將父組件的 <child childAttr.sync="parentAttr" /> 但是小程序并沒有這樣的簡單的語法,小程序的 wxml 語言的屬性名中甚至都不允許出現 " . " 這樣的字符。回到我們的問題上來,子組件需要知道哪些屬性需要雙向綁定,哪些屬性需要自己維護, <child childAttr="{{parentAttr}}" syncAttrMap="childAttr=parentAttr" /><!-- 如果同時存在多個雙向綁定和不需要雙向綁定的屬性時,可以寫成下面這樣: p1, p2 分別雙向綁定到子組件的 c1, c2,而 p3 單向綁定到 c3 上--><child c1="{{p1}}" c2="{{p2}}" c3="{{p3}}" syncAttrMap="c1=p1&c2=p2" /> 接著,就需要處理子組件數據更新的問題了,在子組件中有兩部分數據,一部分是內部數據,另一部分是父組件中的數據, 所以根據上面的描述,父組件需要有個監聽函數,子組件需要有個智能的 // 父組件Component({ methods: { onSyncAttrUpdate(e) { this.setData(e.detail) // 子組件傳來的需要更新的數據 } }}) <!-- 父組件的模板 --><child childAttr="{{parentAttr}}" syncAttrMap="childAttr=parentAttr" bind:syncAttrUpdate="onSyncAttrUpdate" /> // 子組件Component({ properties: { childAttr: String, syncAttrMap: String }, methods: { // 子組件更新數據時,只要調用此方法即可,而不是 `setData` setDataSmart(data) { // splitDataBySyncAttrMap 函數的實現過程就不說了,只是將對象拆分,大家應該都能實現 let {parentData, innerData} = splitDataBySyncAttrMap(data, this.data.syncAttrMap) // 內部數據使用 setData 更新 if (Object.keys(innerData).length) { this.setData(innerData) // setData 中還支持 callback 的回調,為了簡化代碼,這里不討論 } // 雙向綁定的父組件數據觸發事件讓父組件自己去更新 if (Object.keys(parentData).length) { this.triggerEvent('syncAttrUpdate', parentData) } } }}) 到此,一個簡單的雙向綁定功能就完成了。但是由于子組件也有可能包含其它組件,也就是說子組件也可以是父組件,而父組件同樣也 // BaseComponentconst BaseComponent = { properties: { syncAttrMap: String }, methods: { setDataSmart() { // ... }, onSyncAttrUpdate() { // ... } }} 然后將 BaseComponent minin 到每個組件的對象上去就可以了;另外小程序中還有一個特殊的組件:Page,雖然 Page 和 Component 結構是兩樣的, 等等,最后還有一件事:wxml 模板,不能讓用戶每次寫雙向綁定的時候都要寫那么復雜語句吧?當然不用,minapp 在編譯時,會將模板做個簡單的轉化: <child childAttr.sync="parentAttr" /><!-- 由于屬性名 syncAttrMap 是固定的,所以完全可以通過編譯手段,將上面的模板轉成下面這個模板 --><child childAttr="{{parentAttr}}" syncAttrMap="childAttr=parentAttr" /> 謝謝,文章到此結束,歡迎關注 minapp:重新定義微信小程序的開發 相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章! 推薦閱讀: 以上就是微信小程序怎么實現數據雙向綁定的詳細內容,更多請關注php中文網其它相關文章! 微信提供公眾平臺、朋友圈、消息推送等功能,用戶可以通過“搖一搖”、“搜索號碼”、“附近的人”、掃二維碼方式添加好友和關注公眾平臺,同時微信將內容分享給好友以及將用戶看到的精彩內容分享到微信朋友圈。 |
溫馨提示:喜歡本站的話,請收藏一下本站!