如何全局重寫小程序Page函數(shù)wx對象詳解
背景
如果能夠全局改寫小程序的Page里的生命周期方法或wx里的函數(shù),那么可以做很多有意思的事情。與其說是改寫,不如說是代理或裝飾。屬于是設計模式中的代理模式或裝飾器模式。
方案
重寫Page函數(shù)
在app.js中調(diào)用:
Page = pageProxy(Page);
實現(xiàn)對Page里生命周期方法裝飾。文章后面會繼續(xù)聊怎么實現(xiàn)pageProxy。
重寫wx對象
在app.js中調(diào)用:
wx = wxProxy(wx); 復制代碼
實現(xiàn)對wx里函數(shù)的裝飾。文章后面會繼續(xù)聊怎么實現(xiàn)wxProxy。
注意事項
上面二者都是全局生效的。
- 在
app.js中調(diào)用Page = pageDecorator(Page);和wx = wxDecorator(wx);時,不要帶var或const或let,因為帶了后就只在本頁面生效。不帶才是全局生效。 - 必須在
app.js中調(diào)用,或在app.js中引用相關(guān)的文件中執(zhí)行上面2個語句。如果在頁面的js中調(diào)用,會來不及,那時候可能存在一些頁面初始化用了舊的Page對象。 - 只能執(zhí)行一次,多次執(zhí)行會導致多次代理/裝飾,不可取。
pageProxy
直接舉個例子,比如要修改onLoad生命周期函數(shù)的行為。
function onLoadProxy(onLoad?: WechatMiniprogram.Page.ILifetime['onLoad']): WechatMiniprogram.Page.ILifetime['onLoad'] {
return function newOnLoad(query) {
doSomethingWith(query); // 可訪問參數(shù)query,做一些事情,比如上報
if (onLoad) { // 如果開發(fā)者在Page中定義了onLoad,我們需要調(diào)用一下開發(fā)者定義的onLoad
return onLoad.call(this, query); // 注意這里必須用call(this)。這里也可以把query換成個新對象,達到修改參數(shù)的目的。(不建議直接修改query,因為會把傳入的數(shù)據(jù)給改掉,而業(yè)務開發(fā)者不知情)
}
};
}
function pageProxy(Page: WechatMiniprogram.Page.Constructor): WechatMiniprogram.Page.Constructor {
return function newPage(options) {
const newOptions = { ...options };
newOptions.onLoad = onLoadProxy(options.onLoad);
Page(newOptions);
};
}關(guān)鍵點:重寫方法時,務必使用call(this)保持this引用,否則會導致業(yè)務開發(fā)者寫onLoad的函數(shù)體時,無法訪問到符合預期的this。
wxProxy
舉個例子,比如要修改wx.navigateTo導航函數(shù)的行為。
function navigateToProxy(navigateTo: WechatMiniprogram.Wx['navigateTo']): WechatMiniprogram.Wx['navigateTo'] {
return function newNavigateTo(object) {
doSomethingWith(object); // 可訪問參數(shù)object,做一些事情,比如上報
// 這里可以直接把參數(shù)換個新對象,達到修改參數(shù)的目的
// 注意下面是淺拷貝,不建議直接修改原始options,因為會把傳入的數(shù)據(jù)給改掉,而業(yè)務開發(fā)者不知情
return navigateTo({
...object,
});
};
}
function wxProxy(wx: WechatMiniprogram.Wx): WechatMiniprogram.Wx {
const newWx = { ...wx };
newWx.navigateTo = navigateToProxy(wx.navigateTo);
return newWx;
}總結(jié)
到此這篇關(guān)于如何全局重寫小程序Page函數(shù)wx對象的文章就介紹到這了,更多相關(guān)重寫小程序wx對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
純JavaScript實現(xiàn)實時反饋系統(tǒng)時間
這篇文章主要介紹了純JavaScript實現(xiàn)實時反饋系統(tǒng)時間的相關(guān)資料,需要的朋友可以參考下2017-10-10
JavaScript中數(shù)組sort()方法的基本使用與踩坑記錄
: js中用方法sort()為數(shù)組排序,這篇文章主要給大家介紹了關(guān)于JavaScript中數(shù)組sort()方法的基本使用,sort()方法已經(jīng)可以滿足我們對數(shù)組的很多處理需求,需要的朋友可以參考下2021-06-06
JS實現(xiàn)表格數(shù)據(jù)各種搜索功能的方法
這篇文章主要介紹了JS實現(xiàn)表格數(shù)據(jù)各種搜索功能的方法,可實現(xiàn)忽略大小寫,模糊搜索,多關(guān)鍵搜索等功能,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
javascript類型系統(tǒng) Window對象學習筆記
這篇文章主要介紹了javascript類型系統(tǒng)之Window對象,整理關(guān)于Window對象的學習筆記,感興趣的小伙伴們可以參考一下2016-01-01
淺談webpack 構(gòu)建性能優(yōu)化策略小結(jié)
webpack以其豐富的功能和靈活的配置而深受業(yè)內(nèi)吹捧,逐步取代了grunt和gulp成為大多數(shù)前端工程實踐中的首選,這篇文章主要介紹了淺談webpack 構(gòu)建性能優(yōu)化策略小結(jié),感興趣的小伙伴們可以參考一下2018-06-06
JavaScript實現(xiàn)LRU緩存的三種方式詳解
LRU全稱為Least?Recently?Used,即最近使用的。針對的是在有限的內(nèi)存空間內(nèi),只緩存最近使用的數(shù)據(jù)(即get和set的數(shù)據(jù))。本文介紹了JavaScript實現(xiàn)LRU緩存的三種方式,需要的可以參考一下2022-06-06

