前言
微信小程序也推出好幾年了,由于微信一直穩(wěn)穩(wěn)占據(jù)國(guó)內(nèi)即時(shí)聊天類App的頭把交椅量瓜,所以微信小程序也順帶著火遍了國(guó)內(nèi),不管是個(gè)人還是公司開發(fā)者都不可避免會(huì)優(yōu)先考慮微信小程序。
年前突然被公司安排去搞一個(gè)微信小程序滓侍,當(dāng)然肯定不是我一個(gè)人了,有其他前端大佬一起做的牲芋,我就順帶著邊學(xué)習(xí)邊開發(fā)撩笆。這里就大概說說個(gè)人的一些體驗(yàn)捺球,當(dāng)然肯定只是一些膚淺的東西,有問題提出來大家一起學(xué)習(xí)探討夕冲。
入手
1氮兵、首先第一部肯定是要去參考官方的教程的:微信小程序官方文檔
2、安裝開發(fā)者工具:微信小程序開發(fā)者工具歹鱼,也可以選擇其他工具來開發(fā)泣栈,我選擇的是VisualStudioCode,后面也會(huì)大概介紹下這個(gè)工具的用法
3弥姻、第一次接觸小程序南片,如果不發(fā)布代碼的話就不需要去申請(qǐng)賬號(hào)了
布局
1、在 Android里面布局代碼都是寫在xml里面庭敦;在小程序里面則是通過wxml(頁面)+ wxss(樣式)疼进;當(dāng)然小程序樣式也可以都寫在wxml里面,類似:
<view style='width:35rpx;height:35rpx;float:right;'></view>
通過style屬性也可以寫樣式秧廉,但是一兩個(gè)還行伞广,多了就會(huì)顯得很亂。
2疼电、Android里面子view都是在viewgroup
里面嚼锄;小程序里面<view>
標(biāo)簽既可以是子view
,也可以是viewgroup
澜沟,通過wxss能展示各種樣式灾票,也能顯示文本。
例如:顯示豎向排列的兩個(gè)文本茫虽。
在Android里面:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">?
<TextView
android:text="test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
小程序里面:
wxml:
<view class="parent">
<text>test</text>
<text>test</text>
</view>
wxss:
.parent{
display: flex;
flex-direction: column;
}
可以說小程序里面的flex布局和Android的LinearLayout
布局很相似刊苍,flex也是推薦的布局,具體可以看教程:Flex布局教程
如果要想元素都重疊濒析,類似Android里面的FrameLayou
t正什,則需要設(shè)置position:absolute
,然后通過margin
号杏、padding
來定位到合適的位置婴氮。不得不說小程序的布局相比Android來說還是麻煩不少的,只能通過多練習(xí)來熟悉了盾致。主经。。
3庭惜、Android里面可以通過<include>
來引入布局罩驻,小程序里面也有template
布局模版,通過<import>
引入即可护赊。
4惠遏、小程序里面布局推薦使用rpx
作為尺寸單位砾跃。
邏輯
1、Android的業(yè)務(wù)邏輯都是寫在Java文件里面节吮,小程序里面都是寫在js里面抽高;同樣的類似Android的頁面生命周期,小程序也有生命周期:
onLoad: function(options) {
// 頁面初始化
},
onReady: function() {
// 頁面渲染完成
},
onShow: function() {
// 頁面顯示
},
onHide: function() {
// 頁面推到后臺(tái)
},
onUnload: function() {
// 頁面關(guān)閉
},
小程序不像Android里面可以監(jiān)聽頁面的返回鍵透绩,所以要在頁面返回時(shí)處理業(yè)務(wù)可以在onUnload
中處理翘骂。
2、與Android中Application類相似帚豪,小程序中app.js相當(dāng)于全局入口雏胃,如果開發(fā)者有需要在小程序啟動(dòng)時(shí)執(zhí)行的操作,就可以在onLaunch
方法中執(zhí)行志鞍。
app.js還提供了一個(gè) globalData
瞭亮,用來存儲(chǔ)整個(gè)小程序使用期間的公共數(shù)據(jù)。
在其他頁面可以通過getApp()
方法用以獲取小程序的 App 實(shí)例固棚,來使用全局公共數(shù)據(jù)统翩。
3、如果有些需要存儲(chǔ)的簡(jiǎn)單數(shù)據(jù)此洲,類似Android中的SharedPreferences
厂汗,小程序可以使用wx.setStorageSync("key", value);
存儲(chǔ);wx.getStorageSync("key");
取出呜师;
4娶桦、頁面之間的數(shù)據(jù)傳遞在小程序里面只能通過路由的方式,就是在跳轉(zhuǎn)鏈接拼接上要傳遞的數(shù)據(jù):
傳數(shù)據(jù):
//let obj = JSON.stringify(obj);
wx.navigateTo({
url: '/pages/index/index?id=' + id,
})
接受:
onLoad: function(options) {
// let obj = JSON.parse(options.obj);
let id = options.id汁汗;
}
如果要傳遞對(duì)象衷畦,則可以在傳遞前使用JSON.stringify(obj);
將數(shù)據(jù)轉(zhuǎn)成字符串,在接受時(shí)使用JSON.parse(obj);
轉(zhuǎn)換回對(duì)象;如果傳遞的值里面有特殊字符需要用encodeURIComponent
知牌、decodeURIComponent
對(duì)要傳值得編碼解碼處理祈争,否則會(huì)報(bào)錯(cuò)。
5角寸、數(shù)據(jù)刷新菩混;在處理完數(shù)據(jù)后我們會(huì)用this.setData({...})
來更新數(shù)據(jù)源,但是很多初學(xué)者都會(huì)犯一個(gè)錯(cuò)誤扁藕,看如下錯(cuò)誤代碼:
wx.request({
url: "request_url",
success: function (res) {
this.setData({...})
}
});
按照上面寫程序就會(huì)報(bào)錯(cuò)沮峡,再看正確代碼:
let that = this;
wx.request({
url: "request_url",
success: function (res) {
that.setData({...})
}
});
兩者區(qū)別在于多了一個(gè)變量 that,并且在 onLoad()
方法里面對(duì)它進(jìn)行了賦值亿柑,使它等于 this邢疙。其實(shí)說白了就是一個(gè)作用域的問題;其實(shí)在Android里面我們也遇到過,就是在點(diǎn)擊事件里面跳轉(zhuǎn)設(shè)置this的時(shí)候秘症,我們都會(huì)寫上類名,類似:Intent intent =new Intent(MainActivity.this,TestActivity.class);
6:事件攔截:在Android里面會(huì)有很多事件攔截處理式矫;小程序里面也不例外乡摹。看如下小程序布局:
<view bindtap="onclick">
<image bindtap='tapclick'></image>
</view>
如上我給子父view都設(shè)置了bindtap
點(diǎn)擊事件采转,這個(gè)時(shí)候點(diǎn)擊下去會(huì)發(fā)現(xiàn)兩個(gè)事件都執(zhí)行了聪廉,這在小程序里面稱為事件冒泡;要想image被點(diǎn)擊故慈,view不被點(diǎn)擊則得使用catchtap
屬性板熊;修改如下:
<view bindtap="onclick">
<image catchtap='tapclick'></image>
</view>
這樣view的點(diǎn)擊事件就不會(huì)響應(yīng)了。
ps:還有些情況是頁面層級(jí)導(dǎo)致的察绷,需在wxss里面使用z-index 調(diào)整頁面層級(jí)干签。