亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

大眾點評點餐小程序開發實踐之邏輯層

2020-03-21 16:19:08
字體:
來源:轉載
供稿:網友

本期想要和大家分享一下大眾點評點餐小程序開發中的邏輯層的經驗。

與視圖層微信自己定義了一套與HTML對應的WXML和WXSS不同,小程序的邏輯層還是使用javascript編寫的。不過與我們普通的編寫js還是有一些區別的。接下來我會根據實踐進行說明。邏輯層代碼結構為

menu
├── menu.html
├── menu.js
├── menu.json
└── menu.less
app.js

作為邏輯層我們只需要關注app.js和menu.js。

App和Page

App

小程序提供了App方法來注冊整個小程序,在App方法里我們可以傳入一個對象,指定小程序的生命周期函數以及自定義的函數或者數據。注意這個函數只能被調用一次。

App
globalData
onLaunch
onShow
onHide
onError
其他自定義

如上所示,App擁有著4個生命周期函數,我們可以在launch的時候進行一些全局信息的獲取,比如用戶信息,門店信息等等,然后存入到全局數據中。這里的數據可以被每個頁面訪問到。

Page

小程序針對每個頁面提供了Page的函數。整個邏輯層大部分的代碼都會寫在Page函數中,Page中承接著整個頁面的數據,生命周期函數,以及在視圖中綁定的事件的觸發函數,例如各點擊事件。整個Page函數允許的參數如下所示:

Page
data
onload
onReady
onShow
onHide
onUnload
onPullDownRefresh
onReachBottom
onShareAppMessage
其他自定義函數

如上,Page函數因為是頁面級別的,所以擁有著更多的生命函數,會有下拉刷新事件,會有頁面到達底部的事件。這里我們需要區別好各個生命周期函數。onLoad只會在初始化的時候調用一次,onShow是每次打開頁面都會調用,onReady只有頁面初次渲染完成才會被調用。onHide會在navigateTo(微信提供的跳轉API)或者底部tab切換時調用,onUnload會在redirectTo(微信提供的redirect的API)或者navigateBack(微信提供的回退的API)的時候調用。Page更具體的渲染過程可以參考下面這張圖:

 

大眾點評,小程序開發,邏輯層

 

簡單描述下就是:視圖層和邏輯層同時進行初始化的操作:視圖層ready之后通知邏輯層發送數據;邏輯層執行onload和onShow方法,然后等待視圖層的通知,在接收到視圖層的通知之后發送數據給視圖層,然后繼續等待視圖層的通知。視圖層根據數據進行初次渲染后通知邏輯層渲染完畢,邏輯層調用onReady方法。然后后續的行為邏輯層可以通過再次發送數據重新渲染視圖層。

Page的整個工作流程可以參照下面的圖:

大眾點評,小程序開發,邏輯層


首先Page的data會被用于頁面的初始化渲染。然后用戶會在頁面上,也就是展示層觸發事件,比如我們點餐的話,點擊了加菜按鈕。頁面監聽到這個事件之后,會觸發在Page函數中申明的自定義事件。然后根據具體情況可能會調用微信的Api發起請求,根據請求的結果,我們調用setData方法,來改變頁面的數據,小程序就會監聽到數據的改變而重新執行渲染的過程。這個寫過React的朋友,應該會很熟悉,React也是在Component里面申明自定義方法,觸發后通過setState來重新渲染頁面。我們之前的H5就是使用React寫的,所以邏輯層遷移到小程序的代價并不是很大~

 

getApp和getCurrentPages

小程序內申明的變量和函數只在該文件內有效,不同的文件可以申明相同名字的變量和函數,并不會相互影響。上面提到App內可以設置全局數據。我們在每個Page里面都可以通過全局函數getApp()來拿到全局的引用實例。然后就可以訪問頁面的數據。比如我們在購物車下完單之后回到菜單頁可能會需要進行菜單的刷新,我們在購物車頁面就會調用getApp().data.menuRefresh = true,然后在菜單頁的onShow方法進行判斷,例如:

  1. let app = getApp(); 
  2. Page( 
  3.     requestMenu () {    
  4.         //刷新菜單 
  5.     }; 
  6.     onShow () { 
  7.         if (app.data.menuRefresh === true) { 
  8.             app.data.menuRefresh === false
  9.             this.requestMenu(); 
  10.         } 
  11.     } 
  12. ); 

在每個Page內,我們還可以用getCurrentPages來獲取當前頁面棧的實例,數組形式,第一個元素為首頁,最后一個元素為當前頁面。頁面棧的表現情況如下表所示:

路由方式 頁面棧表現
初始化 新頁面入棧
打開新頁面 新頁面入棧
頁面重定向 當前頁面出棧,新頁面入棧
頁面返回 頁面不斷出棧,直到目標返回頁,新頁面入棧
Tab切換 頁面全部出棧,只留下新的Tab頁面

