微信小程序開發(fā)基礎(chǔ)知識(shí)總結(jié)

微信小程序在無論在功能聋呢、文檔及相關(guān)支持方面梨睁,都是優(yōu)于前面幾種微信賬號(hào)類型鳞陨,它提供了很多原生程序才有的接口,使得我們的小程序在很多方面突破H5頁面應(yīng)用的限制洛巢,更加接近原生程序的功能括袒,因此微信小程序具有很大的前景想象力。它提供了自己的視圖層描述語言 WXML 和 WXSS稿茉,以及基于 JavaScript 的邏輯層框架箱熬,并在視圖層與邏輯層間提供了數(shù)據(jù)傳輸和事件系統(tǒng),可以讓開發(fā)者可以方便的聚焦于數(shù)據(jù)與邏輯上狈邑。

1、小程序的目錄結(jié)構(gòu)

小程序的目錄結(jié)構(gòu)如下所示蚤认。



其中項(xiàng)目級(jí)別的的文件包括 app.js米苹、app.json、app.wxss 這三個(gè)砰琢。其中.js
后綴的是腳本文件蘸嘶,.json
后綴的文件是配置文件,.wxss
后綴的是樣式表文件陪汽。
頁面級(jí)別可以包含很多個(gè)頁面训唱,如index,detail等頁面挚冤,每個(gè)頁面都包含.js况增,.json,.wxml训挡,.wxss這些文件澳骤,其中.wxml為頁面視圖文件,是自定義標(biāo)簽的HTML頁面澜薄。
app.js是小程序的腳本代碼为肮。我們可以在這個(gè)文件中監(jiān)聽并處理小程序的生命周期函數(shù)、聲明全局變量肤京,可以調(diào)用框架提供的豐富的 API颊艳。
app.json 是對(duì)整個(gè)小程序的全局配置。我們可以在這個(gè)文件中配置小程序是由哪些頁面組成忘分,配置小程序的窗口?背景色棋枕,配置導(dǎo)航條樣式,配置默認(rèn)標(biāo)題饭庞。
app.wxss 是整個(gè)小程序的公共樣式表戒悠。我們可以在頁面組件的 class 屬性上直接使用 app.wxss 中聲明的樣式規(guī)則。
一個(gè)小程序主體部分由三個(gè)文件組成舟山,必須放在項(xiàng)目的根目錄绸狐。


微信小程序中的每一個(gè)頁面的【路徑+頁面名】都需要寫在 app.json 的 pages 中卤恳,且 pages 中的第一個(gè)頁面是小程序的首頁。
每一個(gè)小程序頁面是由同路徑下同名的四個(gè)不同后綴文件的組成寒矿,如:index.js突琳、index.wxml、index.wxss符相、index.json拆融。.js
后綴的文件是腳本文件,.json
后綴的文件是配置文件啊终,.wxss
后綴的是樣式表文件镜豹,.wxml
后綴的文件是頁面結(jié)構(gòu)文件。
index.json 是頁面的配置文件:頁面的配置文件是非必要的蓝牲。當(dāng)有頁面的配置文件時(shí)趟脂,配置項(xiàng)在該頁面會(huì)覆蓋 app.json 的 window 中相同的配置項(xiàng)。如果沒有指定的頁面配置文件例衍,則在該頁面直接使用 app.json 中的默認(rèn)配置昔期。


邏輯層(App Service)
小程序開發(fā)框架的邏輯層是由JavaScript編寫。
邏輯層將數(shù)據(jù)進(jìn)行處理后發(fā)送給視圖層佛玄,同時(shí)接受視圖層的事件反饋硼一。 在 JavaScript 的基礎(chǔ)上,我們做了一些修改梦抢,以方便地開發(fā)小程序般贼。
增加 AppPage 方法,進(jìn)行程序和頁面的注冊(cè)惑申。
增加 getApp 和 getCurrentPages 方法具伍,分別用來獲取 App 實(shí)例和當(dāng)前頁面棧。
提供豐富的 API圈驼,如微信用戶數(shù)據(jù)人芽,掃一掃,支付等微信特有能力绩脆。
每個(gè)頁面有獨(dú)立的作用域萤厅,并提供模塊化能力。
由于框架并非運(yùn)行在瀏覽器中靴迫,所以 JavaScript 在 web 中一些能力都無法使用惕味,如 document,window 等玉锌。
開發(fā)者寫的所有代碼最終將會(huì)打包成一份 JavaScript名挥,并在小程序啟動(dòng)的時(shí)候運(yùn)行,直到小程序銷毀主守。類似 ServiceWorker禀倔,所以邏輯層也稱之為 App Service榄融。

