微信小程序已經火了一段時間了,以前一直也在關注,就這半年的發展來看,相對原生APP大部分公司仍是不肯意將主營業務放到微信平臺上,以避免受制於騰訊,不過就小程序的應用場景(用完即走和二維碼分發等)仍是很值得咱們學習的,技術上面若是瞭解React的話,會發現他們在組件化上面有不少雷同之處。說白了,小程序就是基於微信平臺的H5輕應用,微信將系統底層功能(設備、位置、媒體、文件等)和微信自身功能(登陸、支付、分享等)封裝成相應API供小程序調用。css
本身根據官方文檔寫過一個DOME,藉助和風天氣開放API接口,實現天氣預報,僅供學習交流使用,謝謝~html
1、小程序基本概念git
一、開發工具:爲了配合小程序開發,微信專門配備了本身的開發工具,自行選擇對應版本安裝。github
二、建立項目應用:安裝完成後,打開並掃碼登陸。小程序發佈須要企業級的認證公衆號,因此我的訂閱號是不能發佈的。因此我這裏選擇無AppID,建立項目選擇一個本地空文件夾,勾選建立quick start 項目生成一個demo。ajax
三、編寫小程序:demo初始化幷包含了一些簡單的代碼文件,其中app.js、app.json、app.wxss 這三個是必不可少的,小程序會讀取這些文件初始化實例。json
app.js是小程序的初始化腳本,能夠在這個文件中監聽小程序的生命週期,申請全局變量和調用API等小程序
app.json是對小程序的全局配置,pages設置頁面路徑組成(默認第一條爲首頁),window設置默認頁面的窗口表現等微信小程序
app.wxss 是整個小程序的公共樣式表。相似網站開發中的common.cssapi
四、建立頁面:在pages目錄下,由一個文件夾中的四個同名不一樣類型文件組成。.js
是腳本文件,.json
是配置文件,.wxss
是樣式表文件,.wxml
是頁面結構文件,其中json和wxss文件爲非必須(默認會繼承app的json和wxss默認設置)。數組
2、小程序的框架
一、小程序的配置
app.json主要分爲五個部分:pages:頁面組,window:框架樣式(狀態欄、導航條、標題、窗口背景色),tabBar:底部菜單,networkTimeout:網絡超時設置,debug:開啓debug模式
page.json針對頁面單獨設置,層疊掉app.json的全局設置
//app.json
{ "pages":[ "pages/index/index", "pages/logs/logs" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#000", "navigationBarTitleText": "WeChat", "navigationBarTextStyle":"white" } }
二、小程序的邏輯
使用App()來註冊一個小程序,必須在app.js
中註冊,且不能註冊多個
App({//以下爲小程序的生命週期 onLaunch: function() { },//監聽初始化 onShow: function() { },//監聽顯示(進入前臺) onHide: function() { },//監聽隱藏(進入後臺:按home離開微信) onError: function(msg) { },//監聽錯誤 //以下爲自定義的全局方法和全局變量 globalFun:function(){}, globalData: 'I am global data' })
使用Page()註冊一個頁面,在每一個頁面的js文件中註冊
Page({ data: {text: "This is page data."},//頁面數據,用來維護視圖,json格式 onLoad: function(options) { },//監聽加載 onReady: function() { },//監聽初次渲染完成 onShow: function() { },//監聽顯示 onHide: function() { },//監聽隱藏 onUnload: function() { },//監聽卸載 onPullDownRefresh: function() { },//監聽下拉 onReachBottom: function() { },//監聽上拉觸底 onShareAppMessage: function () { },//監聽右上角分享 //以下爲自定義的事件處理函數(視圖中綁定的) viewTap: function() {//setData設置data值,同時將更新視圖 this.setData({text: 'Set some data for updating view.'}) } })
三、小程序的視圖與事件綁定
在每一個頁面中的wxml文件中,對頁面js中data進行數據綁定,以及自定義事件綁定
<!--{{}}綁定data中的指定數據並渲染到視圖--> <view class="title">{{text}}</view> <!--wx:for獲取數組數據進行循環渲染,item爲數組的每項--> <view wx:for="{{array}}"> {{item}} </view> <!--wx:if條件渲染--> <view wx:if="{{view == 'WEBVIEW'}}"> WEBVIEW </view> <view wx:elif="{{view == 'APP'}}"> APP </view> <view wx:else="{{view == 'MINA'}}"> MINA </view> <!--模板--> <template name="staffName"> <view>FirstName: {{firstName}}, LastName: {{lastName}}</view> </template> <template is="staffName" data="{{...template.staffA}}"></template> <template is="staffName" data="{{...template.staffB}}"></template> <!--bindtap指定tap事件處理函數爲ViewTap--> <view bindtap="ViewTap"> 點我點我 </view>
Page({ data: {//data數據主要用於視圖綁定 text:"我是一條測試", array:[0,1,2,3,4], view:"APP", template:{ staffA: {firstName: 'Hulk', lastName: 'Hu'}, staffB: {firstName: 'Shang', lastName: 'You'} } }, ViewTap:function(){console.log('額,點到我了了~')}//自定義事件,主要用於事件綁定 })
四、小程序的樣式
在每一個頁面中的wxss文件中,對wxml中的結構進行樣式設置,等同於css,擴展了rpx單位。其中app.wxss默認爲全局樣式,做用全部頁面。
3、小程序實戰-天氣預報(利用和風天氣API)
先看看完成後的效果,一共三個頁面,測試demo不求美觀,不喜勿噴~
一、設置底部菜單和頁面
咱們就在quick start生成的demo基礎上進行修改便可,由於涉及圖標icon,咱們新建一個images文件夾來存放圖片
在原先pages文件夾中,刪除index和log頁面文件夾,新建weather、city、about三個頁面文件夾,及三個頁面對應的四個文件類型,文件結構以下圖
接下來配置app.json文件
/*app.json,該文件不能含有任何註釋,因此正式應用需刪除全部註釋內容*/ { "pages":[//小程序的頁面路徑數組,第一條默認爲首頁,全部頁面均需寫在這裏,不然不能加載 "pages/weather/weather", "pages/about/about", "pages/city/city" ], "window":{//小程序框架設置 "navigationBarBackgroundColor": "#000", "navigationBarTitleText": "天氣預報", "navigationBarTextStyle":"#fff", "backgroundColor":"#666", "backgroundTextStyle":"light", "enablePullDownRefresh":true }, "tabBar": {//小程序底部菜單設置 "color": "#666", "selectedColor": "#56abe4", "backgroundColor": "#ddd", "borderStyle":"black", "list": [{ "pagePath": "pages/weather/weather", "iconPath": "images/tabbar/weather1.png", "selectedIconPath": "images/tabbar/weather2.png", "text": "天氣預報" }, { "pagePath": "pages/city/city", "iconPath": "images/tabbar/city1.png", "selectedIconPath": "images/tabbar/city2.png", "text": "設置城市" }, { "pagePath": "pages/about/about", "iconPath": "images/tabbar/about1.png", "selectedIconPath": "images/tabbar/about2.png", "text": "關於我" }], "position":"bottom" } }
二、註冊小程序和總體樣式
修改app.js和app.wxss兩個文件以下
//app.js App({ //一、系統事件部分 onLaunch: function () {//小程序初始化時執行 var that=this; that.curid = wx.getStorageSync('curid') || that.curid;//API:獲取本地緩存,若不存在設置爲全局屬性 that.setlocal('curid', that.curid);//調用全局方法 }, //二、自定義全局方法部分 setlocal:function(id,val){ wx.setStorageSync(id, val);//API:設置本地緩存 }, //三、自定義全局屬性部分 curid:"CN101010100", version:"1.0" })
/**app.wxss**/ .container {margin: 0; padding: 0;} .title{font-size: 14px; font-weight: bold;}
三、頁面的結構(wxml)、樣式(wxss)、邏輯(js)和配置(json)
小程序中的wxml摒棄了HTML標籤, 改用view(相似div)、text(相似span)、icon等等,class同html指定樣式,bindtap綁定事件(相似onclick),該頁面無特殊配置,json文件內容爲空(非必須文件)
<!--weather.wxml--> <view class="container"> <view class="city" bindtap="bindViewTap"> <text>當前城市:{{basic.city}}</text><!--{{}}用來獲取同頁js文件中註冊頁面data中的數據--> <text class="update">{{basic.update.loc}}</text> </view> </view>
<!--省略。。。-->
/**weather.wxss**/ .city {padding: 3% 5%; background: #ddd;} .city text{font-size: 16px; color: #666;} .city .update{ font-size: 12px; float: right;}
//weather.js var app = getApp();//獲取當前小程序實例,方便使用全局方法和屬性 Page({ //一、頁面數據部分,將綁定到視圖wxml中 data:{cur_id:app.curid,basic:"",now:""},//設置頁面數據,後面空值將在頁面顯示時經過請求服務器獲取 //二、系統事件部分 onShow:function(){ var that = this; wx.showToast({title: '加載中',icon: 'loading',duration: 10000})//設置加載模態框 that.getnow(function(d){//回調函數,根據數據設置頁面data,更新到視圖 wx.hideToast();//隱藏加載框 d.now.cond.src="http://files.heweather.com/cond_icon/"+d.now.cond.code+".png"; that.setData({basic:d.basic,now:d.now})//更新數據,視圖將同步更新 })}, //三、自定義頁面方法:獲取當前天氣API getnow:function(fn){ wx.request({//請求服務器,相似ajax url: 'https://free-api.heweather.com/v5/now', data: {city:app.curid,key:'01a7798b060b468abdad006ea3de4713'},//和風天氣提供用戶key,可自行註冊得到 header: {'Content-Type': 'application/json'}, success: function(res) {fn(res.data.HeWeather5[0]);}//成功後將數據傳給回調函數執行 }) },
//四、頁面事件綁定部分 bindViewTap:function(){wx.switchTab({url: '../city/city'})}//跳轉菜單頁面 })
其餘頁面代碼略,項目源文件見GitHub:https://github.com/gavin125/wxtest
四、注意防坑
跳轉並刷新頁面:需使用onshow來代替onload執行邏輯,onload只在首次打開頁面時執行一次。如:B頁面操做全局數據並跳轉A頁面,A頁面onshow中獲取全局數據更新視圖。