天天看點

微信小程式前端源碼邏輯和工作流

看完微信小程式的前端代碼真的讓我熱血沸騰啊,代碼邏輯和設計一目了然,沒有多餘的東西,真的是大道至簡。

廢話不多說,直接分析前端代碼。個人觀點,難免有疏漏,僅供參考。

檔案基本結構:

微信小程式前端源碼邏輯和工作流

先看入口app.js,app(obj)注冊一個小程式。接受一個 object 參數,其指定小程式的生命周期函數等。其他檔案可以通過全局方法getApp()擷取app執行個體,進而直接調用它的屬性或方法,例如(getApp().globalData)

微信小程式前端源碼邏輯和工作流
微信小程式前端源碼邏輯和工作流

我了解app.js為入口初始化檔案,也是提供全局API拓展的地方。下邊分析下自帶的幾個方法和屬性

onLaunch鈎子函數會在小程式初始化完成後會自動執行一次,然後在小程式生命周期裡如果你不主動調用onLaunch,它就不會在執行。

getUserInfo函數,顧名思義就是擷取登入使用者資訊,相當于此函數提供了擷取使用者資訊的接口,其他頁面不調用自然不會執行。其他頁面通過getApp().getUserInfo(function(userinfo){console.log(userinfo);})這種方式調用該方法,擷取使用者資訊。

微信小程式前端源碼邏輯和工作流
微信小程式前端源碼邏輯和工作流

 globalData對象用來存儲全局資料,在其他地方調用

然後簡要分析下app.json檔案,該檔案作用是對微信小程式進行全局配置,決定頁面檔案的路徑、視窗表現、設定網絡逾時時間、設定多 tab 等、

  最重要的是pages屬性,必填,為數組,數組内的元素為字元串性檔案路徑,指定小程式由哪些頁面組成,第一項必須是小程式初始頁面。

微信小程式前端源碼邏輯和工作流
微信小程式前端源碼邏輯和工作流

然後來看下項目index和logs檔案夾。微信小程式初始項目把每個頁面相關的js、wxss、wxml放在各自的檔案,這樣看起來結構清晰明朗很多。

  先來看index檔案夾,即小程式初始頁面。index檔案夾下為index.js、index.wxml、index.wxss三個小檔案。小程式把js、css、html代碼分離開來,放在獨自的檔案裡,各司其職。js和樣式表檔案名必須與目前檔案夾的wxml檔案名保持一緻,這樣才能保證js和樣式表的效果能夠在頁面中顯現出來。我很欣賞這樣的設計理念,整齊劃一,職責明确,減輕代碼設計複雜度。

  index.wxml,這就是常見的模闆檔案,資料驅動,有過前端mvc、mvvm項目開發的對這個一定不會陌生,畢竟這是基于react開發的。  

微信小程式前端源碼邏輯和工作流
微信小程式前端源碼邏輯和工作流

  index.js,與reaact用法幾無二異,換湯不換藥。page()來注冊一個頁面。接受一個 OBJECT

參數,其指定頁面的初始資料、生命周期函數、事件處理函數等。

微信小程式前端源碼邏輯和工作流
微信小程式前端源碼邏輯和工作流

  index.wxss檔案隻渲染目前所屬頁面,會覆寫全局app.wxss同一樣式。

     再分析下logs日志檔案夾,logs檔案夾下為logs.wxml、logs.js、logs.wxss、logs.json,同理保證同名,才能完成效果渲染。

     logs.wxml檔案

1

2

3

4

5

6

<code>&lt;!--logs.wxml--&gt;</code>

<code>&lt;view </code><code>class</code><code>=</code><code>"container log-list"</code><code>&gt;</code>

<code>  </code><code>&lt;block wx:</code><code>for</code><code>=</code><code>"{{logs}}"</code> <code>wx:</code><code>for</code><code>-item=</code><code>"log"</code><code>&gt;</code><code>//block容器作用,無其他實際含義。wx:for作用:周遊logs數組,周遊多少次,block塊就會複制多少次,for-item等同于為&lt;br&gt;周遊元素起一個變量名,友善引用。&lt;br&gt;</code>

<code>    </code><code>&lt;text </code><code>class</code><code>=</code><code>"log-item"</code><code>&gt;{{index + 1}}. {{log}}&lt;/text&gt;</code>

<code>  </code><code>&lt;/block&gt;</code>

<code>&lt;/view&gt;</code>

  logs.js 檔案

7

8

9

10

11

12

13

14

<code>//logs.js</code>

<code>var</code> <code>util = require(</code><code>'../../utils/util.js'</code><code>) </code><code>//util.js相當于一個函數庫,我們可以在這個檔案内自定義擴充和封裝一些常用的函數和方法</code>

<code>Page({</code>

<code>  </code><code>data: {</code>

<code>    </code><code>logs: []</code>

<code>  </code><code>},</code>

<code>  </code><code>onLoad: </code><code>function</code> <code>() {</code>

<code>    </code><code>this</code><code>.setData({</code>

<code>      </code><code>logs: (wx.getStorageSync(</code><code>'logs'</code><code>) || []).map(</code><code>function</code> <code>(log) {</code><code>//通過wx.getStorageSync擷取本地緩存的logs日志資料</code>

<code>        </code><code>return</code> <code>util.formatTime(</code><code>new</code> <code>Date(log))</code><code>//日期格式化</code>

<code>      </code><code>})</code>

<code>    </code><code>})</code>

<code>  </code><code>}</code>

<code>})</code>

  logs.json檔案

<code>{</code>

<code>    </code><code>"navigationBarTitleText"</code><code>: </code><code>"檢視啟動日志"</code>   <code>//目前頁面配置檔案,設定window目前頁面頂部導航欄标題等相關内容</code>

<code>}</code>

  

小程式還提供了很多官方元件和API等待我們深挖,加油吧,少年!

上一篇: 網站分享

繼續閱讀