視圖層
框架的視圖層由 WXML 與 WXSS 編寫,由組件來進(jìn)行展示救湖。
將邏輯層的數(shù)據(jù)反應(yīng)成視圖愧杯,同時(shí)將視圖層的事件發(fā)送給邏輯層。
WXML(WeiXin Markup language)用于描述頁面的結(jié)構(gòu)鞋既。
WXSS(WeiXin Style Sheet)用于描述頁面的樣式力九。
組件(Component)是視圖的基本組成單元。

基礎(chǔ)組件
框架為開發(fā)者提供了一系列基礎(chǔ)組件邑闺,開發(fā)者可以通過組合這些基礎(chǔ)組件進(jìn)行快速開發(fā)跌前。
什么是組件:
組件是視圖層的基本組成單元。
組件自帶一些功能與微信風(fēng)格的樣式陡舅。
一個(gè)組件通常包括開始標(biāo)簽
和結(jié)束標(biāo)簽
舒萎,屬性
用來修飾這個(gè)組件,內(nèi)容
在兩個(gè)標(biāo)簽之內(nèi)蹭沛。

<tagname property="value">
  Content goes here ...
</tagename>

注意:所有組件與屬性都是小寫,以連字符-連接

API

框架提供豐富的微信原生API章鲤,可以方便的調(diào)起微信提供的能力摊灭,如獲取用戶信息,本地存儲(chǔ)败徊,支付功能等帚呼。

說明:

wx.on 開頭的 API 是監(jiān)聽某個(gè)事件發(fā)生的API接口,接受一個(gè) CALLBACK 函數(shù)作為參數(shù)皱蹦。當(dāng)該事件觸發(fā)時(shí)煤杀,會(huì)調(diào)用 CALLBACK 函數(shù)。
如未特殊約定沪哺,其他 API 接口都接受一個(gè)OBJECT作為參數(shù)沈自。
OBJECT中可以指定success, fail, complete來接收接口調(diào)用結(jié)果。
參數(shù)名 類型 必填 說明
success Function 否 接口調(diào)用成功的回調(diào)函數(shù)
fail Function 否 接口調(diào)用失敗的回調(diào)函數(shù)
complete Function 否 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功辜妓、失敗都會(huì)執(zhí)行)

2枯途、小程序接口功能列表

框架提供豐富的微信原生API,可以方便的調(diào)起微信提供的能力籍滴,如獲取用戶信息酪夷,本地存儲(chǔ),支付功能等孽惰。

1)網(wǎng)絡(luò) API 列表:
wx.request 發(fā)起網(wǎng)絡(luò)請(qǐng)求
wx.uploadFile 上傳文件
wx.downloadFile 下載文件
wx.connectSocket 創(chuàng)建 WebSocket 連接
wx.onSocketOpen 監(jiān)聽 WebSocket 打開
wx.onSocketError 監(jiān)聽 WebSocket 錯(cuò)誤
wx.sendSocketMessage 發(fā)送 WebSocket 消息
wx.onSocketMessage 接受 WebSocket 消息
wx.closeSocket 關(guān)閉 WebSocket 連接
wx.onSocketClose 監(jiān)聽 WebSocket 關(guān)閉

2)媒體 API 列表:
wx.chooseImage 從相冊(cè)選擇圖片晚岭,或者拍照
wx.previewImage 預(yù)覽圖片
wx.startRecord 開始錄音
wx.stopRecord 結(jié)束錄音
wx.playVoice 播放語音
wx.pauseVoice 暫停播放語音
wx.stopVoice 結(jié)束播放語音
wx.getBackgroundAudioPlayerState 獲取音樂播放狀態(tài)
wx.playBackgroundAudio 播放音樂
wx.pauseBackgroundAudio 暫停播放音樂
wx.seekBackgroundAudio 控制音樂播放進(jìn)度
wx.stopBackgroundAudio 停止播放音樂
wx.onBackgroundAudioPlay 監(jiān)聽音樂開始播放
wx.onBackgroundAudioPause 監(jiān)聽音樂暫停
wx.onBackgroundAudioStop 監(jiān)聽音樂結(jié)束
wx.chooseVideo 從相冊(cè)選擇視頻,或者拍攝

3)文件 API 列表:
wx.saveFile 保存文件
wx.getSavedFileList 獲取已保存的文件列表
wx.getSavedFileInfo 獲取已保存的文件信息
wx.removeSavedFile 刪除已保存的文件信息
wx.openDocument 打開文件

