亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于Proxy的小程序狀態管理實現

2019-11-19 11:20:53
字體:
來源:轉載
供稿:網友

微信小程序的市場在進一步的擴大,而背后的技術社區仍在摸索著最好的實踐方案。我在幫助Nike,沃爾瑪以及一些創業公司開發小程序后,依舊認為使用小程序原生框架是一個更高效,穩定的選擇,而使用原生框架唯獨缺少一個好的狀態管理庫,如果不引入狀態管理則會讓我們在模塊化,項目結構以及單元測試上都有些捉襟見肘。

目前相對比較穩健的做法是針對redux或者mobx做一個adaptor應用到小程序中,但這樣需要自己想辦法打包引入外部庫,還要想怎么去寫這個adaptor,總顯得有些麻煩。于是我迸發出一個想法去寫一個專用于小程序的狀態管理庫,它使用起來足夠簡單并且可以通過小程序自己的npm機制安裝。

目前我已經用這個開源庫開發了兩個電商小程序,在提高我開發效率的同時亦保證了程序的性能,所以接下來我想談談這背后的理念以啟發更多開發者嘗試新的解決方案。

基于Proxy的狀態管理實現

Proxy在小程序中已經得到了足夠好的支持,目前并沒有發現在任何iPhone或者Android上不能使用Proxy的情況。而基于Proxy的狀態管理其實也就是訂閱監聽的模式,一方面監聽數據的變化,另一方面將這些變化傳達給訂閱的小程序頁面。

舉一個比較常見的例子,當一個用戶從自己的主頁進入用戶編輯頁面,然后更改了自己的用戶名點擊保存后,用戶主頁和用戶編輯頁上的用戶名這時候都應該被更新。這背后的程序邏輯則是:更新這個行為將觸發Proxy去通知狀態管理庫,然后狀態管理庫負責檢查此時還在頁面棧中的所有頁面,更新訂閱了用戶名這個數據的頁面,如下圖:

Part1: 監聽數據變化

監聽數據變化其實就是監聽各個Store的屬性變化,實現上就是在各個Store前面加了一層Proxy,用更直觀的圖片來表示就是這樣:

當一個Store被觀察以后,它的屬性就都變成了Proxy實例,當這個屬性值是Object或者Array的時候,它內部的值也會被包裝成Proxy實例,這樣無論多深層的數據變動都能被監聽到。
而在Proxy的后面,Store的屬性其實是被另一套數據(紫色部分)所維護,這套數據不負責監聽,它就是純數據,針對屬性的任何變動最后都會應用到這套數據上來,它的作用是維護和返回最新的數據。

實現細節: https://github.com/wwayne/minii/blob/master/src/api/observe.js

Part2: 頁面數據綁定

因為小程序每個頁面的js都是向Page中傳遞一個對象,這就讓我們有機會包裝這個對象,從而實現:

進入頁面后,將頁面保存在頁面棧中將來自狀態管理庫的數據映射到這個頁面的data上來頁面退出時,將頁面從頁面棧中移除

實現細節: https://github.com/wwayne/minii/blob/master/src/api/mapToData.js

Part3: 頁面訂閱更新

當數據被監聽到變化后,我們需要依次做兩件事,先是找到所有存儲在頁面棧里的頁面,然后根據各個頁面訂閱的數據來檢查變化,如果有變化就通知這些頁面,從而讓它們去觸發setData更新頁面。

實現細節:https://github.com/wwayne/minii/blob/master/src/core.js

使用狀態管理的例子

有了狀態管理庫,現在我們就來實現一開始舉例的更新用戶信息的操作,我們的文件路徑如下:

stores/ user.jspages/ userEdit/   index.js   index.wxml

1.首先我們創建一個Store保存用戶的信息,并且監聽它的變化:

// stores/user.jsimport { observe } from 'minii'Class UserStore { constructor () {   this.name = 'bob' } changeName (name) {   this.name = name }}export default observe(new UserStore(), 'user')

2.接著在我們的小程序頁面訂閱Store的信息

// pages/userEdit/index.jsimport { mapToData } from 'minii'import userStore from '../../stores/user'const connect = mapToData(state => (({ myName: state.user.name}))Page(connect({ updateNameToJames () {  userStore. changeName('james') }}))

3.完成,現在可以在頁面中使用和更新數據了

// pages/userEdit/index.wxml<text>{{ myName }}</text><button bindtap="updateNameToJames">update name to James</button>

最后

小程序因為有體積的限制,所以我希望在代碼量上也盡量做到輕量和便捷,所以目前這個狀態管理庫并沒有太多很復雜的功能,在小程序打包后所占用的體積也不到1kb,頗有點夠用就好的意思。

我也已經用它開發了兩款小程序,在經歷了一段時間的用戶使用后,我也更有信心說這個方案在小程序中是可行的。如果你有任何想法和建議,都歡迎告訴我。

