【翼簽到】微信小程序實戰(zhàn)

上班實習的第一天伦吠,接到任務,要求開發(fā)一個微信小程序魂拦。小程序名為【翼簽到】毛仪,用作公司內部發(fā)布大會消息和報名簽到。
接到設計稿芯勘,估摸了一下箱靴,發(fā)現頁面比較多,還好導師給我安排一個小伙伴進行協作開發(fā)荷愕。他主要負責發(fā)布流程而我主要負責著陸流程衡怀、審批流程后臺接口的開發(fā)棍矛。

timg.jpeg

微信小程序

開發(fā)微信小程序是一件很有意思的事情。原因有二:

  • 簡潔易懂的中文文檔
  • 所見即所得的開發(fā)快感
    入門開發(fā)小程序的成本是相當低的狈癞,但是想要寫好來茄靠,也是一件不簡單的事情,也踩過了一些坑蝶桶,在這里和大家分享一下慨绳。
1.setData()

調用setData()改變data中的數據,并不是實時的真竖。頻繁的(毫秒級)調用setData()會嚴重影響頁面性能脐雪。至于原理,微信小程序的文檔說得很清楚了恢共。
https://developers.weixin.qq.com/miniprogram/dev/framework/performance/tips.html?search-key=%E6%80%A7%E8%83%BD

2.生命周期函數onShow

官方文檔給這個聲明周期函數給出的介紹是:onShow: 頁面顯示战秋,每次打開頁面都會調用一次。當我們調用微信小程序API路由跳轉至一個頁面的時候讨韭,該頁面掛載的onShow函數脂信,往往都會執(zhí)行一次。

3.在視圖容器swiper中使用map組件
<swiper>
  <swiper-item>大會介紹</swiper-item>
  <swiper-item>大會議程</swiper-item>
  <swiper-item>出席嘉賓</swiper-item>
  <swiper-item>地圖定位
    <map> </map>
  </swiper-item>
</swiper>

官方文檔明確指出<map>組件不能嵌套在<swiper>組件當中使用透硝。上面的代碼違反了這條規(guī)定狰闪。出現的結果就是:在微信開發(fā)者工具中的模擬器測試,四個<swiper-item>能夠流暢切換濒生,表現正常埋泵。但是,當在手機上進行測試的時候罪治,便出現了<map>組件停留在原地丽声,不會隨著父元素的<swiper-item>滑動的問題。
對于這樣的問題觉义,目前的解決方案是:使用<image>組件替換<map>組件雁社,也就是展示一張靜態(tài)的假地圖。當用戶需要操作地圖的時候晒骇,<image>組件隱藏歧胁,將真正需要展示<map>組件顯示出來即可。

4.微信小程序啟動機制

微信小程序只有冷啟動熱啟動之分厉碟。當用戶打開過某個小程序喊巍,然后在一定時間內(目前為5分鐘)再次打開,只需將后臺態(tài)的小程序切換到前臺箍鼓,這是熱啟動崭参。冷啟動指的是用戶首次打開或小程序被微信主動銷毀后再次打開的情況,此時小程序需要重新加載啟動款咖。
微信小程序被銷毀的情況有兩種:
1.當小程序進入后臺何暮,客戶端會維持一段時間的運行狀態(tài)奄喂,超過一定時間后(目前是5分鐘)會被微信主動銷毀
2.當短時間內(5s)連續(xù)收到兩次以上收到系統內存告警,會進行小程序的銷毀

5.密切關注微信小程序API的變動

作為一個系統的開發(fā)者和維護者海洼,要關注官方文檔中API的變動跨新,因為某些API的變動可能會影響到使用該API的模塊功能,因此需要做出及時的調整坏逢。例如域帐,在今年4月份的時候,微信小程序變動了獲取用戶信息的接口(wx.getUserInfo)是整,具體見下圖:


獲取用戶信息接口調整.png