4)數(shù)據(jù) API 列表:
wx.getStorage 獲取本地?cái)?shù)據(jù)緩存
wx.getStorageSync 獲取本地?cái)?shù)據(jù)緩存
wx.setStorage 設(shè)置本地?cái)?shù)據(jù)緩存
wx.setStorageSync 設(shè)置本地?cái)?shù)據(jù)緩存
wx.getStorageInfo 獲取本地緩存的相關(guān)信息
wx.getStorageInfoSync 獲取本地緩存的相關(guān)信息
wx.removeStorage 刪除本地緩存內(nèi)容
wx.removeStorageSync 刪除本地緩存內(nèi)容
wx.clearStorage 清理本地?cái)?shù)據(jù)緩存
wx.clearStorageSync 清理本地?cái)?shù)據(jù)緩存

5)位置 API 列表:
wx.getLocation 獲取當(dāng)前位置
wx.chooseLocation 打開地圖選擇位置
wx.openLocation 打開內(nèi)置地圖
wx.createMapContext 地圖組件控制

6)設(shè)備 API 列表:
wx.getNetworkType 獲取網(wǎng)絡(luò)類型
wx.onNetworkStatusChange 監(jiān)聽網(wǎng)絡(luò)狀態(tài)變化
wx.getSystemInfo 獲取系統(tǒng)信息
wx.getSystemInfoSync 獲取系統(tǒng)信息
wx.onAccelerometerChange 監(jiān)聽加速度數(shù)據(jù)
wx.startAccelerometer 開始監(jiān)聽加速度數(shù)據(jù)
wx.stopAccelerometer 停止監(jiān)聽加速度數(shù)據(jù)
wx.onCompassChange 監(jiān)聽羅盤數(shù)據(jù)
wx.startCompass 開始監(jiān)聽羅盤數(shù)據(jù)
wx.stopCompass 停止監(jiān)聽羅盤數(shù)據(jù)
wx.setClipboardData 設(shè)置剪貼板內(nèi)容
wx.getClipboardData 獲取剪貼板內(nèi)容
wx.makePhoneCall 撥打電話
wx.scanCode 掃碼

7)界面 API 列表:
wx.showToast 顯示提示框
wx.showLoading 顯示加載提示框
wx.hideToast 隱藏提示框
wx.hideLoading 隱藏提示框
wx.showModal 顯示模態(tài)彈窗
wx.showActionSheet 顯示菜單列表
wx.setNavigationBarTitle 設(shè)置當(dāng)前頁面標(biāo)題
wx.showNavigationBarLoading 顯示導(dǎo)航條加載動(dòng)畫
wx.hideNavigationBarLoading 隱藏導(dǎo)航條加載動(dòng)畫
wx.navigateTo 新窗口打開頁面
wx.redirectTo 原窗口打開頁面
wx.switchTab 切換到 tabbar 頁面
wx.navigateBack 退回上一個(gè)頁面
wx.createAnimation 動(dòng)畫
wx.createContext 創(chuàng)建繪圖上下文
wx.drawCanvas 繪圖
wx.stopPullDownRefresh 停止下拉刷新動(dòng)畫

8)WXML節(jié)點(diǎn)信息 API 列表:
wx.createSelectorQuery 創(chuàng)建查詢請(qǐng)求
selectorQuery.select 根據(jù)選擇器選擇單個(gè)節(jié)點(diǎn)
selectorQuery.selectAll 根據(jù)選擇器選擇全部節(jié)點(diǎn)
selectorQuery.selectViewport 選擇顯示區(qū)域
nodesRef.boundingClientRect 獲取布局位置和尺寸
nodesRef.scrollOffset 獲取滾動(dòng)位置
nodesRef.fields 獲取任意字段
selectorQuery.exec 執(zhí)行查詢請(qǐng)求

9)開放接口:
wx.login 登錄
wx.getUserInfo 獲取用戶信息
wx.chooseAddress 獲取用戶收貨地址
wx.requestPayment 發(fā)起微信支付
wx.addCard 添加卡券
wx.openCard 打開卡券

3勋功、相關(guān)處理代碼

1)注冊(cè)程序處理代碼

App({
  onLaunch: function(options) {
    // Do something initial when launch.
  },
  onShow: function(options) {
      // Do something when show.
  },
  onHide: function() {
      // Do something when hide.
  },
  onError: function(msg) {
    console.log(msg)
  },
  globalData: 'I am global data'
})

2)注冊(cè)頁面處理代碼

//index.js
Page({
  data: {
    text: "This is page data."
  },
  onLoad: function(options) {
    // Do some initialize when page load.
  },
  onReady: function() {
    // Do something when page ready.
  },
  onShow: function() {
    // Do something when page show.
  },
  onHide: function() {
    // Do something when page hide.
  },
  onUnload: function() {
    // Do something when page close.
  },
  onPullDownRefresh: function() {
    // Do something when pull down.
  },
  onReachBottom: function() {
    // Do something when page reach bottom.
  },
  onShareAppMessage: function () {
   // return custom share data when user share.
  },
  onPageScroll: function() {
    // Do something when page scroll
  },
  // Event handler.
  viewTap: function() {
    this.setData({
      text: 'Set some data for updating view.'
    })
  },
  customData: {
    hi: 'MINA'
  }
})

