微信小程式從2016年9月21日開始内測 ,以及在2017年1月9号正式釋出也有一段時間了, 很多人開始擁抱微信小程式,我也是一樣 ,從微信小程式内測開始就加入進來 , 開始研究微信小程式 ,屬于最早的一批小程式開發者 ,但是由于小程式釋出後一直不溫不火,以及在工作中也沒有這方面的需求,所有本人也沒有在這方面投入太多的時間, 這裡貼一下我開源的一個小程式知乎日報,這是一年前寫的了 , 當時也是花了很多的時間去研究,前幾天對這個小程式進行了一些修改,也算是重新開始擁抱微信小程式 , 這幾天公司也是有這個需求 , 是以 , 覺得有必要開始對微信小程式的開發做一些總結以及記錄,一方面是通過總結和記錄自己可以梳理一些相關的知識點 ,以及友善有這方面需求的開發者共同學習和進步。
這是一篇微信小程式開發總結記錄, 打算分兩篇來寫, 在開發中遇到的相關知識點以及難點都會記錄下來 ,會長期更新
本篇文章以實用為主,是以不會長篇大論 ,隻是簡單的記錄總結 , 詳細的還需要大家檢視微信官方文檔
關于小程式的申請和詳細文檔請大家移步
https://mp.weixin.qq.com
https://mp.weixin.qq.com/debug/wxadoc/dev/index.html
事件參數傳遞
通過data-hi形式 ,如
Click me!
如果是data-status-show="0"形式 ,參數會轉換成statusShow形式
通過e.target.dataset.hi或者e.currentTarget.dataset.hi擷取傳遞過來的參數
這裡target和currentTarget是有差別的,涉及事件的冒泡 ,具體可檢視官方文檔https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html
延伸 :
以上可以看出點選事件使用bindtap
然後在Page裡面定義方法
Page({
tapName: function(event) {
console.log(event)
}
})
事件分類
事件分為冒泡事件和非冒泡事件:
冒泡事件:當一個元件上的事件被觸發後,該事件會向父節點傳遞。
非冒泡事件:當一個元件上的事件被觸發後,該事件不會向父節點傳遞。
事件清單
touchstart 手指觸摸動作開始
touchmove 手指觸摸後移動
touchcancel 手指觸摸動作被打斷,如來電提醒,彈窗
touchend 手指觸摸動作結束
tap 手指觸摸後馬上離開
longpress 手指觸摸後,超過350ms再離開,如果指定了事件回調函數并觸發了這個事件,tap事件将不被觸發 1.5.0
longtap 手指觸摸後,超過350ms再離開(推薦使用longpress事件代替)
transitionend 會在 WXSS transition 或 wx.createAnimation 動畫結束後觸發
animationstart 會在一個 WXSS animation 動畫開始時觸發
animationiteration 會在一個 WXSS animation 一次疊代結束時觸發
animationend 會在一個 WXSS animation 動畫完成時觸發
注:除上表之外的其他元件自定義事件如無特殊申明都是非冒泡事件,如form的submit事件,input的input事件,scroll-view的scroll事件
綁定事件的寫法
事件綁定的寫法同元件的屬性,以 key、value 的形式。
key 以bind或catch開頭,然後跟上事件的類型,如bindtap、catchtouchstart。自基礎庫版本 1.5.0 起,bind和catch後可以緊跟一個冒号,其含義不變,如bind:tap、、catch:touchstart。
value 是一個字元串,需要在對應的 Page 中定義同名的函數。不然當觸發事件的時候會報錯。
bind事件綁定不會阻止冒泡事件向上冒泡,catch事件綁定可以阻止冒泡事件向上冒泡。
資料綁定
簡單的資料綁定
{{ message }}
對應data中定義的資料
Page({
data: {
message: \'Hello MINA!\'
}
})
資料動态指派
this.setData({
time: e.detail.value
})
其中time是對應data中定義的字段
如果這裡的time我們需要通過參數形式傳遞怎麼辦呢,例如 , 我們有多個input輸入框需要校驗,當離開input框時, 根據資料判斷輸入的合法性,
并且需要修改input輸入框數值,我們通過監聽bindblur事件,擷取目前輸入框的id , 然後通過es6方式進行指派:
this.setData({
[id]: e.detail.value
})
延伸 :
動态樣式修改
在微信小程式中 ,由于 并不能用js或者jq 輕輕松松一行代碼搞定,或者用removeClass addClass 來修改樣式
以下是一種動态修改樣式的方法,原理是綁定資料,然後動态的修改資料,進而實作動态樣式的改變
<view style="text-align: center;">
<label style="color:{{color}};">我會變色</label>
<button bindtap="clickRed">變紅</button>
<button bindtap="clickgreen">變綠</button>
</view>
Page({
data: {
color: "red"
},
clickRed: function () {
this.setData({
color: "red"
})
},
clickgreen: function () {
this.setData({
color: "green"
})
}
})
背景圖檔不能使用本地資源
由于小程式體積比較小,是以微信在有些地方做了一些限制, 比如我們設定背景圖檔無法使用本地資源
background:url(\'../images/icon.png\')
微信要求隻能使用網絡圖檔或者轉碼成base64(圖檔路徑會很長很長),或者使用images标簽代替
感覺挺扯淡的 , 我們都知道在開發中使用background設定背景圖檔是最理想的方式 ,比images要好要友善
由于base64轉換的位址會比較長,是以這裡我們不考慮使用它,那怎麼辦呢 , 我們網絡圖檔,有很多種方式,
可以把圖檔存儲在我們自己的伺服器上面,或者存儲在七牛雲上面。
表單資料送出
一般我們在使用Vuejs以及reactjs等MVVM架構的使用,是支援資料雙向綁定的 , 也就是我們input輸入資料的時候,是實時
反應在data字段資料中的 ,但是微信小程式并不支援這樣 , 那麼問題來了, 在微信小程式中如何擷取使用者輸入的資料呢 ,
有2種方式 , input提供bindinput和bindblur事件,可以監聽input輸入的資料以及當滑鼠離開input框時候擷取到他的資料
bindinput輸入監聽事件,使用時如果隻有一兩個表單還好,但是如果有很多表單那肯定不行,需要監聽每一個input的輸入事件
bindblur事件滑鼠離開input框事件 , 使用它時必須要主動離開輸入框,但是會存在使用者輸入完之後直接點選送出按鈕,這種情況
也不能正常擷取到使用者輸入的資料, 是以也不可行 。
後來,才發現, 微信給我們提供了form表單送出的方式, 簡言之,就是點選送出按鈕後 ,可以擷取到全部的input資料
使用方式 :
<form bindsubmit="doCalc">
<view class=\'flex calc-input-item\'>
<view class=\'flex-item title\'>日單量(單)</view>
<view>
<input type=\'digit\' name=\'dailyBillCount\' maxlength=\'8\' value="{{dailyBillCount}}"></input>
</view>
</view>
<view class=\'calc-btn\'>
<button type=\'button\' class=\'btn\' formType="submit">試算</button>
</view>
</form>
button中的formType="submit"會綁定form中的bindsubmit事件,執行它的方法
然後通過e.detail.value擷取到所有的input資料(在input中設定name屬性)
還有一個reset清空方法 ,用法也是一樣的,通過設定button的formType=“reset”,點選按鈕時會綁定form的bindreset事件
延伸 :
在使用中發現這樣一個問題, 使用button标簽時, 我們自定義樣式,button會有一個預設的邊框樣式,試過多種方法都無法去掉
設定border:none ;或者更改border的邊框顔色border:10rpx solid yellow;都無法解決
送出
最後發現是由于它設定的position:relative受到的影響 ,修改position的值就可以,但是最終還是發現有其他地方受到了影響 。
很無奈,最終放棄使用它的button , 直接通過view标簽來設定button , 由于沒有使用button,是以也不能使用form送出 資料,
隻能是在input輸入資料比較少的情況下還行 ,這個需要視情況而定 。
--------2017.11.16更新
之前沒有仔細看 ,原來是定義了button::after僞元素
這樣的話,那我們修改下他的僞元素設定display: none;問題就解決了
.about-btn:after {
display: none;
}
以後可以愉快的使用它的button了
作者:fozero
聲明:原創文章,轉載請注明出處,謝謝!http://www.cnblogs.com/fozero/p/7842197.html
标簽:微信小程式