最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何全局重寫小程序Page函數(shù)wx對(duì)象詳解

 更新時(shí)間:2022年08月23日 10:24:01   作者:HullQin  
這篇文章主要給大家介紹了關(guān)于如何全局重寫小程序Page函數(shù)wx對(duì)象的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

背景

如果能夠全局改寫小程序的Page里的生命周期方法或wx里的函數(shù),那么可以做很多有意思的事情。與其說是改寫,不如說是代理裝飾。屬于是設(shè)計(jì)模式中的代理模式裝飾器模式。

方案

重寫Page函數(shù)

app.js中調(diào)用:

Page = pageProxy(Page);

實(shí)現(xiàn)對(duì)Page里生命周期方法裝飾。文章后面會(huì)繼續(xù)聊怎么實(shí)現(xiàn)pageProxy。

重寫wx對(duì)象

app.js中調(diào)用:

wx = wxProxy(wx);
復(fù)制代碼

實(shí)現(xiàn)對(duì)wx里函數(shù)的裝飾。文章后面會(huì)繼續(xù)聊怎么實(shí)現(xiàn)wxProxy。

注意事項(xiàng)

上面二者都是全局生效的。

  • app.js中調(diào)用Page = pageDecorator(Page);wx = wxDecorator(wx);時(shí),不要帶varconstlet,因?yàn)閹Я撕缶椭辉诒卷撁嫔?。不帶才是全局生效?/li>
  • 必須在app.js中調(diào)用,或在app.js中引用相關(guān)的文件中執(zhí)行上面2個(gè)語句。如果在頁面的js中調(diào)用,會(huì)來不及,那時(shí)候可能存在一些頁面初始化用了舊的Page對(duì)象。
  • 只能執(zhí)行一次,多次執(zhí)行會(huì)導(dǎo)致多次代理/裝飾,不可取。

pageProxy

直接舉個(gè)例子,比如要修改onLoad生命周期函數(shù)的行為。

function onLoadProxy(onLoad?: WechatMiniprogram.Page.ILifetime['onLoad']): WechatMiniprogram.Page.ILifetime['onLoad'] {
  return function newOnLoad(query) {
    doSomethingWith(query); // 可訪問參數(shù)query,做一些事情,比如上報(bào)
    if (onLoad) { // 如果開發(fā)者在Page中定義了onLoad,我們需要調(diào)用一下開發(fā)者定義的onLoad
      return onLoad.call(this, query); // 注意這里必須用call(this)。這里也可以把query換成個(gè)新對(duì)象,達(dá)到修改參數(shù)的目的。(不建議直接修改query,因?yàn)闀?huì)把傳入的數(shù)據(jù)給改掉,而業(yè)務(wù)開發(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)鍵點(diǎn):重寫方法時(shí),務(wù)必使用call(this)保持this引用,否則會(huì)導(dǎo)致業(yè)務(wù)開發(fā)者寫onLoad的函數(shù)體時(shí),無法訪問到符合預(yù)期的this。

wxProxy

舉個(gè)例子,比如要修改wx.navigateTo導(dǎo)航函數(shù)的行為。

function navigateToProxy(navigateTo: WechatMiniprogram.Wx['navigateTo']): WechatMiniprogram.Wx['navigateTo'] {
  return function newNavigateTo(object) {
    doSomethingWith(object); // 可訪問參數(shù)object,做一些事情,比如上報(bào)
    // 這里可以直接把參數(shù)換個(gè)新對(duì)象,達(dá)到修改參數(shù)的目的
    // 注意下面是淺拷貝,不建議直接修改原始o(jì)ptions,因?yàn)闀?huì)把傳入的數(shù)據(jù)給改掉,而業(yè)務(wù)開發(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對(duì)象的文章就介紹到這了,更多相關(guān)重寫小程序wx對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

最新評(píng)論

建水县| 宝坻区| 蓬莱市| 开江县| 固始县| 本溪市| 西和县| 梧州市| 土默特左旗| 建平县| 凤庆县| 调兵山市| 上虞市| 井研县| 乐东| 瑞昌市| 泸定县| 洞口县| 井研县| 谷城县| 林周县| 商洛市| 奉节县| 东莞市| 汝阳县| 隆回县| 盐池县| 石渠县| 和龙市| 黔南| 会宁县| 平武县| 松桃| 洮南市| 合山市| 怀远县| 静宁县| 南宫市| 册亨县| 辉南县| 北安市|