注意我們不能手動去嘗試修改頁面棧,我們只能根據頁面棧,來分析是使用哪種微信的API來跳頁面。這里的跳轉API還會在下面進行講解。

模塊化

小程序是支持模塊化的,支持commonjs的模塊化寫法,也就是module.exports或者exports,這兩個的區別這里就不細講了,不了解的可以去看下nodejs的module那塊的文檔。小程序目前并不支持引入node_modules,也就是并不支持第三方的模塊,當我們需要使用到外部的依賴的時候,建議直接將代碼拷貝到小程序的目錄中,然后通過相對路徑的require函數進行引入。

微信API

小程序作為微信的一個重要功能,微信的框架提供了非常豐富的微信原生API,可以方便的調起微信提供的能力,除了視圖層的一些原生組件外,還有一些功能性的API,如掃碼,定位,媒體播放,本地存儲以及支付功能等等。

我們這次使用的較多的是通過微信發起網絡請求以及微信的數據存儲。

發請求

微信提供了wx.request來發起請求,注意這個方法發起的是HTTPS請求。所以在開發微信小程序之前,大家得先遷一下HTTPS~我們自己在使用API的時候,還用了pinkie這個包將request包裝成了Promise的形式方便我們使用。
比較重要的一點是微信的運行環境并不是瀏覽器,并不提供cookie的功能。但是用戶我們解決用戶鑒別的問題是帶上用戶的token,用戶的token是在用戶登錄的時候后端生成好了放置到App的全局數據中。

數據存儲

我們大眾點評點餐頁面上有大量的菜單數據,這部分數據之前在H5上實現的時候用的是瀏覽器的localstorage。這次切換到微信的storage,代價很小,用了一下適配器模式,將微信的數據接口適配成我們需要的接口就好了。這樣也是為了以后的迭代慢慢讓H5與小程序使用同一套代碼。

大眾點評,小程序開發,邏輯層

 

導航

小程序為了減少用戶使用的時候的困擾,規定了頁面路徑最多只能有5層,所以我們使用的時候得盡量避免多層級的交互方式。

大眾點評,小程序開發,邏輯層


