小程序最近太火,不過相比較剛發佈時,已經有點熱度散去的感受,不過這不影響咱們對小程序的熱情,開發以前建議通讀下官網文檔,附連接:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=201716css
接下來,咱們要實現的小程序效果以下,源碼地址:https://github.com/caiya/weapp-ywgo:html
打開微信公衆平臺,單擊「小程序」,按步驟開始註冊便可,附地址:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CNvue
這裏要注意的就是,小程序目前我的開發者沒法單獨註冊,須要進行企業等資格認證,不過認證那裏咱們隨意填寫,認證通不經過並不影響咱們開發,只是不能正式發佈而已。css3
註冊成功後,進入後臺,有個appid、密鑰,這兩個添加到這裏,最後點擊肯定便可:git
來看下wx自動生成的項目結構:es6
其中,pages用來放小程序中的各個頁面,這些頁面必須在app.json文件的pages參數中進行配置,static是咱們自定義的用來存放靜態文件的目錄,好比一些image、style等,utils是工具文件夾,放置一些公共類方法,好比request請求封裝、時間處理等,下面來主要介紹一下幾個文件:github
//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 } })
{ "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 } }
小程序下面暫不支持es6語法,可是咱們可使用一些promise工具函數實現promise調用,好比能夠本身封裝promise版本的request請求以下:json
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();
小程序開發時咱們不免會進行服務調用,首先必須在這裏設置request請求的域名地址(wx規定域名必須是https的才行):
固然,免費的api仍是有不少,不過大多數都是要進行認證的,不認證的話使用會有部分限制,不太短期不影響。
項目上傳須要使用wx的開發工具:
掃碼上傳以後在這裏咱們就能看到上傳的版本信息:
固然,上傳以後是「開發版」,能夠直接在此基礎上進行提交審覈或者選爲體驗版,體驗版的話管理員帳戶能夠自行指定體驗者的微信帳號,這樣的話,即便小程序不發佈,體驗者也能夠和開發者同樣掃碼預覽項目效果,體驗者的設置在這裏進行:
首先是數據渲染,每一個頁面的數據來源是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' })
小程序中的事件總得分爲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 }); }
小程序提供模板功能,我的感受相似於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導入模板頁面便可。
wx開發者工具自帶調試功能,可直接對代碼、樣式文件、緩存等進行編輯查看,還支持console控制檯打印:
總結:
一、流暢性:比H5的應用流暢性好,我的以爲相比原生還差一點,介乎二者之間
二、開發者工具:自動提示功能有限,大部分狀況下要開發者本身手碼
三、開發者工具裏面看到的效果偶爾和微信裏面看到的不一樣:好比圖片預覽、background-image圖片顯示等
四、登陸方式各異:不少小程序都直接使用微信登陸,也有本身作登陸的,不是很統一
五、佈局:小程序使用css3的flex佈局,靈活性較高
六、巧用工具:小程序開發有些工具能夠方便實用,好比wept,能夠支持在瀏覽器中實時預覽小程序頁面佈局效果,這樣開發和設計能夠分工開來了;又如wxParse,這個以爲比較強大,能夠用來處理一些複雜詳情頁的數據顯示等。