小程序最近太火,不過相比較剛發布時,已經有點熱度散去的感覺,不過這不影響我們對小程序的熱情,開發之前建議通讀下官網文檔,附鏈接:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=201716
接下來,我們要實現的小程序效果如下,源碼地址:https://github.com/caiya/weapp-ywgo:

1、注冊
打開微信公眾平台,單擊“小程序”,按步驟開始注冊即可,附地址:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN

這里要注意的就是,小程序目前個人開發者無法單獨注冊,需要進行企業等資格認證,不過認證那里我們隨意填寫,認證通不通過並不影響我們開發,只是不能正式發布而已。

2、初始化項目
注冊成功后,進入后台,有個appid、密鑰,這兩個添加到這里,最后點擊確定即可:
3、項目結構
來看下wx自動生成的項目結構:

其中,pages用來放小程序中的各個頁面,這些頁面必須在app.json文件的pages參數中進行配置,static是我們自定義的用來存放靜態文件的目錄,比如一些image、style等,utils是工具文件夾,放置一些公共類方法,比如request請求封裝、時間處理等,下面來主要介紹一下幾個文件:
- app.js or page.js:app.js是全局的小程序類,page.js是各個頁面層級的類,app.js的代碼格式如下:
//app.js
const utils = require('./utils/util.js')
App({
onLaunch: function () {
},
getUserInfo(cb) {
var that = this
if(this.globalData.userInfo){
typeof cb == "function" && cb(this.globalData.userInfo)
}else{
//調用登錄接口
wx.login({
success: function () {
wx.getUserInfo({
success: function (res) {
that.globalData.userInfo = res.userInfo
typeof cb == "function" && cb(that.globalData.userInfo)
}
})
}
})
}
},
getNewsInfo(typeId) {
var that = this;
return new utils.Promise((resolve, reject) => {
if (that.globalData.newsInfo && that.globalData.newsInfo["" + typeId]) {
resolve(that.globalData.newsInfo["" + typeId])
}
return utils.get({ "type": typeId }).then(res => {
if (!that.globalData.newsInfo) that.globalData.newsInfo = {};
that.globalData.newsInfo["" + typeId] = res.result.data;
resolve(res.result.data);
})
});
},
globalData: {
newsInfo: null,
userInfo: null
}
})
- 其中globalData屬性是全局對象,各個page層級的都可以訪問,getUserInfo、getNewsInfo是全局方法,所有page下均可調用,onLaunch事件是小程序app啟動調用的事件,只走一次,類似的還有page下的onLoad、onShow等,分別表示頁面加載后調用、頁面顯示即調用等。app.json文件是用來配置頁面、窗體、tabBar等,比如我們這里配置底部工具欄四個,可如下配置:
{
"pages": [
"pages/hot/index",
"pages/my/index",
"pages/my/feedback/index",
"pages/my/information/index",
"pages/dynamic/index",
"pages/dynamic/detail"
],
"window": {
"backgroundTextStyle":"light",
"navigationBarBackgroundColor": "#4BC1D2",
"navigationBarTitleText": "業務GO",
"navigationBarTextStyle": "white"
},
"tabBar": {
"color": "#353535",
"selectedColor": "#4BC1D2",
"borderStyle": "black",
"backgroundColor": "#FFF",
"list": [
{
"pagePath": "pages/hot/index",
"text": "熱點",
"iconPath": "static/images/icon@hot.png",
"selectedIconPath": "static/images/icon@hot-hover.png"
},
{
"pagePath": "pages/circle/index",
"text": "圈子",
"iconPath": "static/images/icon@coterie.png",
"selectedIconPath": "static/images/icon@coterie-hover.png"
},
{
"pagePath": "pages/tool/index",
"text": "工具",
"iconPath": "static/images/icon@tool.png",
"selectedIconPath": "static/images/icon@tool-hover.png"
},
{
"pagePath": "pages/my/index",
"text": "我的",
"iconPath": "static/images/icon@my.png",
"selectedIconPath": "static/images/icon@my-hover.png"
}
]
},
"networkTimeout": {
"request": 60000,
"downloadFile": 60000
}
}
- app.wxss:全局樣式類,相同樣式會被各個page下的樣式覆蓋。比較坑的一點是wxss中的樣式部分特性不支持,比如background-image屬性不支持項目本地路徑,可使用base64或者網絡圖片地址替換,樣式不支持層級調用等。默認有個page樣式可修改頁面層級的部分顯示。
4、關於wx.request請求
小程序下面暫不支持es6語法,但是我們可以使用一些promise工具函數實現promise調用,比如可以自己封裝promise版本的request請求如下:
const DOMAIN = 'https://v.juhe.cn/toutiao/index';
const KEY = 'c419699e576519892ebf87bbd3c8158c';
// 小程序上線需要https
function request(method, data = {}) {
data.key = KEY;
// wx.showNavigationBarLoading()
wx.showToast({
title: '加載中',
icon: 'loading',
duration: 10000
})
return new Promise((resolve, reject) => {
wx.request({
url: DOMAIN,
method: method,
data: data,
header: { 'content-type': 'application/json' },
method: method.toUpperCase(), // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
success: function (res) {
// wx.hideNavigationBarLoading()
wx.hideToast();
resolve(res.data)
},
fail: function (msg) {
console.log('reqest error', msg)
// wx.hideNavigationBarLoading()
wx.hideToast();
reject('fail')
}
})
})
}
然后導出即可外部使用:
module.exports = {
categories, Promise,
get: requestGet, post: requestPost, request,showLoading,requestDynamic
}
wx.showToast({
title: '加載中',
icon: 'loading',
duration: 10000
})
wx.hideToast();
5、關於免費api調用
小程序開發時我們難免會進行服務調用,首先必須在這里設置request請求的域名地址(wx規定域名必須是https的才行):

