中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用watch在微信小程序中實現全局狀態共享

發布時間:2020-10-21 09:35:48 來源:腳本之家 閱讀:194 作者:ma125120 欄目:web開發

問題

在之前開發微信小程序的時候,獲取用戶信息、openid還有地理位置這些信息的時候,都是采用Promise的方式異步獲取,但是這樣的話在頁面和App.js中都獲取就可能造成請求重復的問題。

比如為了在每個頁面都能獲取到這些共享信息,都會選擇在App.js中進行獲取,然后在頁面級進行獲取,這兩次獲取的時間間隔較小時就可能導致前一個請求還未獲取到數據,后一個請求就會再次進行獲取,這樣就產生了兩次請求。

還有一個問題就是書寫麻煩(雖然也能通過async await簡化),比如

onLoad() {
 app.getUserInfo()
 .then(userInfo => {
 
 }).catch(err => { /* 錯誤處理 */ });
 
 // 如果同時需要userInfo和openid,可能就是如下形式:
 Promise.all([app.getUserInfo(), app.getOpenid()])
 .then(res => {
 
 }).catch(err => { /* 錯誤處理 */ });
}

正好周末的時候突然想到了vue的watch語法,利用一些相關的知識,就可以解決這個麻煩的問題了。

解決思路

雙向綁定

vue的雙向綁定原理,3.0將會采用Proxy監聽數據變化,不過考慮到小程序這邊的Proxy兼容性我不知道,所以采用了2.0的Object.defineProperty來監聽數據的變化。

主要還是攔截設置的操作,在進行賦值時,將新舊值通知至監聽者。

觀察者模式

在頁面級的onLoad監聽app.globalData各個鍵名的事件,而在app.js的onLoad中則使用Object.defineProperty重新定義app.globalData,這樣一旦app.globalData相應的鍵值發生了變化,就會通知監聽的頁面該值發生了變化。

模塊化的引用

觀察者模式導出的是一個對象(類實例),而不是一個類,所以在導入的時候這個對象是共享的,就可以通過這個對象將app.js和其他頁面聯系起來。

至于模塊加載的實質,ES6模塊加載的機制,與CommonJS模塊完全不同。感興趣的可以去看看這個。

封裝Page

小程序的Page函數本身是不支持watch,但是我們可以自定義一個函數,進行參數合并就可以了。

在頁面onLoad時先遍歷watch屬性,對app.globalData進行監聽,可以參考vue的watch用法。

頁面onUnload時就會進行銷毀,此時也應該取消監聽,這些我都封裝過了,不用手動處理了。

有了這些思路,用不了多久,一個雛形就出來了,經過手動測試,感覺沒什么問題,我就發布到npm了,大家感興趣的可以安裝體驗一下。

安裝

npm i wx-watch -S --production

使用

// app.js
var { watchData, } = require('/miniprogram_npm/wx-watch/index.js');

App({
 onLaunch() {
 this.watchData(); /* 監聽this.globalData的變化,并觸發事件,其他頁面監聽的值必須在globalData中預先定義,否則無法監聽 */
 },
 watchData,
 globalData: {
 userInfo: null,
 }
});

// 其他需要監聽globalData的頁面.js
var { getPage } = require('../../miniprogram_npm/wx-watch/index.js');
const app = getApp();

/**
 * getPage(頁面參數,app) app必傳,因為封裝的時候訪問不到,就只能傳參了
*/
getPage({
 watch: {
 userInfo(userInfo, oldUserInfo) {
 console.log(`來自app.glodalData的userInfo`);
 }
 },
 // 其他參數
}, app)

github:  github.com/ma125120/wx…

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿合奇县| 临漳县| 浑源县| 阜新市| 文山县| 许昌市| 衢州市| 灵石县| 合江县| 彰武县| 沈丘县| 抚宁县| 潜江市| 台湾省| 辉南县| 临桂县| 左云县| 四平市| 招远市| 西林县| 当雄县| 赤城县| 大名县| 正定县| 崇文区| 乌苏市| 仁布县| 宜宾县| 和平县| 大姚县| 湘阴县| 马山县| 嘉祥县| 上杭县| 子长县| 集安市| 柯坪县| 平度市| 东乌珠穆沁旗| 灌南县| 修文县|