在小程式中實現全局混入,以混入的形式擴展小程式的api

来源:https://www.cnblogs.com/wozho/archive/2019/02/27/10442703.html
-Advertisement-
Play Games

GitHub : "https://github.com/WozHuang/mp extend" 相關文章 : "小程式全局狀態管理,在頁面中獲取globalData和使用globalSetData" "通過頁面預載入(preload)提升小程式的響應速度" 主要目標 小程式本身的坑不少,開發時免不 ...


GitHub:
https://github.com/WozHuang/mp-extend
相關文章:
小程式全局狀態管理,在頁面中獲取globalData和使用globalSetData
通過頁面預載入(preload)提升小程式的響應速度

主要目標

小程式本身的坑不少,開發時免不了需要引入或大或小的框架。而目前的小程式開發框架基本分為兩種,一種是以Taro、wePY這種以其他技術棧開發小程式,一種是在原有的小程式開發模式上進行擴展。

對於新建立的項目,選擇何種框架全憑喜好,可以優先考慮與團隊技術棧相關的開發框架。但是多數時候開發者還是使用小程式官方的開發方式,並且已經開發了一段時間並投入使用了,這時再考慮引入框架代價就有點大了,於是我就在尋找一個能夠在不改動現有代碼前提下擴展小程式api的框架。

尋找資料

參考了westore,omix,wxpage等基於小程式自身擴展的框架後,發現他們統一都是在APP、Page、Component構造函數上做文章,對頁面本身的PageOption進行操作,實現擴展api的功能。

小程式中有部分Vue和React的影子(data屬性,setData方法),而Vue和React都有mixin這種擴展組件的方式,於是便考慮在Page構造函數上做文章,提供全局混入的能力來擴展api。

代碼實現

我實現混入中的兩個主要函數:

1. 裝飾函數

使用裝飾方法對PageOption(Page函數調用時傳入的參數)中的生命周期函數(onLoad等)進行修改,調用混入的生命周期方法。

// 對原有函數進行修改,返回結果是原函數的返回結果
// 在調用原函數之前調用所有裝飾器
function decorate(f, ...decorators) {
  return function () {
    for (const decorator of decorators) {
      decorator && decorator.apply(this, arguments);
    }
    return f && f.apply(this, arguments);
  };
}

2. 合併混入對象

使用mixin函數將混入中的對象與PageOption原有的對象進行合併

/**
 * 實現混入的效果
 * 類似 Object.assign, 但在遇見相同屬性名均是對象時會遞歸進行合併而非直接覆蓋
 * 註:如果存在引用迴圈遞歸會棧溢出
 */
function mixin(o, ...mixs) {
  mixs.forEach(mix => {
    for (const key in mix) {
      // 兩個屬性都是對象則遞歸合併
      if (isObject(o[key]) && isObject(mix[key])) {
        mixin(o[key], mix[key]);
      } else {
        o[key] = o[key] || mix[key];
      }
    }
    // 拷貝symbol類型,(可惜小程式不支持)
    for (const sym of Object.getOwnPropertySymbols(mix)) {
      o[sym] = o[sym] || mix[sym];
    }
  });
  return o;
}

3. 重寫Page函數(App,Component同理)

在調用Page函數前將所有混入對象合併到PageOption中

// base.Page 頁面的基類,包含所有混入對象的非生命周期屬性
// lifeMixin.Page 包含所有混入對象的生命周期函數
// life.Page 一個數組包含Page所有的生命周期 ['onLoad', 'onShow', ...]

const _Page = decorate(Page, function (option) {
  // 合併非生命周期屬性
  mixin(option, base.Page);
  // 合併生命周期屬性
  for (const lifeTime of life.Page) {
    option[lifeTime] = decorate(option[lifeTime], ...lifeMixin.Page[lifeTime]);
  }
  // preprecess是擴展的生命周期,在Page函數調用前被調用,可以用於修改PageOption
  option['preproccess'] && option['preproccess'].call(option, option);
});

通過重寫Page函數在將混入對象合併到PageOption中實現全局混入的功能,最後只需要在現有代碼前加入一行 Page = _Page;,即可實現全局混入的能力而無需修改其他代碼。

使用示例

能夠方便地以全局混入的方式擴展api,以下是一個簡單示例:混入data屬性 和 添加PV統計功能

Page: {
  data: {
    exData: '所有頁面的data都會獲得exData屬性'
  },
  
  onLoad(){
    console.log(`PV統計: 在${formatTime(new Date())} 打開了頁面 ${this.__route__}`)
  }
}

如果覺得有用可以去GitHub給我一個小星星(滿臉期待.jpg)

參考資料
wxpage
omi
Vue mixins
微信小程式之提高應用速度小技巧


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於最近工作中遇到需要在電腦上調試手機端的功能和樣式,之前也沒有遇到過,所以就各種百度和試驗。最後終於功夫不負有心人,成功了。(那一刻心情真滴很雞凍啊~~~~~~~~~)。所以暫時記錄下來。以免雞凍過度再給忘記了。 好,接下來就是具體的步驟啦。由於沒有什麼筆墨經驗,所以都是大白話啦。
  • 使用CSS3實現三角形: 在前端頁面中有很多時候會遇到需要三角形圖案的時候,以前不知道可以用CSS3實現三角形的時候,一般都是叫UI把三角形圖案切出來。 後來知道原來可以用CSS3實現三角形,可是用過一次後很容易忘記,所以想把這個小技巧記錄起來~ CSS3是如何實現三角形的呢?——答案是通過邊框,也 ...
  • 傳統的非同步解決方案採用回調函數和事件監聽的方式,而這裡主要記錄兩種非同步編程的新方案: ES6的新語法Promise ES2017引入的async函數 Generator函數(略) Promise的含義 是非同步變成的一種解決方案,屬於ES6的語法。 簡單的說,promise就是一個容器,裡面包含著一個 ...
  • 1、word書寫blog 使用word的blog模板,可以上傳到博客園的隨筆上去。上傳後,在word繼續編輯,再上傳的話,就會覆蓋掉同一篇隨筆。 上傳配置 如果找不到模板的話,可以在上圖中的搜索框內,搜索‘博客文章’,聯網的話,一定能搜到。 如果從未添加過賬戶的話,點擊下圖中的‘新建’按鈕。 賬戶信 ...
  • var common = {}; /** * [pageMask ajax統一請求] * @return {[type]} [description] */ common.pageMask = function() { $.ajaxSetup({ beforeSend: function(xhr) ... ...
  • 微信分享需要手機掃描二維碼,需要對url進行編碼。在https協議下,掃描二維碼時,瀏覽器打不開可能時安全證書導致的。 ...
  • 此處有兩大坑: 1、下載easemob-websdk此npm包時,並沒有下載strophe.js、crypto-js、underscore這三個包,需要自己手動下載。 2、如下方標紅位置所示,需要自己手動改動npm包內代碼才可使用。 一、安裝npm包 1、npm install easemob-we ...
  • 恢復內容開始 恢復內容結束 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...