項目Github: https://github.com/wwayne/minii

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美贵妇videos办公室| 欧美激情videoshd| 高清视频欧美一级| 欧美成人三级视频网站| 日韩美女免费线视频| 日本精品视频在线| 欧美国产精品人人做人人爱| 欧美极品在线视频| 第一福利永久视频精品| 黄网站色欧美视频| 成人国产亚洲精品a区天堂华泰| 国产成人精品电影| 日韩小视频网址| 亚洲第一免费播放区| 91精品国产91久久久久久吃药| 日韩欧美精品中文字幕| 亚洲在线观看视频网站| 久久精品99国产精品酒店日本| 欧美国产日韩二区| 亚洲精品福利资源站| 国产精品久久网| 亚洲白虎美女被爆操| 欧美精品aaa| 欧美性受xxx| 国产精品电影久久久久电影网| 日本久久亚洲电影| 中文字幕精品国产| 国产一区二区丝袜| 91系列在线播放| 亚洲男人的天堂在线| 日本一欧美一欧美一亚洲视频| 日韩精品电影网| 不卡在线观看电视剧完整版| 亚洲九九九在线观看| 海角国产乱辈乱精品视频| 色琪琪综合男人的天堂aⅴ视频| 国内外成人免费激情在线视频| 97精品久久久| 久久久精品免费视频| 亚洲wwwav| 国产一区二区三区丝袜| 久久久久久国产精品三级玉女聊斋| 亚洲男人天堂2023| 日韩在线视频线视频免费网站| 日韩美女福利视频| 91麻豆国产精品| 国产va免费精品高清在线观看| 91精品久久久久久久久青青| 欧美日韩亚洲成人| 亚洲成人激情图| 91亚洲精品一区二区| 26uuu国产精品视频| 欧美激情视频一区| 色老头一区二区三区在线观看| 色婷婷久久av| 欧美最顶级丰满的aⅴ艳星| 国产精品美乳在线观看| 97视频免费在线观看| 亚洲一区二区久久久| 久久视频在线观看免费| 久久视频在线看| 97在线看免费观看视频在线观看| 国产亚洲免费的视频看| 久久99久久99精品中文字幕| 国产日韩换脸av一区在线观看| 国产成人一区二区在线| 欧美另类在线观看| 国产精品久久久久久五月尺| 国产主播喷水一区二区| 久久中国妇女中文字幕| 亚洲人成亚洲人成在线观看| 国产欧美日韩精品在线观看| 中文字幕无线精品亚洲乱码一区| 午夜欧美不卡精品aaaaa| 高跟丝袜欧美一区| 成人做爰www免费看视频网站| 福利视频导航一区| 92版电视剧仙鹤神针在线观看| 欧美性猛交xxxxx水多| 国内外成人免费激情在线视频| 欧美电影免费观看高清完整| 国产精品一区=区| 亚洲人成网7777777国产| 国产精品人成电影在线观看| 精品久久久久久久久久国产| 国产精品电影观看| 伊是香蕉大人久久| 亚洲香蕉成视频在线观看| 国产精品入口免费视| 久久国产精品久久久久| 美女扒开尿口让男人操亚洲视频网站| 色综合导航网站| 精品福利免费观看| 在线播放日韩专区| 亚洲欧美日韩国产中文| 日本道色综合久久影院| 亚洲福利视频专区| 国产一区二区三区视频免费| 精品久久久久久久久中文字幕| 国产精品色午夜在线观看| 久久久之久亚州精品露出| 日韩在线观看免费| 欧美午夜视频一区二区| 成人在线精品视频| 精品久久久久久久久中文字幕| 国产日韩换脸av一区在线观看| 国产美女精彩久久| 中文字幕欧美日韩精品| 亚洲xxxxx| 91国产视频在线播放| 成人免费网视频| 久久久久久久久久久av| 欧美精品video| 国产精品视频播放| 欧美高清自拍一区| 亚洲国产成人久久| 日韩av在线网页| 久久久精品一区| 日韩有码片在线观看| 国产精品av免费在线观看| 日韩av在线影院| 日韩中文字幕在线视频| 亚洲第一网站免费视频| 18性欧美xxxⅹ性满足| www.xxxx欧美| 精品久久久久久中文字幕| 欧美电影在线观看高清| 国产主播精品在线| 亚洲人成在线观看网站高清| 大量国产精品视频| 久久精品国产成人| 91久久久久久久久| 成人久久久久久| 亚洲第一页自拍| 91高清视频在线免费观看| …久久精品99久久香蕉国产| 欧美理论电影在线观看| 国产日韩欧美在线播放| 欧美成人久久久| 亚洲男女自偷自拍图片另类| 欧美大尺度激情区在线播放| 在线午夜精品自拍| 少妇激情综合网| 伦伦影院午夜日韩欧美限制| 亚洲黄在线观看| 成人信息集中地欧美| 日韩综合中文字幕| 国产精品视频在线观看| 国产精品视频在线观看| 日韩美女在线播放| 色偷偷偷亚洲综合网另类| 日韩久久精品成人| 啪一啪鲁一鲁2019在线视频| 国精产品一区一区三区有限在线| 91免费人成网站在线观看18| 91沈先生在线观看| 国产精品日韩一区| 亚洲xxxx妇黄裸体| 欧美中文在线观看国产| 欧美国产日本高清在线| 国产精品成人在线| 国产精品偷伦免费视频观看的| 永久免费精品影视网站| 日本人成精品视频在线|