3)JS函數(shù)模塊化

// common.js
function sayHello(name) {
  console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
  console.log(`Goodbye ${name} !`)
}

module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye

在需要使用這些模塊的文件中坦报,使用 require(path) 將公共代碼引入

var common = require('common.js')
Page({
  helloMINA: function() {
    common.sayHello('MINA')
  },
  goodbyeMINA: function() {
    common.sayGoodbye('MINA')
  }
})

4)網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求處理代碼

//點(diǎn)擊搜索按鈕調(diào)用的函數(shù)
  search:function(e){
    var that = this;

    //數(shù)據(jù)加載完成之前库说,顯示加載中提示框
    wx.showToast({
      title: '加載中。燎竖。璃弄。',
      icon: 'loading',
      duration: 10000
    });

    //發(fā)起請(qǐng)求,注意 wx.request發(fā)起的是 HTTPS 請(qǐng)求
    wx.request({
      url: url + "?city=" + that.data.inputValue + "&key=" + apiKey,
      data: {},
      header: {
          'content-type': 'application/json'
      },
      success: function(res) {
        var data = res.data;
        //將數(shù)據(jù)從邏輯層發(fā)送到視圖層构回,同時(shí)改變對(duì)應(yīng)的 this.data 的值
        that.setData({
          restation: data.result,
          condition: false
        });
        //數(shù)據(jù)加載成功后隱藏加載中彈框
        wx.hideToast();
      }
    })

  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夏块,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纤掸,更是在濱河造成了極大的恐慌脐供,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件借跪,死亡現(xiàn)場(chǎng)離奇詭異政己,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掏愁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門歇由,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人果港,你說我怎么就攤上這事沦泌。” “怎么了辛掠?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵谢谦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我萝衩,道長(zhǎng)回挽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任猩谊,我火速辦了婚禮千劈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牌捷。我一直安慰自己队塘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布宜鸯。 她就那樣靜靜地躺著憔古,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淋袖。 梳的紋絲不亂的頭發(fā)上鸿市,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼陌凳。 笑死内舟,一個(gè)胖子當(dāng)著我的面吹牛验游,可吹牛的內(nèi)容都是我干的耕蝉。 我是一名探鬼主播垒在,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼谈为,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼踢关!你這毒婦竟也來了耘成?” 一聲冷哼從身側(cè)響起驹闰,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤师妙,失蹤者是張志新(化名)和其女友劉穎默穴,沒想到半個(gè)月后褪秀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媒吗,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锯岖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年遇伞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸠珠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跳芳。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖次乓,靈堂內(nèi)的尸體忽然破棺而出票腰,到底是詐尸還是另有隱情杏慰,我是刑警寧澤轰胁,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站榛斯,受9級(jí)特大地震影響驮俗,放射性物質(zhì)發(fā)生泄漏意述。R本人自食惡果不足惜荤崇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一倚喂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舱权,春花似錦宴倍、人聲如沸鸵贬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春率寡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倚搬。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工冶共, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓捅僵,卻偏偏與公主長(zhǎng)得像家卖,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庙楚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 微信小程序在無論在功能上荡、文檔及相關(guān)支持方面,都是優(yōu)于前面幾種微信賬號(hào)類型馒闷,它提供了很多原生程序才有的接口酪捡,使得我們...
    未央大佬閱讀 2,290評(píng)論 0 12
  • 1.小程序起步 (1)點(diǎn)擊https://mp.weixin.qq.com/wxopen/waregister?a...
    GXW_Lyon閱讀 3,313評(píng)論 0 0
  • 因新工作主要負(fù)責(zé)微信小程序這一塊逛薇,最近的重心就移到這一塊,該博客是對(duì)微信小程序整體的整理歸納以及標(biāo)明一些細(xì)節(jié)點(diǎn)疏虫,初...
    majun00閱讀 7,315評(píng)論 0 9
  • 最近做了一個(gè)投票的微信小程序永罚,開發(fā)過程主要還是參考官方文檔:https://mp.weixin.qq.com/de...
    june5253閱讀 21,976評(píng)論 1 11
  • 今天我們上了泰山,在上山之前议薪,我們了解到原來泰山有兩個(gè)門尤蛮,一個(gè)是紅門,一個(gè)是天外村斯议。 據(jù)我所知产捞,紅門是憑借自己的力...
    博的天空閱讀 350評(píng)論 0 0