摘要:什么是小程序先引用小龍哥的一句話來看看啥是小程序小程序是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用觸手可及的夢(mèng)想,用戶掃一掃或者搜一下即可打開應(yīng)用。也體現(xiàn)了用完即走的理念,用戶不用關(guān)心是否安裝太多應(yīng)用的問題。
什么是小程序?
先引用小龍哥的一句話來看看啥是小程序?
小程序是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃或者搜一下即可打開應(yīng)用。也體現(xiàn)了“用完即走”的理念,用戶不用關(guān)心是否安裝太多應(yīng)用的問題。應(yīng)用將無處不在,隨時(shí)可用,但又無需安裝卸載。 - Allen Zhang(張小龍)
從程序猿的角度來說:小程序就是依賴于微信平臺(tái),利用小程序框架提供視圖層描述語言WXML、WXSS,以及JavaScript來實(shí)現(xiàn)一個(gè)具備原生體驗(yàn)的Web應(yīng)用。微信小程序相當(dāng)于基于微信平臺(tái)造了一個(gè)React Native的輪子,通過JS的跨平臺(tái)性實(shí)現(xiàn)了一套代碼跨平臺(tái)部署、運(yùn)行。
Hello World 工程結(jié)構(gòu)首先,我們先通過微信web開發(fā)者工具新建一個(gè)項(xiàng)目,項(xiàng)目建成后會(huì)自動(dòng)生成下列文件。下文全部圍繞這個(gè)新建的項(xiàng)目來簡(jiǎn)單的介紹一下小程序。
可以看出整個(gè)工程包括app.js、app.json、app.wxss,以及pages和utils目錄,后面我們一次介紹各個(gè)文件和目錄的作用。
其中app.js、app.json、app.wxss最為重要,他們?yōu)閷?duì)整個(gè)小程序進(jìn)行全局配置。
app.js,聲明小程序的整個(gè)生命周期、定義全局變量
app.json,對(duì)整個(gè)小程序起全局配置的作用,規(guī)定小程序包括哪些頁(yè)面、窗口的樣式、底部tab欄的樣式、網(wǎng)絡(luò)超時(shí)事件、是否開啟debug模式
app.wxss,這里的wxss類似于CSS,只不過是針對(duì)微信做了一部分拓展,定義了小程序的全局樣式
而pages目錄下面每一子目錄都代表了小程序中的一個(gè)頁(yè)面,而每一個(gè)頁(yè)面都由*.js、*.json、*.wxml、*.wxss組成,這里又出現(xiàn)了一個(gè)新的后綴wxml,同時(shí)再次出現(xiàn)了wxss,后面會(huì)解釋他倆是啥用的。先解釋一下,頁(yè)面中的這四種文件是干啥用的?
*.js,處理頁(yè)面的邏輯
*.json,處理頁(yè)面的配置
*.wxml,處理頁(yè)面的結(jié)構(gòu)
*.wxss,處理頁(yè)面的樣式
為了減少配置同一個(gè)頁(yè)面目錄中的文件都需要以同一個(gè)名字命名,例如個(gè)人習(xí)慣將所有頁(yè)面目錄下面的文件都用index命名。
*.json中我可以配置什么?上面有提到app.json可以配置頁(yè)面的全局配置,而pages目錄下*.json則可以配置對(duì)應(yīng)頁(yè)面window選項(xiàng)(窗口的樣式),那么我們到底可以配置哪些具體內(nèi)容呢?
// app.json { // 定義小程序中有哪些頁(yè)面 "pages":[ "pages/index/index", "pages/logs/logs" ], // 窗口的樣式 "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "Demo", "navigationBarTextStyle":"black", "enablePullDownRefresh": true }, // 底部tab的內(nèi)容和樣式 "tabBar": { // tab的具體內(nèi)容 "list": [ { "pagePath": "pages/index/index", "text": "首頁(yè)" }, { "pagePath": "pages/logs/logs", "text": "日志" } ] }, // 設(shè)置不同請(qǐng)求的網(wǎng)絡(luò)超時(shí) "networkTimeout": { "request": 10000, "downloadFile": 10000 }, // 是否開啟debug模式,開啟debug模式之后可以在微信開發(fā)者工具的控制臺(tái)中看到整個(gè)APP,以及每個(gè)頁(yè)面的生命周期日志 "debug": true }
常用的配置都在這里了,根據(jù)配置的命名其實(shí)已經(jīng)可以猜個(gè)大概啦,如果猜不出來可以參考文檔“配置”
什么是wxml?工程中出現(xiàn)了一個(gè)新的后綴*.wxml,而WXML(Weixin Markup Language)是微信小程序框架設(shè)計(jì)出來的一種標(biāo)簽語言,你可以直接把他理解成是微信定義了一套帶有特殊事件、效果、屬性的標(biāo)簽,但本質(zhì)上和 小程序提供了兩種不同方式的引用import和include,二者的區(qū)別在于: import會(huì)引用目標(biāo)文件中定義的 template include會(huì)將目標(biāo)文件中除了template外的所有內(nèi)容拷貝到include定義的位置 還需要注意的是import存在作用域的概念,即它只會(huì)引用目標(biāo)文件中的template,不會(huì)引用目標(biāo)文件中import的文件。 這里多帶帶說一下WXML中所提到的事件,小程序框架通過事件來保持視圖層和邏輯層的通訊,例如,用戶進(jìn)行點(diǎn)擊行為,點(diǎn)擊行為觸發(fā)了點(diǎn)擊事件,進(jìn)而觸發(fā)邏輯層中所綁定的函數(shù)。 和我們?cè)跒g覽器中開發(fā)JS有區(qū)別的是,這里的事件分兩種:冒泡事件和非冒泡事件。其中冒泡事件包括touchstart、touchmove、touchcancel、touchend、tap、longtap,其余未提及的事件或者自定義事件均為非冒泡事件。 而在標(biāo)簽綁定事件函數(shù)存在兩種方式bind*、catch*,其中bind*的事件綁定不會(huì)阻止冒泡事件向上冒泡,catch*則會(huì)阻止冒泡事件向上冒泡相當(dāng)于直接在函數(shù)中執(zhí)行e.stopPropagation()來阻止事件冒泡。 WXSS(WeiXin Style Sheets)是一套樣式語言,我們可以簡(jiǎn)單理解成CSS的一個(gè)拓展,它增加了兩個(gè)特性: 尺寸單位 樣式導(dǎo)入 在WXSS中引入了一個(gè)新的單位rpx(responsive pixel),根據(jù)屏幕寬度的不同rpx代表的實(shí)際px也不同。WXSS規(guī)定一個(gè)屏幕的寬度為750rpx,750剛好是iphone6的物理寬度大小,也是目前大多數(shù)設(shè)計(jì)師出設(shè)計(jì)稿的標(biāo)準(zhǔn)寬度。也就是說當(dāng)我們拿到設(shè)計(jì)稿的時(shí)候,我們不需要通過百分比、rem,而是直接測(cè)量出設(shè)計(jì)稿上的像素大小并使用微信提供的rpx就可以滿足多屏適配的問題。 除了rpx,WXSS還提供了目前大部分CSS預(yù)編譯語言所提供的是樣式導(dǎo)入,即將外聯(lián)樣式導(dǎo)入當(dāng)當(dāng)前文件中 我們可以通過App()來注冊(cè)一個(gè)小程序,并指定他的生命周期。 這里所謂的前臺(tái)、后臺(tái)引用文檔里面的話來說就是: 當(dāng)用戶點(diǎn)擊左上角關(guān)閉,或者按了設(shè)備 Home 鍵離開微信,小程序并沒有直接銷毀,而是進(jìn)入了后臺(tái);當(dāng)再次進(jìn)入微信或再次打開小程序,又會(huì)從后臺(tái)進(jìn)入前臺(tái)。 不難看出和APP所謂的前臺(tái)后臺(tái)很類似。 在這里我們還需要注意的一點(diǎn)就是場(chǎng)景值,場(chǎng)景值應(yīng)該是微信所獨(dú)有的一個(gè)概念,即你通過什么的方式進(jìn)入小程序,你可以是通過“發(fā)現(xiàn)欄小程序主入口”,也可以是通過“單人聊天窗口”等等途徑進(jìn)入不同的方式都對(duì)應(yīng)這個(gè)一個(gè)固定的值,這樣你就可以根據(jù)不同的場(chǎng)景值對(duì)用戶作區(qū)分、統(tǒng)計(jì),亦或是功能上的區(qū)分,這些完全可以根據(jù)你的應(yīng)用場(chǎng)景來決定。具體場(chǎng)景值可以參考文檔“場(chǎng)景值” 和注冊(cè)小程序相似,注冊(cè)頁(yè)面可以通過Page()去指定頁(yè)面的生命周期、事件函數(shù)以及初始化數(shù)據(jù) 上圖為頁(yè)面生命周期的一個(gè)描述,其中onLoad和onUnload對(duì)應(yīng)代表了頁(yè)面的生命開始和結(jié)束,頁(yè)面的生命周期中onLoad、onUnload、onReady只會(huì)調(diào)用一次,onShow、onHide是可以多次調(diào)用的。 小程序中所有的頁(yè)面都由框架自身維護(hù),而框架則以棧的形式去管理所有的頁(yè)面,下表為路由狀態(tài)、頁(yè)面的生命周期、頁(yè)面棧的表現(xiàn)三者的關(guān)系 當(dāng)然,如果你覺得上面的表述比較麻煩,你也可以直接在微信開發(fā)者工具中看到當(dāng)前頁(yè)面棧的變化情況。 框架也為我們提供了獲取頁(yè)面棧的方法,通過getCurrentPages()我們可以以數(shù)組的形式獲得當(dāng)前頁(yè)面棧的實(shí)例,但是不要嘗試修改頁(yè)面棧,可能會(huì)出現(xiàn)莫名其妙的錯(cuò)誤。 以項(xiàng)目中的utils/utils.js文件為例,它本身是一個(gè)普通工具類,采用了CommonJS的規(guī)范將自身特定的函數(shù)暴露給外部使用 在小程序中,基本上一個(gè)文件就是一個(gè)模塊,并通過module.exports或者exports將想要暴露的對(duì)象、函數(shù)暴露出去。 前面在說WXML的時(shí)候,又提到小程序框架為我們提供了大量功能、風(fēng)格和微信相似的原生組件相仿的標(biāo)簽,這些標(biāo)簽就是我們開發(fā)中要使用到的組件,下面大致瀏覽介紹一下 除了這些功能豐富的組件外,微信還提供了豐富的微信API來調(diào)起微信 這里只做一個(gè)大概介紹,具體內(nèi)容請(qǐng)參考文檔“組件”和“API” 在小程序中無法使用window、document,因?yàn)樾〕绦蜻\(yùn)行在JsCore中,它里面是不包含window、document的 在小程序中無法使用jquery、zepto,因?yàn)?b>jquery或zepto中使用了window或document background-image不能使用本地資源,只能使用網(wǎng)絡(luò)資源或者BASE64轉(zhuǎn)碼 小程序只能同時(shí)打開5個(gè)頁(yè)面,超過5個(gè)時(shí),wx.navigateTo就不能正常打開了 博客地址: ssh.today,歡迎關(guān)注 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82905.html
事件
/** common.wxss **/
.small-p {
padding:5px;
}
/** app.wxss **/
@import "common.wxss";
.middle-p {
padding:15px;
}
App
App({
// 監(jiān)聽小程序初始化,只會(huì)在小程序注冊(cè)時(shí)調(diào)用,其中返回值中包括了`path`小程序路徑、`query`打開小程序的query、`scene`場(chǎng)景值
onLaunch: function (options) {},
// 監(jiān)聽小程序顯示,當(dāng)小程序啟動(dòng)或者從前臺(tái)進(jìn)入后臺(tái)時(shí)會(huì)調(diào)用該方法
onShow: function(options) {},
// 監(jiān)聽小程序隱藏,當(dāng)小程序從前臺(tái)進(jìn)入后臺(tái)時(shí)調(diào)用
onHide: function() {},
// 監(jiān)聽小程序的錯(cuò)誤,當(dāng)小程序發(fā)生錯(cuò)誤時(shí)觸發(fā),類似`window.onerror`
onError: function() {},
// 全局對(duì)象
globalData: {}
});
// app本身是一個(gè)單例在一個(gè)程序中只有一個(gè),所以在其它文件中如果想要使用APP對(duì)象需要通過下列方法調(diào)用
var appInstance = getApp();
Page({
// 初始化的頁(yè)面數(shù)據(jù)
data: {
text: "初始化數(shù)據(jù)"
},
// 頁(yè)面加載時(shí)觸發(fā),這里的加載指的是第一次加載
onLoad: function(options) {},
// 頁(yè)面渲染完成時(shí)觸發(fā)
onReady: function() {},
// 頁(yè)面顯示時(shí)觸發(fā),每次打開都會(huì)觸發(fā)
onShow: function() {},
// 頁(yè)面隱藏時(shí)觸發(fā)
onHide: function() {},
// 頁(yè)面卸載時(shí)觸發(fā)
onUnload: function() {},
// 用戶下拉時(shí)觸發(fā)
onPullDownRefresh: function() {},
// 用戶上拉觸底時(shí)觸發(fā)
onReachBottom: function() {},
// 點(diǎn)擊分享后觸發(fā)
onShareAppMessage: function () {},
// 事件綁定函數(shù)
viewTap: function() {
// 修改頁(yè)面數(shù)據(jù)
this.setData({
text: "啦啦啦啦啦"
})
},
// 自定義的對(duì)象
customData: {
hi: "MINA"
}
})
路由方式
觸發(fā)時(shí)機(jī)
頁(yè)面棧表現(xiàn)
路由前頁(yè)面
路由后頁(yè)面
初始化
在小程序中打開第一個(gè)頁(yè)面
新頁(yè)面入棧
-
onLoad,onShow
打開新頁(yè)面
調(diào)用wx.navigateTo或者使用navigator組件跳轉(zhuǎn)方式為navigateTo
新頁(yè)面入棧
onHide
onLoad,onShow
頁(yè)面重定向
調(diào)用wx.redirectTo或者使用navigator組件跳轉(zhuǎn)方式為redirectTo
當(dāng)前頁(yè)面出棧,新頁(yè)面入棧
onUnload
onLoad,onShow
頁(yè)面返回
調(diào)用wx.navigateBack或者使用navigator組件跳轉(zhuǎn)類型為navigateBack或者按返回鍵
頁(yè)面不斷出棧,直到找到目標(biāo)頁(yè)面
onUnload
onShow
Tab切換
調(diào)用wx.switchTab或者使用navigator組件跳轉(zhuǎn)類型為switchTab
頁(yè)面全部出棧,只留下訪問的tab頁(yè)
-
根據(jù)跳轉(zhuǎn)頁(yè)面的不同而不同
重加載
調(diào)用wx.reLaunch或者使用navigator組件跳轉(zhuǎn)類型為reLaunch
頁(yè)面全部出棧,只留下新的頁(yè)面
onUnload
onLoad,onShow
// utils/utils.js
function formatTime(date) {
var year = date.getFullYear()
var month = date.getMonth() + 1
var day = date.getDate()
var hour = date.getHours()
var minute = date.getMinutes()
var second = date.getSeconds()
return [year, month, day].map(formatNumber).join("/") + " " + [hour, minute, second].map(formatNumber).join(":")
}
function formatNumber(n) {
n = n.toString()
return n[1] ? n : "0" + n
}
module.exports = {
formatTime: formatTime
}
// logs/logs.js
// 通過require去引用utils.js
var util = require("../../utils/util.js")
摘要:注意如果我們不是用注冊(cè)時(shí)綁定的管理員微信號(hào),在手機(jī)上體驗(yàn)該小程序。微信小程序會(huì)讀取這些文件,并生成小程序?qū)嵗?。下面我們?jiǎn)單了解這三個(gè)文件的功能,方便修改以及從頭開發(fā)自己的微信小程序。 獲取微信小程序的AppID首先,我們需要擁有一個(gè)帳號(hào),如果你能看到該文檔,我們應(yīng)當(dāng)已經(jīng)邀請(qǐng)并為你創(chuàng)建好一個(gè)帳號(hào)。注意不可直接使用服務(wù)號(hào)或訂閱號(hào)的AppID。 利用提供的帳號(hào),登錄https://mp.we...
摘要:最佳實(shí)踐良好的編碼規(guī)范單元測(cè)試持續(xù)集成文檔,從一開始就形成良好的編碼習(xí)慣。真實(shí)的電商業(yè)務(wù)所有的業(yè)務(wù)需求來自真實(shí)的客戶,并且線上良好運(yùn)營(yíng)中。 重要通知: Laravel + 小程序的開源電商版本源碼已經(jīng)在 github 上拉,歡迎提交 issue 和 star :) 開源電商 Server 端: Laravel API源碼 開源電商 client 端:小程序源碼 iBrand 簡(jiǎn)介...
摘要:接下來,在支付寶小程序開發(fā)者工具中打,不出意外能跑起來一個(gè)電商支付寶小程序雛形。地址以上是我這個(gè)攻城獅對(duì)使用轉(zhuǎn)換原生微信小程序?yàn)橹Ц秾毿〕绦虻囊淮挝⒉蛔愕赖膶?shí)踐。 showImg(https://segmentfault.com/img/bVbnCCN?w=1818&h=931);↑開局一張圖,故事全靠編↑ 從一個(gè)需求說起 作為底層的程序猿,哦不,我連猿都算不上,混的好的叫碼神,混得一...
摘要:行勝于言,理論結(jié)合實(shí)踐才是王道,所以本文我將基于前面的學(xué)習(xí)方法,分享我是如何學(xué)習(xí)微信小程序的。第二個(gè)目標(biāo)則需要學(xué)習(xí)小程序的插件相關(guān)接口調(diào)用,以及蟬知建站系統(tǒng)這邊的微信模塊代碼。 前段時(shí)間和大家一起分享了一篇關(guān)于學(xué)習(xí)方法內(nèi)容《大牛與搬運(yùn)工的差距——學(xué)習(xí)方法的力量》。我們將學(xué)習(xí)過程分成八步,并借鑒了敏捷開發(fā)的迭代思想,以達(dá)到自我迭代學(xué)習(xí)的效果。行勝于言,理論結(jié)合實(shí)踐才是王道,所以本文我將基...
摘要:第一步搭開發(fā)環(huán)境首先,我們需要在本地搭建好微信小程序的開發(fā)環(huán)境。在微信小程序中,所有的網(wǎng)絡(luò)請(qǐng)求受到嚴(yán)格限制,不滿足條件的域名和協(xié)議無法請(qǐng)求。第五步配置微信小程序云端示例鏡像中,已經(jīng)部署好了,但是還需要在下修改配置中的域名證書私鑰。 「小程序」這個(gè)劃時(shí)代的產(chǎn)品發(fā)布快一周了,互聯(lián)網(wǎng)技術(shù)人都在摩拳擦掌,躍躍欲試??墒切〕绦蚰壳斑€在內(nèi)測(cè),首批只發(fā)放了 200 個(gè)內(nèi)測(cè)資格(淚流滿面)。本以為沒有...
閱讀 2024·2021-11-15 11:38
閱讀 2058·2019-08-30 15:55
閱讀 2192·2019-08-30 15:52
閱讀 3176·2019-08-30 14:01
閱讀 2693·2019-08-30 12:47
閱讀 1158·2019-08-29 13:17
閱讀 1072·2019-08-26 13:55
閱讀 2640·2019-08-26 13:46