須知
1.1 主體由 app.js 、 app.json 、 app.wxss 三個(gè)文件組成,放在根目錄
pages 配置小程序的組成頁(yè)面,第一個(gè)代表小程序的初始頁(yè)面 window 設(shè)置小程序的狀態(tài)欄、標(biāo)題欄、導(dǎo)航條、窗口背景顏色 tabBar 配置小程序tab欄的樣式和對(duì)應(yīng)的頁(yè)面
app.json "pages": [ //設(shè)置頁(yè)面的路徑 "pages/index/index", //不需要寫(xiě)index.wxml,index.js,index,wxss,框架會(huì)自動(dòng)尋找并整合 "pages/logs/logs" ], "window": { //設(shè)置默認(rèn)窗口的表現(xiàn)形式 "navigationBarBackgroundColor": "#ffffff", //頂部導(dǎo)航欄背景色 "navigationBarTextStyle": "black", //頂部導(dǎo)航文字的顏色 black/white "navigationBarTitleText": "微信接口功能演示", //頂部導(dǎo)航的顯示文字 "backgroundColor": "#eeeeee", //窗口的背景色 "backgroundTextStyle": "light", //下拉背景字體、loading 圖的樣式,僅支持 dark/light "enablePullDownRefresh": "false", //是否支持下拉刷新 ,不支持的話(huà)就直接不寫(xiě)! "disableScroll": true, // 設(shè)置true不能上下滾動(dòng),true/false,注意!只能在 page.json 中有效,無(wú)法在 app.json 中設(shè)置該項(xiàng)。 }, "tabBar": { //底部tab或者頂部tab的表現(xiàn),是個(gè)數(shù)組,最少配置2個(gè),最多5個(gè) "list": [{ //設(shè)置tab的屬性,最少2個(gè),最多5個(gè) "pagePath": "pages/index/index", //點(diǎn)擊底部 tab 跳轉(zhuǎn)的路徑 "text": "首頁(yè)", //tab 按鈕上的文字 "iconPath": "../img/a.png", //tab圖片的路徑 "selectedIconPath": "../img/a.png" //tab 在當(dāng)前頁(yè),也就是選中狀態(tài)的路徑 }, { "pagePath": "pages/logs/logs", "text": "日志" }], "color": "red", //tab 的字體顏色 "selectedColor": "#673ab7", //當(dāng)前頁(yè) tab 的顏色,也就是選中頁(yè)的 "backgroundColor": "#2196f3", //tab 的背景色 "borderStyle": "white", //邊框的顏色 black/white "position": "bottom" //tab處于窗口的位置 top/bottom }, "networkTimeout": { //默認(rèn)都是 60000 秒一分鐘 "request": 10000, //請(qǐng)求網(wǎng)絡(luò)超時(shí)時(shí)間 10000 秒 "downloadFile": 10000, //鏈接服務(wù)器超時(shí)時(shí)間 10000 秒 "uploadFile": "10000", //上傳圖片 10000 秒 "downloadFile": "10000" //下載圖片超時(shí)時(shí)間 10000 秒 }, "debug": true //項(xiàng)目上線(xiàn)后,建議關(guān)閉此項(xiàng),或者不寫(xiě)此項(xiàng) 1.2 pagespages 文件夾里是小程序的各個(gè)頁(yè)面,每個(gè)界面一般都由 .wxml 、 .wxss 、 .js 、 .json四個(gè)文件組成,四個(gè)文件必須是相同的名字和路徑
1.3 utilsutils 里面包含一些公共的代碼抽取的 js 文件,作為模塊方便使用。模塊通過(guò) module.exports 對(duì)外暴露接口
二、視圖層 WXML2.1 數(shù)據(jù)綁定傳統(tǒng)的視圖和數(shù)據(jù)綁定
那么微信小程序是通過(guò)什么方法來(lái)管理視圖和對(duì)象綁定的呢,狀態(tài)模式-單向數(shù)據(jù)流
數(shù)據(jù)流向是單向的,即視圖變化不會(huì)影響對(duì)象狀態(tài) UI
.wxml 中的動(dòng)態(tài)數(shù)據(jù)都來(lái)自 Page 中的 data 。數(shù)據(jù)綁定使用數(shù)據(jù)綁定使用雙大括號(hào)將變量包起來(lái),可以作用于內(nèi)容、組件屬性(需要在雙引號(hào)之內(nèi))、控制屬性(需要在雙引號(hào)之內(nèi))、關(guān)鍵字(需要在雙引號(hào)之內(nèi)) Page({ data: { message: "Hello", id:0, status: true } }) <view> {{message}} view> <view id="item-{{id}}"> view> <view wx:if="{{status}}"> view> <view hidden="{{status}}"> checkbox> 還可以進(jìn)行簡(jiǎn)單的運(yùn)算在大括號(hào)里 <view hidden="{{status ? true : false}}"> Hidden view> <view> {{a + b}} + c view> <view wx:if="{{num > 6}}"> view> <view>{{"hello" + word}}view> 2.2 條件渲染用 wx:if=”” 來(lái)判斷是否渲染代碼塊 <view wx:if="{{status}}"> isShow view> 還可以添加 else 塊 <view wx:if="{{num > 5}}"> A view> <view wx:elif="{{num > 2}}"> B view> <view wx:else> C view> 2.3 列表渲染
<view wx:for="{{array}}"> {{index}}: {{item.message}} view> Page({ data: { array: ["AA","BB","CC"] } }) 使用 wx:for-item 可以指定數(shù)組當(dāng)前元素的變量名,使用 wx:for-index 可以指定數(shù)組當(dāng)前下標(biāo)的變量名 <view wx:for="{{array}}" wx:for-index="num" wx:for-item="itemName"> {{num}}: {{itemName}} view> 2.4 模板template
<template name="msgItem"> <view> <text> {{index}}: {{msg}} text> <text> Time: {{time}} text> view> template> <template is="msgItem" data="{{...item}}"/> 2.5 公共模塊的引用
<import src="a.wxml"/> <template name="A"> <text> A template text> template> include 就可以多重引用 <include src="header.wxml"/> <view> body view> <view> header view> <include src="footer.wxml"/> 2.6 事件
三、生命周期3.1 App()應(yīng)用生命周期
onLaunch onShow onHide onShow onError 前臺(tái)、后臺(tái)定義: 當(dāng)用戶(hù)點(diǎn)擊左上角關(guān)閉,或者按了設(shè)備 Home 鍵離開(kāi)微信,小程序并沒(méi)有直接銷(xiāo)毀,而是進(jìn)入了后臺(tái);當(dāng)再次進(jìn)入微信或再次打開(kāi)小程序,又會(huì)從后臺(tái)進(jìn)入前臺(tái) //app.js App({ onLaunch: function() { //小程序初始化(全局只觸發(fā)一次) }, onShow: function() { //小程序顯示 }, onHide: function() { //小程序隱藏 }, onError: function(msg) { //小程序錯(cuò)誤 }, }) //其他 開(kāi)發(fā)者可以添加任意的函數(shù)或數(shù)據(jù)到 Object 參數(shù)中,用 this 可以訪(fǎng)問(wèn) 3.2 Page頁(yè)面生命周期每個(gè)頁(yè)面也有自己的生命周期
//index.js Page({ onLoad: function(options) { //頁(yè)面加載-----(一個(gè)頁(yè)面只會(huì)調(diào)用一次) }, onReady: function() { //頁(yè)面渲染-----(一個(gè)頁(yè)面只會(huì)調(diào)用一次) }, onShow: function() { //頁(yè)面顯示-----(每次打開(kāi)頁(yè)面都會(huì)調(diào)用一次) }, onHide: function() { //頁(yè)面隱藏-----(當(dāng)navigateTo或底部tab切換時(shí)調(diào)用) }, onUnload: function() { //頁(yè)面卸載-----(當(dāng)redirectTo或navigateBack的時(shí)候調(diào)用) }, }) //其他 開(kāi)發(fā)者可以添加任意的函數(shù)或數(shù)據(jù)到 object 參數(shù)中,在頁(yè)面的函數(shù)中用 this 可以訪(fǎng)問(wèn) 3.3 應(yīng)用生命周期影響頁(yè)面生命周期
四、小程序限制4.1 程序限制
4.2 數(shù)量限制
4.3 大小限制
五、路由
5.1 哪些情況會(huì)觸發(fā)頁(yè)面跳轉(zhuǎn)
5.2 如何跳轉(zhuǎn)頁(yè)面
wx.navigateTo({ //目的頁(yè)面地址 url: 'pages/logs/index', success: function(res){}, ... })
wx.redirectTo({ //目的頁(yè)面地址 url: 'pages/logs/index', success: function(res){}, ... }) 5.3 使用組件
當(dāng)該組件添加 redirect 屬性時(shí),等同于 wx.redirectTo 接口;默認(rèn) redirect 屬性為 false,等同于 wx.navigateTo 接口 用戶(hù)點(diǎn)擊左上角返回按鈕,或調(diào)用 wx.navigateBack 接口返回上一頁(yè) wx.navigateBack({ delta: 1 }) delta 為1時(shí)表示返回上一頁(yè),為2時(shí)表示上上一頁(yè),以此類(lèi)推;如果dalta大于已打開(kāi)的頁(yè)面總數(shù),則返回到首頁(yè)。返回后,元界面會(huì)銷(xiāo)毀 5.4 頁(yè)面跳轉(zhuǎn)傳值url?key=value&key1=value1 傳遞的參數(shù)沒(méi)有被 URIEncode ,傳遞中文沒(méi)有亂碼 5.5 如何正確使用頁(yè)面跳轉(zhuǎn)官方規(guī)定小程序最多只能有五個(gè)頁(yè)面同時(shí)存在,意思是在不關(guān)閉頁(yè)面的情況,最多新開(kāi)五個(gè)頁(yè)面,頁(yè)面深度為5
5.6 頁(yè)面棧getCurrentPages() 使用wx.navigateTo每新開(kāi)一個(gè)頁(yè)面,頁(yè)面棧大小加1,直到頁(yè)面棧大小為5為止
使用wx.navigateTo重復(fù)打開(kāi)界面
假如使用wx.navigateTo從四級(jí)頁(yè)面跳轉(zhuǎn)到二級(jí)頁(yè)面,此時(shí)會(huì)在頁(yè)面棧頂添加一個(gè)與二級(jí)頁(yè)面初始狀態(tài)一樣的界面,但兩個(gè)頁(yè)面狀態(tài)是獨(dú)立的。頁(yè)面棧大小會(huì)加1,如果頁(yè)面棧大小為5,則wx.navigateTo無(wú)效 使用wx.redirectTo重定向
假如使用wx.redirectTo從四級(jí)頁(yè)面重定向到二級(jí)頁(yè)面,此時(shí)會(huì)將關(guān)閉四級(jí)頁(yè)面,并使用二級(jí)頁(yè)面替換四級(jí)頁(yè)面,但兩個(gè)頁(yè)面狀態(tài)是獨(dú)立的。此時(shí)的頁(yè)面棧大小不變,請(qǐng)注意和使用wx.navigateTo的區(qū)別 使用wx.navigateBack返回
總結(jié)wx.navigateTo wx.redirectTo wx.navigateBack 六、數(shù)據(jù)通信6.1 頁(yè)面之間的通信app.globalData wx.setStorageSync url // A頁(yè)面-傳遞數(shù)據(jù) // 需要注意的是,wx.switchTab 中的 url 不能傳參數(shù)。 wx.navigateTo({ url:'../pageD/pageD?name=raymond&gender=male' }) // B頁(yè)面-接收數(shù)據(jù)// //通過(guò)onLoad的option... Page({ onLoad: function(option){ console.log(option.name +'is'+ option.gender)// raymond is male this.setData({option: option }) }}) 6.2 參數(shù)傳遞6.2.1 小程序傳遞參數(shù)的方式1、通過(guò)在 App.js 中設(shè)置全局變量通常把不會(huì)更改的數(shù)據(jù)放在 app.js 的 Data 中,在各個(gè)頁(yè)面中都可以通過(guò) APP 實(shí)例獲取 Data 數(shù)據(jù) var app = getApp(); var data = app.data; 2、通過(guò)拼接 URL 直接傳遞wx.navigateTo({}) 中 URL 攜帶參數(shù) wx.navigateTo({ url: 'test?id=1' }); 在wxml中使用 navigator 跳轉(zhuǎn)url傳遞參數(shù)代碼如下,將要傳遞到另一個(gè)頁(yè)面的字符串testId的值賦值到url中
在 js 頁(yè)面中 onLoad 方法中接收 Page({ onLoad: function(options) { var testId = options.testId console.log(testId) } }) navigator 跳轉(zhuǎn) url 傳遞數(shù)組如果一個(gè)頁(yè)面要將一個(gè)數(shù)組,如相冊(cè)列表傳遞到另一個(gè)頁(yè)面
傳遞到j(luò)s后從 options 中得到的是個(gè)字符串,每個(gè)圖片的url通過(guò)’,’分隔,所以此時(shí)還需要對(duì)其進(jìn)行處理,重新組裝為數(shù)組 Page({ data: { // 相冊(cè)列表數(shù)據(jù) albumList: [], }, onLoad: function (options) { var that = this; that.setData({ albumList: options.albumList.split(",") }); } }) 3、在wxml中綁定事件后,通過(guò) data-hi="參數(shù)" 的方式傳遞這種方式一般是在wxml中綁定事件,同時(shí)設(shè)置需要傳遞的數(shù)據(jù),如果需要傳遞多個(gè),可以寫(xiě)多個(gè) data-[參數(shù)] 的方式進(jìn)行傳遞 <view bindtap="clickMe" data-testId={{testId}}"> ... view> 在js頁(yè)面中自定義方法clickMe中接收 Page({ clickMe: function(event) { var testId = event.currentTarget.dataset.testid; wx.navigateTo({ url: '../../pages/test/test' }) } }) wxml中配置data-albumlist傳遞數(shù)組<view bindtap="clickMe" data-albumlist={{testData.albumList}}"> view> 在js頁(yè)面中自定義方法clickMe中接收 Page({ clickMe: function(event) { var albumList = event.currentTarget.dataset.albumlist.split(","); wx.navigateTo({ url: '../../pages/test/test' }) } }) 4、通過(guò)數(shù)據(jù)緩存存儲(chǔ)再獲取wx.setStorageSync(KEY,DATA) 存儲(chǔ)數(shù)據(jù) try { wx.setStorageSync('key', 'value') } catch (e) { } wx.getStorageSync(KEY) 獲取數(shù)據(jù) try { var value = wx.getStorageSync('key') if (value) { // Do something with return value } } catch (e) { // Do something when catch error } 或 wx.getStorage({ key: 'key', success: function(res) { console.log(res.data) } }) 七、疑問(wèn)匯總為什么腳本內(nèi)不能使用window等對(duì)象
為什么 zepto/jquery 無(wú)法使用
wx.navigateTo無(wú)法打開(kāi)頁(yè)面
樣式表不支持級(jí)聯(lián)選擇器
本地資源無(wú)法通過(guò) css 獲取
如何修改窗口的背景色
page { display: block; min-height: 100%; background-color: red; } 為什么上傳不成功
HTTPS 請(qǐng)求不成功
微信小程序支持fetch或者promise嗎?
wx.request的POST方法的參數(shù)傳輸服務(wù)器接收不到的bug
wx.request({ .... method: "POST", header: { "content-type": "application/x-www-form-urlencoded" }, ... }) wx.uploadFile在手機(jī)上返回http碼403
小程序SVG支持嗎?
ipad不能使用小程序?
請(qǐng)問(wèn)小程序頁(yè)內(nèi)支持長(zhǎng)按保存圖片或分享圖片嗎?
微信小程序不支持cookie
有些手機(jī)不支持Object.assign方法,如果使用了該方法會(huì)出現(xiàn)莫名其妙的報(bào)錯(cuò)(并不會(huì)提示Object.assign is not function,而是導(dǎo)致調(diào)用了Object.assign方法的方法不能被調(diào)用)!直接寫(xiě)一個(gè)合并對(duì)象的方法 function assignObject(o, n) { for (var p in n) { if (n.hasOwnProperty(p) && (!o.hasOwnProperty(p))) o[p] = n[p]; } } |