簡單來說肖揣,此次更新,是微信小程序獲取用戶信息這一操作更加傾向于用戶主動提交個人信息浮入。如果程序開發(fā)者不及時更新維護的話龙优,那么原先調用wx.getUserInfo這一接口,將會報錯事秀。
在這種情況下彤断,拿【有贊服務指南小程序】舉例,該小程序在獲取用戶頭像的時候(用戶信息的一部分),明顯的修改為“點擊獲取頭像”,指引用戶主動點擊提交個人信息以獲取個人頭像信息。就算用戶出于安全考慮不點擊,那么小程序也不會調用wx.getUserInfo接口旬昭,因此,也不會產生錯誤钻注。


有贊服務指南小程序.jpg

后臺技術棧

依照公司內部的技術棧體系片仿,后臺技術棧選用了Node+Express4.0+MySQL。作為一個已經有Koa框架開發(fā)經驗的我來說陆淀,使用Express開發(fā)后臺接口的難度并不高考余。整個開發(fā)周期,花費在前端開發(fā)的時間遠比開發(fā)后臺接口所花的時間多得多轧苫。

其它

和我搭檔的小伙伴楚堤,在發(fā)布流程開發(fā)至一半的時候,離職返校答辯去了含懊,留下我孤零零的攬下整個小程序的開發(fā)身冬。于是,在他編寫的代碼基礎上岔乔,我繼續(xù)對發(fā)布流程進行開發(fā)酥筝,讓我有了不小的收獲。

1.一個函數只做一件事情
下面代碼的封裝了一個getConferenceList()方法雏门,由其函數名可以知道這個函數的大概作用——獲取大會列表嘿歌。但是實際上掸掏,這個函數中做了太多的事情,除了獲取大會列表之外宙帝,調用了showLoading()展示loading動畫丧凤,調用了stopPullDownRefresh()取消下載刷新,調用了showModal()彈出模態(tài)框步脓,最后還調用了setData()修改了數據層...
如此雜亂的函數愿待,復用率自由度都大打折扣!

  getConferenceList: function (data, sessionId, that) {
    wx.showLoading({ title: '加載中', mask: true });
    api.conferenceList(data, sessionId).then((res) => {
      if (res.data && res.data.code === 1) {
        let conferenceList = res.data.conferenceList;
        that.setData({ conferenceList }, function () {
          wx.stopPullDownRefresh();
          wx.hideLoading();
        });
      } else {
        wx.hideLoading();
        wx.showModal({ title: '服務器開小差啦', content: '請聯系管理員或稍后重試' })
      }
    }, err => {
      wx.hideLoading();
      wx.showModal({ title: '與服務器通訊錯誤', content: '請聯系管理員或稍后重試' })
    });
  }

下拉刷新沪编,調用getConferenceList()方法的時候呼盆,弊病就暴露出來了:
1.不能夠的控制調用setData()和stopPullDownRefresh()的時機,因為getConferenceList()內部已經調用了蚁廓。
2.下拉刷新自帶loading動畫访圃,不需要調用showLoading()方法,getConferenceList()內部調用showLoading()方法很多余相嵌。

  onPullDownRefresh: function () {
    let that = this;
    that.setData({ page: 1, conferenceList: [], finish: false }, function () {
      that.getConferenceList({ page: that.data.page, size: that.data.size }, that.data.sessionId, that);
    });
  }

正因為如此腿时,所以才明白了“一個函數只做一件事情”的重要性了。
嘗試對getConferenceList()方法進行改造饭宾,去掉多余的操作批糟,讓其只作為獲取大會列表信息的一個封裝 。改造后的代碼如下看铆。

  getConferenceList: function (data, sessionId) {
    return api.conferenceList(data, sessionId).then((res) => {
      if (res.data && res.data.code === 1) {
        let conferenceList = res.data.conferenceList;
        return conferenceList;
      } else {
        wx.showToast({ title: '服務端異常', mask: true, icon: 'none', duration: 500 });
      }
    }, err => {
      wx.showToast({ title: '服務器連接失敗', mask: true, icon: 'none', duration: 500 });
    });
  }