當然,免費的api還是有很多,不過大多數都是要進行認證的,不認證的話使用會有部分限制,不過短期不影響。
6、關於項目上傳、審核
項目上傳需要使用wx的開發工具:

掃碼上傳之后在這里我們就能看到上傳的版本信息:

當然,上傳之后是“開發版”,可以直接在此基礎上進行提交審核或者選為體驗版,體驗版的話管理員賬戶可以自行指定體驗者的微信賬號,這樣的話,即使小程序不發布,體驗者也可以和開發者一樣掃碼預覽項目效果,體驗者的設置在這里進行:

7、關於數據渲染及頁面傳參
首先是數據渲染,每個頁面的數據來源是page對象下的data屬性,然后在頁面里通過雙大括號的方式進行數據渲染,了解模板引擎的一看就知道了,覺得小程序這種做法類似於一些mvvm框架,數據層修改數據會直接同步到視圖層。當然渲染時支持條件判斷、循環處理等,這些基本的功能沒有少。
其次是頁面跳轉及傳參,這里主要有2種方式,分別介紹如下:
一是使用navigator組件,該組件里面可包含一系列的view組件,navigator組件必須指定url屬性,代表單擊跳轉地址(微信小程序不支持外鏈跳轉,有點失望),使用如下:
<navigator url="detail?id={{item.id}}">
<template is="mainTabCell" data="{{item}}" />
</navigator>
這里detail即為某頁面名稱,參數傳遞類似get請求時參數拼接傳遞的方式,當然在js中進行數據獲取也比較簡單:
onLoad:function(options){
data_id = options.id;
//頁面初始化 options為頁面跳轉所帶來的參數
this.refreshNewData();
}
onLoad事件默認有個options參數,該參數navigator組件傳過來的參數,然后進行處理即可。
二是頁面跳轉,小程序支持如下4種導航跳轉:

參數傳遞的話直接寫在其url屬性上,類似如下:
wx.navigateTo({
url: 'test?id=1'
})
8、關於事件處理及分類
小程序中的事件總得分為2種,一種是冒泡、一種是非冒泡事件,使用bind開頭綁定的事件為冒泡事件,意思是說如果同一個事件名稱,上下兩個頁面層組件均綁定了該事件的話,那么底下組件的事件處理會先執行,然后再繼續執行上層組件的相應代碼;使用catch開頭綁定的事件不冒泡,事件只會被處理一次。然后是事件對象,事件處理到達page下的js后,會默認傳一個event對象,該對象類似如下:

比如如下代碼:
<view class="sv__item {{ currentTab ==item.id ? 'active':'' }}" bindtap="changeCategory" data-id="{{ item.id }}" data-index="{{ item.index }}">
{{ item.name }}
</view>
我們使用了bindTap事件處理view單擊,參數傳遞使用data-xxx='yyyy'的形式,其中xxx為key,相應的yyyy為傳入的參數值,在事件處理中我們可以這樣獲取參數:
changeCategory: function (ev) {
var that = this;
var id = ev.currentTarget.dataset.id;
this.setData({
currentTopItem: ev.currentTarget.dataset.index
});
}
9、關於模板使用
小程序提供模板功能,個人感覺類似於vue中的組件概念,模板可以被各個需要的頁面進行引入調用,模板的定義使用如下方式:
<template name="msgItem">
<view>
<text> {{index}}: {{msg}} </text>
<text> Time: {{time}} </text>
</view>
</template>
在需要調用模板的頁面通過以下代碼片段使用:
<template is="msgItem" data="{{...item}}"/>
其中msgItem為模板定義時指定的name,item為傳入的參數對象,該對象下有idnex、msg、time三個鍵值對。注意如果模板文件與調用不在同一個文件的話必須先進行模板文件的導入,直接在頁面中使用import導入模板頁面即可。
10、關於小程序調試
wx開發者工具自帶調試功能,可直接對代碼、樣式文件、緩存等進行編輯查看,還支持console控制台打印:

總結:
1、流暢性:比H5的應用流暢性好,個人覺得相比原生還差一點,介乎兩者之間
2、開發者工具:自動提示功能有限,大部分情況下要開發者自己手碼
3、開發者工具里面看到的效果偶爾和微信里面看到的不同:比如圖片預覽、background-image圖片顯示等
4、登錄方式各異:很多小程序都直接使用微信登錄,也有自己做登錄的,不是很統一
5、布局:小程序使用css3的flex布局,靈活性較高
6、巧用工具:小程序開發有些工具可以方便實用,比如wept,可以支持在瀏覽器中實時預覽小程序頁面布局效果,這樣開發和設計可以分工開來了;又如wxParse,這個覺得比較強大,可以用來處理一些復雜詳情頁的數據顯示等。


