小程式解決方案 Westore - 組件、純組件、插件開發

来源:https://www.cnblogs.com/iamzhanglei/archive/2018/10/08/9752896.html
-Advertisement-
Play Games

數據流轉 先上一張圖看清 Westore 怎麼解決小程式數據難以管理和維護的問題: 非純組件的話,可以直接省去 triggerEvent 的過程,直接修改 store.data 並且 update,形成縮減版單向數據流。 "Github: https://github.com/dntzhang/we ...


數據流轉

先上一張圖看清 Westore 怎麼解決小程式數據難以管理和維護的問題:

非純組件的話,可以直接省去 triggerEvent 的過程,直接修改 store.data 並且 update,形成縮減版單向數據流。

Github: https://github.com/dntzhang/westore

組件

這裡說的組件便是自定義組件,使用原生小程式的開發格式如下:


Component({
  properties: { },

  data: { },

  methods: { }
})

使用 Westore 之後:

import create from '../../utils/create'

create({
  properties: { },

  data: { },

  methods: { }
})

看著差別不大,但是區別:

  • Component 的方式使用 setData 更新視圖
  • create 的方式直接更改 store.data 然後調用 update
  • create 的方式可以使用函數屬性,Component 不可以,如:
export default {
  data: {
    firstName: 'dnt',
    lastName: 'zhang',
    fullName:function(){
      return this.firstName + this.lastName
    }
  }
}

綁定到視圖:

<view>{{fullName}}</view>

小程式 setData 的痛點:

  • 使用 this.data 可以獲取內部數據和屬性值,但不要直接修改它們,應使用 setData 修改
  • setData 編程體驗不好,很多場景直接賦值更加直觀方便
  • setData 卡卡卡慢慢慢,JsCore 和 Webview 數據對象來回傳浪費計算資源和記憶體資源
  • 組件間通訊或跨頁通訊會把程式搞得亂七八糟,變得極難維護和擴展

沒使用 westore 的時候經常可以看到這樣的代碼:

使用完 westore 之後:

上面兩種方式也可以混合使用。

可以看到,westore 不僅支持直接賦值,而且 this.update 相容了 this.setData 的語法,但性能大大優於 this.setData,再舉個例子:

this.store.data.motto = 'Hello Westore'
this.store.data.b.arr.push({ name: 'ccc' })
this.update()

等同於

this.update({
  motto:'Hello Westore',
  [`b.arr[${this.store.data.b.arr.length}]`]:{name:'ccc'}
})

這裡需要特別強調,雖然 this.update 可以相容小程式的 this.setData 的方式傳參,但是更加智能,this.update 會先 Diff 然後 setData。原理:

純組件

常見純組件由很多,如 tip、alert、dialog、pager、日曆等,與業務數據無直接耦合關係。
組件的顯示狀態由傳入的 props 決定,與外界的通訊通過內部 triggerEvent 暴露的回調。
triggerEvent 的回調函數可以改變全局狀態,實現單向數據流同步所有狀態給其他兄弟、堂兄、姑姑等組件或者其他頁面。

Westore里可以使用 create({ pure: true }) 創建純組件(當然也可以直接使用 Component),比如 :


import create from '../../utils/create'

create({
  pure : true,
  
  properties: {
    text: {
      type: String,
      value: '',
      observer(newValue, oldValue) { }
    }
  },

  data: {
    privateData: 'privateData'
  },

  ready: function () {
    console.log(this.properties.text)
  },

  methods: {
    onTap: function(){
      this.store.data.privateData = '成功修改 privateData'
      this.update()
      this.triggerEvent('random', {rd:'成功發起單向數據流' + Math.floor( Math.random()*1000)})
    }
  }
})

需要註意的是,加上 pure : true 之後就是純組件,組件的 data 不會被合併到全局的 store.data 上。

組件區分業務組件和純組件,他們的區別如下:

  • 業務組件與業務數據緊耦合,換一個項目可能該組件就用不上,除非非常類似的項目
  • 業務組件通過 store 獲得所需參數,通過更改 store 與外界通訊
  • 業務組件也可以通過 props 獲得所需參數,通過 triggerEvent 與外界通訊
  • 純組件與業務數據無關,可移植和復用
  • 純組件只能通過 props 獲得所需參數,通過 triggerEvent 與外界通訊

大型項目一定會包含純組件、業務組件。通過純組件,可以很好理解單向數據流。

小程式插件

小程式插件是對一組 JS 介面、自定義組件或頁面的封裝,用於嵌入到小程式中使用。插件不能獨立運行,必須嵌入在其他小程式中才能被用戶使用;而第三方小程式在使用插件時,也無法看到插件的代碼。因此,插件適合用來封裝自己的功能或服務,提供給第三方小程式進行展示和使用。

插件開發者可以像開發小程式一樣編寫一個插件並上傳代碼,在插件發佈之後,其他小程式方可調用。小程式平臺會托管插件代碼,其他小程式調用時,上傳的插件代碼會隨小程式一起下載運行。

插件開發

Westore 提供的目錄如下:

|--components
|--westore  
|--plugin.json  
|--store.js

創建插件:

import create from '../../westore/create-plugin'
import store from '../../store'

//最外層容器節點需要傳入 store,其他組件不傳 store
create(store, {
  properties:{
    authKey:{
      type: String,
      value: ''
    }
  },
  data: { list: [] },
  attached: function () {
    // 可以得到插件上聲明傳遞過來的屬性值
    console.log(this.properties.authKey)
    // 監聽所有變化
    this.store.onChange = (detail) => {
      this.triggerEvent('listChange', detail)
    }
    // 可以在這裡發起網路請求獲取插件的數據
    this.store.data.list = [{
      name: '電視',
      price: 1000
    }, {
      name: '電腦',
      price: 4000
    }, {
      name: '手機',
      price: 3000
    }]

    this.update()

    //同樣也直接和相容 setData 語法
    this.update(
        { 'list[2].price': 100000 }
    )
  }
})