改造后的getConferenceList()方法內部返回一個promise對象徽鼎,將獲取大會信息列表之后的控制權交至消費者的手中,而本身只做一件事弹惦,獲取大會消息列表否淤。
這樣一來,便可以控制調用setData()和stopPullDownRefresh()的時機棠隐,靈活度更高石抡。

  onPullDownRefresh: function () {
    let that = this;
    that.getConferenceList({ page: 1, size: that.data.size }, that.data.sessionId).then((value) => {
      that.setData({ page: 1, conferenceList: value }, function () {
        wx.stopPullDownRefresh()
      });
    });
  }

2.合理控制數據流
一個合格的前端開發(fā)工程師一定是善于控制數據流的,合理的控制數據流首先需要明確每個數據的生命周期助泽,是伴隨整個小程序的生命周期還是執(zhí)行完某個函數就銷毀了啰扛。確定了生命周期再選擇存儲數據的方式,是存儲在localStorage嗡贺、sessionStorage還是掛載到全局對象又或者僅僅需要路由傳值隐解,這些都需要根據數據的生命周期去考量。

喜歡這篇文章的朋友們诫睬,請點個贊再走哦~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末煞茫,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子岩臣,更是在濱河造成了極大的恐慌溜嗜,老刑警劉巖宵膨,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異炸宵,居然都是意外死亡辟躏,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門土全,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捎琐,“玉大人,你說我怎么就攤上這事裹匙∪鸫眨” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵概页,是天一觀的道長籽御。 經常有香客問我,道長惰匙,這世上最難降的妖魔是什么技掏? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮项鬼,結果婚禮上哑梳,老公的妹妹穿的比我還像新娘。我一直安慰自己绘盟,他們只是感情好鸠真,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著龄毡,像睡著了一般吠卷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稚虎,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天撤嫩,我揣著相機與錄音偎捎,去河邊找鬼蠢终。 笑死,一個胖子當著我的面吹牛茴她,可吹牛的內容都是我干的寻拂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丈牢,長吁一口氣:“原來是場噩夢啊……” “哼祭钉!你這毒婦竟也來了?” 一聲冷哼從身側響起己沛,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慌核,失蹤者是張志新(化名)和其女友劉穎距境,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體垮卓,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡垫桂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了粟按。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诬滩。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灭将,靈堂內的尸體忽然破棺而出疼鸟,到底是詐尸還是另有隱情,我是刑警寧澤庙曙,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布空镜,位于F島的核電站,受9級特大地震影響捌朴,放射性物質發(fā)生泄漏姑裂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一男旗、第九天 我趴在偏房一處隱蔽的房頂上張望舶斧。 院中可真熱鬧,春花似錦察皇、人聲如沸茴厉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矾缓。三九已至,卻和暖如春稻爬,著一層夾襖步出監(jiān)牢的瞬間嗜闻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工桅锄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琉雳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓友瘤,卻偏偏與公主長得像翠肘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辫秧,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容

  • 轉載鏈接 注:本文轉載知乎上的回答 作者:初雪 鏈接:https://www.zhihu.com/question...
    pengshuangta閱讀 28,548評論 9 295
  • 1:微信小程序官方工具: https://mp.weixin.qq.com/debug/w ... tml?t=1...
    黃海佳閱讀 9,423評論 1 56
  • 早起讀書10分鐘 工作生活更輕松 王通老師在《練志氣》中分享了: 想改變自己的運勢和命運束倍,首先要改變的就是自己。身...
    姜軍說沙棘閱讀 301評論 0 0
  • 我每次有機會能夠坐車走在上海的高架路上,看到這個繁榮绪妹,燈紅酒綠的超級大都市的時候甥桂,都會有一些不可名狀的傷感。 可能...
    AmberTung閱讀 254評論 0 3
  • 題目 原題鏈接:B. Devu, the Dumb Guy 題意 有n門課程邮旷,每門課程有ni個章節(jié)格嘁,每個章節(jié)學習需...
    ss5smi閱讀 94評論 0 0