為了方便調用,我們這次管理頁面跳轉的時候自己封裝了一下函數,就是通過getCurrentPages來對頁面棧進行分析,然后選擇跳轉頁面的方式:
  1. const app = getApp(); 
  2. module.exports = function go2Page(opts) { 
  3.     if (!opts) return
  4.     if (!opts.url) return
  5.     let url = opts.url; 
  6.     //拿到當前的頁面棧 
  7.     const history = getCurrentPages(); 
  8.     let path = url.split('?'
  9.     let params; 
  10.     if (path.length === 2) { 
  11.         params = path[1]; 
  12.     } 
  13.     let page = path[0].split('/').pop(); 
  14.     let index = -1; 
  15.     for (var i = 0; i < history.length; i++) { 
  16.         let hPath = history[i].__route__; 
  17.         let hPage = hPath.split('/').pop(); 
  18.         if (page == hPage) { 
  19.             index = i; 
  20.             break
  21.         } 
  22.     } 
  23.     if (index === -1) { 
  24.         //如果不存在這個頁面,直接跳轉 
  25.         wx.navigateTo({ 
  26.             url: url 
  27.         }); 
  28.     } else { 
  29.         //如果存在這個頁面,就回退回去 
  30.         if (params) { 
  31.             //query是處理下url參數的自己定義的函數 
  32.             params = query(params); 
  33.         } 
  34.         //將跳轉的頁面的參數保存到全局數據中,然后在頁面中可以去拿取,store是自己申明的 
  35.         app.store(page, params); 
  36.         wx.navigateBack({ 
  37.             delta: history.length - (index + 1) 
  38.         }); 
  39.     } 

Tip

由于小程序的框架并非運行在瀏覽器中,所以javascript在web端的一些能力都無法使用,除了上面提到的cookie,還有document,window等等。開發者所有代碼最終會被打包成一份javascript,在小程序啟動的時候運行,直到小程序銷毀。這一點類似于瀏覽器的ServiceWorker,所以邏輯層也稱之為App Service。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一级揄自揄精品视频| 在线日韩av观看| 一区二区欧美在线| 日韩在线视频免费观看高清中文| 久久视频在线视频| 久久亚洲精品小早川怜子66| 色老头一区二区三区| 亚洲国产精彩中文乱码av| 国产亚洲欧美日韩精品| 欧美精品videofree1080p| 日韩av免费看网站| 98精品国产高清在线xxxx天堂| 疯狂欧美牲乱大交777| 91视频88av| 欧美日韩国产精品一区二区三区四区| 中文字幕日韩欧美精品在线观看| 国产精品普通话| 国产精品久久久久7777婷婷| 久久夜色精品国产亚洲aⅴ| 美女久久久久久久久久久| 欧美视频免费在线观看| 亚洲激情在线视频| 高清在线视频日韩欧美| 国语自产偷拍精品视频偷| 国产精品久久久久久久久久久新郎| 在线观看日韩av| 精品成人69xx.xyz| 国产精品99久久久久久久久| 日韩av电影手机在线| 一本久久综合亚洲鲁鲁| 日本久久亚洲电影| 欧美久久精品午夜青青大伊人| 欧美孕妇毛茸茸xxxx| 久久国产精品久久国产精品| 亚洲午夜精品久久久久久性色| 国产91精品黑色丝袜高跟鞋| 亚洲一区制服诱惑| 久久久爽爽爽美女图片| 欧美性极品少妇精品网站| 国产91精品久久久久久久| 亚洲第一精品夜夜躁人人躁| 综合激情国产一区| 黑人精品xxx一区一二区| 精品亚洲一区二区三区四区五区| 精品一区二区三区三区| 亚洲永久在线观看| 亚洲午夜未满十八勿入免费观看全集| 国产精品九九九| 日韩精品中文字幕有码专区| 亚洲小视频在线| 欧美一区第一页| 日韩av黄色在线观看| 国产精品免费电影| 日韩国产欧美区| 欧美精品久久久久久久久| 亚洲深夜福利在线| 久久网福利资源网站| 91精品视频免费看| 尤物yw午夜国产精品视频明星| 亚洲成人激情小说| 久久精品国产亚洲7777| 亚洲天堂网站在线观看视频| 日韩精品免费看| 国产精品精品视频一区二区三区| 欧美中文字幕在线| 成人精品视频99在线观看免费| 2019最新中文字幕| 欧美性猛交xxx| 久久精品国产一区| 精品中文字幕在线2019| 久久久91精品国产| 久久久久久久电影一区| 亚洲天堂精品在线| 精品福利视频导航| 欧美一级淫片aaaaaaa视频| 久久亚洲精品一区| 九九热精品视频在线播放| 在线a欧美视频| 精品视频在线播放色网色视频| 亚洲第一偷拍网| 在线视频日韩精品| 国产精品久久久久久久久久东京| 国产一区二区三区中文| 久久视频在线直播| 国产精品6699| 国产一区二中文字幕在线看| 国产精品免费一区二区三区都可以| 欧美国产日韩一区二区在线观看| 久久精品国产成人精品| 国产精品久久久久免费a∨| 欧美俄罗斯性视频| 国产亚洲精品美女久久久久| 亚洲乱码一区二区| 日韩精品中文字幕在线观看| 日韩av不卡电影| 亚洲国产美女精品久久久久∴| 亚洲一区二区日本| 日本精品久久中文字幕佐佐木| 国产成人精品a视频一区www| 国内揄拍国内精品少妇国语| 亚洲欧美自拍一区| 久久精品国产成人| 欧美激情影音先锋| 日本欧美中文字幕| 亚洲自拍小视频| 中文字幕av一区二区三区谷原希美| 欧美成人免费播放| 精品无人区太爽高潮在线播放| 91视频88av| 欧美日韩在线视频一区| 亚洲第一区在线| 国产人妖伪娘一区91| 色偷偷噜噜噜亚洲男人| 亚洲欧美日韩国产成人| 色播久久人人爽人人爽人人片视av| 午夜精品蜜臀一区二区三区免费| 日本一区二三区好的精华液| 国产成人亚洲综合91| 日韩少妇与小伙激情| 国产欧美一区二区白浆黑人| 国产精品视频导航| 欧美性猛交xxxx富婆弯腰| 国产黑人绿帽在线第一区| 精品中文视频在线| 日韩在线播放av| 国产精品a久久久久久| 高清欧美性猛交xxxx黑人猛交| 久久国产精品久久国产精品| 国产日本欧美一区二区三区在线| 国产成人精品免高潮在线观看| 国产精品亚发布| 成人黄色av免费在线观看| 456国产精品| 中日韩美女免费视频网站在线观看| 精品亚洲aⅴ在线观看| 欧美自拍视频在线| 红桃视频成人在线观看| 精品免费在线视频| 欧美专区日韩视频| 亚洲人成网站色ww在线| 久久五月天色综合| 亚洲午夜色婷婷在线| 亚洲男人天堂网站| 国产日本欧美一区二区三区| 亚洲а∨天堂久久精品喷水| 国产成人精品免费视频| 国产精品白丝jk喷水视频一区| 国产精品一区二区女厕厕| 一区二区三区视频免费| 国产视频在线观看一区二区| 亚洲国产高潮在线观看| 国产美女直播视频一区| 国产主播精品在线| 国产aⅴ夜夜欢一区二区三区| 国产成人精品综合久久久| 欧美成人第一页| 国产精品丝袜久久久久久不卡| 欧美日韩成人黄色| 国产精品久久久久影院日本| 欧美在线日韩在线| 97av在线视频| 中文字幕亚洲欧美日韩在线不卡| 日韩av成人在线| 欧美日韩精品在线观看|