人的一生90%的時(shí)間都在做著無(wú)聊的事情,社會(huì)的發(fā)展使得我們的閑暇時(shí)間越來(lái)越多,我們把除了工作的其他時(shí)間放在各種娛樂(lè)活動(dòng)上。
程序員有點(diǎn)特殊,他們把敲代碼看成娛樂(lè)活動(dòng)的一部分,以此打發(fā)時(shí)間的不占少數(shù)。這不最近無(wú)聊搞了一個(gè)口袋吉他小程序,使用bmob后端云提供數(shù)據(jù)存儲(chǔ)服務(wù),除吉他譜圖片,其他圖片存儲(chǔ)在七牛。
關(guān)于bmob小程序開(kāi)發(fā)文檔請(qǐng)戳這里,文檔詳細(xì)簡(jiǎn)練,主要是縮短了開(kāi)發(fā)周期,不過(guò)對(duì)于復(fù)雜的項(xiàng)目,還是推薦使用自己服務(wù)器提供數(shù)據(jù)服務(wù)。
新建項(xiàng)目并添加圖標(biāo)
在app.wxss中以u(píng)nicode方式引入
@font-face { font-family: 'iconfont'; /* project id 431644 */ src: url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.eot'); src: url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.eot?#iefix') format('embedded-opentype'), url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.woff') format('woff'), url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.ttf') format('truetype'), url('//at.alicdn.com/t/font_431644_aahynh26y6lp7gb9.svg#iconfont') format('svg'); } 復(fù)制代碼
定義通用icon樣式,定義偽元素
.icon{ display: inline-block; font-family: 'iconfont'; } .icon-home::before{ content: "\e600"; } 復(fù)制代碼
使用
<view class="icon icon-home"</view> 復(fù)制代碼
小程序并沒(méi)有類(lèi)似vuejs的v-model進(jìn)行雙向綁定,使用bindinput類(lèi)似jQuery監(jiān)聽(tīng)input事件在事件處理器中更新數(shù)據(jù),通過(guò)event對(duì)象e.data.value即可獲得input的值。
// bindconfirm監(jiān)聽(tīng)鍵盤(pán)回車(chē)事件,focus屬性聚焦渲染組件時(shí)會(huì)自動(dòng)彈出手機(jī)軟鍵盤(pán) <input type='text' placeholder='歌曲名 / 歌手' bindinput='bindSearchInput' bindconfirm='onSearch' focus></input> 復(fù)制代碼
bindSearchInput(e) { this.setData({ searchTxt: e.detail.value }) } 復(fù)制代碼
小程序中的事件處理器并不能像vue一樣傳入?yún)?shù),因?yàn)槭录幚砥髦挥幸粋€(gè)默認(rèn)的參數(shù)event對(duì)象,在for循環(huán)的組件中如果要想獲取元素綁定的id,可以通過(guò)和jQuery相同的方式綁定data屬性。
<!-- 輪播圖 --> <swiper indicator-dots="{{indicatorDots}}" autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}"> <block wx:for="{{banner_list}}" wx:key="{{index}}"> <swiper-item bindtap="navigateToDetail" data-id="{{item.href}}"> <image src="{{item.image}}" class="slide-image" mode="widthFix"></image> </swiper-item> </block> </swiper> 復(fù)制代碼
獲取id:
//事件處理函數(shù) navigateToDetail: function (e) { const id = e.currentTarget.dataset.id; } 復(fù)制代碼
bindtap、bindlongtap、bindtouchstart、bindtouchmove、bindtouchend、bindtouchcancle 復(fù)制代碼
對(duì)應(yīng)阻止冒泡事件將bind用catch替代
小程序的視圖更新需要調(diào)用setData修改綁定數(shù)據(jù),直接對(duì)數(shù)據(jù)進(jìn)行修改是不會(huì)觸發(fā)視圖層更新的。setData接受一個(gè)對(duì)象,為需要添加或修改的屬性。屬性名有點(diǎn)特殊,[]中的值會(huì)被識(shí)別為變量,因此如果要對(duì)對(duì)象數(shù)組中的某個(gè)屬性進(jìn)行修改,只能預(yù)先拼接好屬性名。 錯(cuò)誤做法:
// 視圖不更新 this.data.searchSongs[index].love_flag': 2 // SyntaxError: unknown: Unexpected token this.setData({ 'searchSongs[' + index + '].love_flag': 2 }) 復(fù)制代碼
正確做法:
setSongFlag(e) { // 注意setData屬性名[]中的非整數(shù)值會(huì)被識(shí)別為變量 let key = 'searchSongs[' + index + '].love_flag' this.setData({ [key]: 2 }) 復(fù)制代碼
小程序wxss的background-image及image組件都不支持本地url 在H5的開(kāi)發(fā)中,通常我們會(huì)將頁(yè)面一些不需要根據(jù)容器大小來(lái)選擇顯示方式的圖片使用img標(biāo)簽,需要一些特殊顯示方式的使用background。但小程序只需要image組件便可。它提供的mode屬性和背景定義圖片及img元素控制圖片顯示方式對(duì)比
mode屬性 | background-size | html img元素 |
---|---|---|
scaleToFill | 100%,100%(默認(rèn)) | width:100%;height:100% |
aspectFit | contain | js實(shí)現(xiàn) |
aspectFill | cover | js實(shí)現(xiàn) |
widthFix | 100%, auto | width: 100%; |
其他的top、bottom、right、left等不縮放圖片調(diào)整位置的屬性與background-position作用相同,img元素則只能通過(guò)定位控制。
如果沒(méi)有強(qiáng)迫癥,小程序API使用默認(rèn)回調(diào)的方式即可;另外由于小程序只支持es6,不支持async及await,也可以將API封裝成promise的方式。
function promisify(fn) { return function (obj = {}) { return new Promise((resolve, reject) => { obj.success = function (res) { resolve(res) } obj.fail = function (res) { reject(res) } fn(obj)//執(zhí)行函數(shù),obj為傳入函數(shù)的參數(shù) }) } } module.exports = { promisify: promisify } 復(fù)制代碼
使用:
const promisify = require('./promisify.js') const request = promisify(wx.request); request({ url: 'some URL' method: 'GET', }).then(res => { console.log(res) } 復(fù)制代碼
小程序上線(xiàn)需要經(jīng)過(guò)審核、發(fā)布兩個(gè)過(guò)程。 審核通過(guò)后有全量更新、或者分階段發(fā)布,小程序才會(huì)更新,首次發(fā)布沒(méi)有選項(xiàng)。
全量發(fā)布:即時(shí)向全量微信用戶(hù)發(fā)布新版小程序。 分階段發(fā)布:新版小程序?qū)⒃?5天內(nèi)以開(kāi)發(fā)者自定義比例,向微信用戶(hù)發(fā)布更新 詳情見(jiàn)知乎: 發(fā)布小程序時(shí)選擇全量發(fā)布和分階段發(fā)布是什么意思?
不得不說(shuō)小程序?qū)徍怂俣仁欠浅?斓模幢闶莻€(gè)人申請(qǐng)(相比以企業(yè)賬號(hào)申請(qǐng)會(huì)有應(yīng)用服務(wù)類(lèi)型限制),通常小程序沒(méi)有涉及政策不允許的內(nèi)容或者超過(guò)小程序允許的應(yīng)用服務(wù)類(lèi)型,都是可以順利通過(guò),初次體驗(yàn),即便在國(guó)慶期間,也是有工作團(tuán)隊(duì)進(jìn)行審核,審核時(shí)間通常在幾小時(shí)內(nèi)。
在開(kāi)發(fā)這個(gè)小程序時(shí),微信小程序只支持頁(yè)面級(jí)開(kāi)發(fā),如今小程序已支持組件開(kāi)發(fā)和插件開(kāi)發(fā)。組件的結(jié)構(gòu)和頁(yè)面并無(wú)區(qū)別,自定義組件可以引入其他的組件,具體的開(kāi)發(fā)步驟可以參考這邊文章 【微信小程序】自定義組件
小程序的興起使得前端開(kāi)發(fā)又多了一個(gè)工作任務(wù),但這也使得前端程序員的成就感越來(lái)越強(qiáng),當(dāng)然沒(méi)有經(jīng)歷過(guò)瀏覽器刀耕火種年代的工程師難以體會(huì)這種辛酸,但也沒(méi)必要,只要跟上時(shí)代的潮流和注重自身的基礎(chǔ)建設(shè)便已足夠了,前端路途艱辛,我在路上與你共勉。