在你的小程式中使用組件:

<list auth-key="{{authKey}}" bind:listChange="onListChange" />

這裡來梳理下小程式自定義組件插件怎麼和使用它的小程式通訊:

  • 通過 properties 傳入更新插件,通過 properties 的 observer 來更新插件
  • 通過 store.onChange 收集 data 的所有變更
  • 通過 triggerEvent 來拋事件給使用插件外部的小程式

這麼方便簡潔還不趕緊試試 Westore插件開發模板

特別強調

插件內所有組件公用的 store 和插件外小程式的 store 是相互隔離的。

原理

頁面生命周期函數

名稱 描述
onLoad 監聽頁面載入
onShow 監聽頁面顯示
onReady 監聽頁面初次渲染完成
onHide 監聽頁面隱藏
onUnload 監聽頁面卸載

組件生命周期函數

名稱 描述
created 在組件實例進入頁面節點樹時執行,註意此時不能調用 setData
attached 在組件實例進入頁面節點樹時執行
ready 在組件佈局完成後執行,此時可以獲取節點信息(使用 SelectorQuery )
moved 在組件實例被移動到節點樹另一個位置時執行
detached 在組件實例被從頁面節點樹移除時執行

由於開發插件時候的組件沒有 this.page,所以 store 是從根組件註入,而且可以在 attached 提前註入:

export default function create(store, option) {
    let opt = store
    if (option) {
        opt = option
        originData = JSON.parse(JSON.stringify(store.data))
        globalStore = store
        globalStore.instances = []
        create.store = globalStore
    }

    const attached = opt.attached
    opt.attached = function () {
        this.store = globalStore
        this.store.data = Object.assign(globalStore.data, opt.data)
        this.setData.call(this, this.store.data)
        globalStore.instances.push(this)
        rewriteUpdate(this)
        attached && attached.call(this)
    }
    Component(opt)
}

總結

  • 組件 - 對 WXML、WXSS 和 JS 的封裝,與業務耦合,可復用,難移植
  • 純組件 - 對 WXML、WXSS 和 JS 的封裝,與業務解耦,可復用,易移植
  • 插件 - 小程式插件是對一組 JS 介面、自定義組件或頁面的封裝,與業務耦合,可復用

Star & Fork 小程式解決方案

https://github.com/dntzhang/westore

License

MIT @dntzhang


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

-Advertisement-
Play Games
更多相關文章
  • 熟悉 Angular 的同學對指令肯定不會陌生,Vue中也借鑒了指令這一特性,在 Vue 中指令都是帶有 v- 的特殊屬性,那麼指令有什麼作用呢? 我的理解就是:指令是用來控制 DOM 元素的行為,例如最簡單的顯示,隱藏。 Vue 中有很多指令,在今後的學習過程總我們會逐步的學習,今天我們就來說說我 ...
  • 用JS生成動態生成表格,行、列由用戶輸入,並使表格隔行換色 方法一. 代碼: 運行結果: 輸入行數、列數,create Table: 方法二. 代碼: 運行結果: 輸入行數、列數: *僅供參考,轉載請註明 *代碼①參考:https://www.cnblogs.com/hwgok/p/5739822. ...
  • [科學上網]Node.js 種子下載器 慶祝 2018 國慶,製作了一個 的種子下載器。爬取頁面,根據頁面的鏈接,破解另外一個網站,下載種子文件,同時使用 模塊提高爬蟲的併發量。項目比較簡單,爬取頁面沒有使用任何爬蟲框架。 "源碼傳送門" 。 的安裝請看我的另外一篇文章, "Node.js 的多版本 ...
  • 1》OL標簽的改良 start type reversed:翻轉排序 2》datalist標簽自動補全的使用 3》progress標簽的使用:進度條 4》meter標簽的應用 5》details展開收縮標簽的使用-子標簽summary(自動帶有展開收縮的效果) 6》mark標簽的應用:高亮顯示文本 ...
  • 隨著flash的沒落,瀏覽器的原生能力的興起。在3D方面WebGL不管從功能還是性能方面都在逐漸加強。2D應用變為3D應用的需求也越來越強烈。 win10的畫圖板支持3D圖片,2d工具photoshop也開始逐步集成了3D工具。 下麵就基於WebGL技術探討一下現在的兩款3D框架。Threejs(h ...
  • 網上很多關於驗證小數的正則表達式,但是很多都不是百分百正確,所以我結合一些前輩的經驗,自己寫了一個。 驗證非0開頭的無限位整數和小數。整數支持無限位,小數點前支持無限位,小數點後最多保留兩位。 js代碼如下: var reg = /^(([^0][0-9]+|0)\.([0-9]{1,2})$)|^ ...
  • 近幾年,微服務架構在後端技術社區大紅大紫,它被認為是IT軟體架構的未來技術方向.我們如何借鑒後端微服務的思想來構建一個現代化前端應用? 在這裡我提供一個可以在產品中真正可以落地的前端微服務解決方案. 微服務化後端前後端對比 後端微服務化的優勢: 1. 複雜度可控: 體積小、複雜度低,每個微服務可由一 ...
  • 在Bootstrap fileinput中移除預覽文件時可以通過配置initialPreviewConfig: [ { url:'deletefile',key:fileid } ] 來同步刪除伺服器上的文件和記錄。但新上傳的文件則需要其他方式來同步刪除伺服器記錄。 在配置中遇到的一些問題,記錄一下 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...