微信小程序入門:js文件詳解

前言:

上一篇文章我們介紹了.wxml和.wxss文件盅称,這篇文章對(duì)js文件進(jìn)行詳細(xì)的講解肩祥,首先貼上一個(gè)簡(jiǎn)單的js文件:

示例代碼:

//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.

},

//?Event?handler.

viewTap:function(){

this.setData({

text:'Set?some?data?for?updating?view.'

})

},

customData:?{

hi:'MINA'

}

})

在之前解析的app.js文件中,里面又一個(gè)App()函數(shù) 而在每個(gè)界面的js文件中有一個(gè)Page()函數(shù)缩膝。

Page

Page()函數(shù)用來注冊(cè)一個(gè)頁(yè)面混狠。接受一個(gè) object 參數(shù),其指定頁(yè)面的初始數(shù)據(jù)疾层、生命周期函數(shù)将饺、事件處理函數(shù)等。

object 參數(shù)說明:

屬性類型描述

dataObject頁(yè)面的初始數(shù)據(jù)

onLoadFunction生命周期函數(shù)--監(jiān)聽頁(yè)面加載

onReadyFunction生命周期函數(shù)--監(jiān)聽頁(yè)面初次渲染完成

onShowFunction生命周期函數(shù)--監(jiān)聽頁(yè)面顯示

onHideFunction生命周期函數(shù)--監(jiān)聽頁(yè)面隱藏

onUnloadFunction生命周期函數(shù)--監(jiān)聽頁(yè)面卸載

onPullDownRefreshFunction頁(yè)面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動(dòng)作

onReachBottomFunction頁(yè)面上拉觸底事件的處理函數(shù)

onShareAppMessageFunction用戶點(diǎn)擊右上角分享

其他Any開發(fā)者可以添加任意的函數(shù)或數(shù)據(jù)到 object 參數(shù)中痛黎,在頁(yè)面的函數(shù)中用this可以訪問

初始化數(shù)據(jù) data

初始化數(shù)據(jù)將作為頁(yè)面的第一次渲染予弧。data 將會(huì)以 JSON 的形式由邏輯層傳至渲染層,所以其數(shù)據(jù)必須是可以轉(zhuǎn)成 JSON 的格式:字符串舅逸,數(shù)字桌肴,布爾值,對(duì)象琉历,數(shù)組坠七。

渲染層可以通過WXML對(duì)數(shù)據(jù)進(jìn)行綁定。

示例代碼: 使用雙大括號(hào)包裹起來

{{text}}{{array[0].msg}}

Page({

data:?{

//data里面的數(shù)據(jù)類型只有這5中 最后一種object最常用 一般的json格式就是這樣的旗笔。 所以在獲取服務(wù)器數(shù)據(jù)的時(shí)候直接賦值給 object(但是記得定義哦彪置。)

text:'init?data', //字符串

array:?[{msg:'1'},?{msg:'2'}],//數(shù)組

age:18, ?//數(shù)字

hidden: false, ?//布爾

object: {

name: 'yuanxiao',

names: [

{ id: 1, age: 2 },

{ id: 2, age: 12 }]

//對(duì)象 注意這里面包含 其他任何的類型使用的時(shí)候只需要使用 {{ object.names }}

}

})

生命周期函數(shù)

onLoad: 頁(yè)面加載

一個(gè)頁(yè)面只會(huì)調(diào)用一次。

接收頁(yè)面參數(shù)可以獲取wx.navigateTo和wx.redirectTo及中的 query蝇恶。

onShow: 頁(yè)面顯示

每次打開頁(yè)面都會(huì)調(diào)用一次拳魁。

onReady: 頁(yè)面初次渲染完成

一個(gè)頁(yè)面只會(huì)調(diào)用一次,代表頁(yè)面已經(jīng)準(zhǔn)備妥當(dāng)撮弧,可以和視圖層進(jìn)行交互潘懊。

對(duì)界面的設(shè)置如wx.setNavigationBarTitle請(qǐng)?jiān)趏nReady之后設(shè)置。詳見生命周期

onHide: 頁(yè)面隱藏

當(dāng)navigateTo或底部tab切換時(shí)調(diào)用贿衍。

onUnload: 頁(yè)面卸載

當(dāng)redirectTo或navigateBack的時(shí)候調(diào)用授舟。

頁(yè)面相關(guān)事件處理函數(shù)

onPullDownRefresh: 下拉刷新

監(jiān)聽用戶下拉刷新事件。

需要在config的window選項(xiàng)中開啟enablePullDownRefresh贸辈。

當(dāng)處理完數(shù)據(jù)刷新后释树,wx.stopPullDownRefresh可以停止當(dāng)前頁(yè)面的下拉刷新。

onShareAppMessage: 用戶分享

只有定義了此事件處理函數(shù),右上角菜單才會(huì)顯示“分享”按鈕

用戶點(diǎn)擊分享按鈕的時(shí)候會(huì)調(diào)用

此事件需要 return 一個(gè) Object奢啥,用于自定義分享內(nèi)容

自定義分享字段

字段說明默認(rèn)值

title分享標(biāo)題當(dāng)前小程序名稱

path分享路徑當(dāng)前頁(yè)面 path 秸仙,必須是以 / 開頭的完整路徑

示例代碼

Page({

onShareAppMessage:function(){

return{

title:'自定義分享標(biāo)題',

path:'/page/user?id=123'

}

}

})

事件處理函數(shù)

除了初始化數(shù)據(jù)和生命周期函數(shù),Page 中還可以定義一些特殊的函數(shù):事件處理函數(shù)桩盲。在渲染層可以在組件中加入事件綁定寂纪,當(dāng)達(dá)到觸發(fā)事件時(shí),就會(huì)執(zhí)行 Page 中定義的事件處理函數(shù)正驻。

示例代碼:

click me

Page({

viewTap:function(){

console.log('view?tap')

}

})

Page.prototype.setData()

setData函數(shù)用于將數(shù)據(jù)從邏輯層發(fā)送到視圖層弊攘,同時(shí)改變對(duì)應(yīng)的this.data的值。

注意:

直接修改 this.data 無效姑曙,無法改變頁(yè)面的狀態(tài)襟交,還會(huì)造成數(shù)據(jù)不一致。

單次設(shè)置的數(shù)據(jù)不能超過1024kB伤靠,請(qǐng)盡量避免一次設(shè)置過多的數(shù)據(jù)捣域。

setData() 參數(shù)格式

接受一個(gè)對(duì)象,以 key宴合,value 的形式表示將 this.data 中的 key 對(duì)應(yīng)的值改變成 value焕梅。

其中 key 可以非常靈活,以數(shù)據(jù)路徑的形式給出卦洽,如array[2].message贞言,a.b.c.d,并且不需要在 this.data 中預(yù)先定義阀蒂。

示例代碼:

{{text}}Change normal data{{array[0].text}}Change Array data{{object.text}}Change Object data{{newField.text}}Add new data

//index.js

Page({

data:?{

text:'init?data',

array:?[{text:'init?data'}],

object:?{

text:'init?data'

}

},

changeText:function(){

//?this.data.text?=?'changed?data'? //?bad,?it?can?not?work

this.setData({

text:'changed?data'

})

},

changeItemInArray:function(){

//?you?can?use?this?way?to?modify?a?danamic?data?path

this.setData({

'array[0].text':'changed?data'

})

},

changeItemInObject:function(){

this.setData({

'object.text':'changed?data'

});

},

addNewField:function(){

this.setData({

'newField.text':'new?data'

})

}

})

最后還是提醒一個(gè)關(guān)于setData的細(xì)節(jié)该窗,一般的都是:this.setData({ ?text:"cyx" ?})

但是這里有個(gè)問題就是this的作用域:

this的作用域在Page()函數(shù)內(nèi)部 可以來看看下面的這個(gè)demo:

wxml文件:

{{text}}

修改text信息

js文件:

bind:function(){

wx.getSystemInfo({

success: function(res) {

this.setData({

text:res.model

})

}

})

}

這個(gè)看起來其實(shí)是沒有問題的,但是當(dāng)我們點(diǎn)擊這個(gè)button的時(shí)候蚤霞,報(bào)錯(cuò)了:


但是為什么會(huì)說 this.setData沒有定義呢酗失?

首先這是在wx.getSystemInfo內(nèi)部的回調(diào)方法 那么這個(gè)this就會(huì)代表這個(gè)回調(diào)方法,但是這個(gè)回掉方法中并沒有setData這個(gè)方法昧绣,

所以就出現(xiàn)了上面的方法未定義:

正確的寫法是:


我們首先把this賦值給that规肴,在wx.getSystemInfo內(nèi)部,我們使用that 那么就不會(huì)出現(xiàn)超出this的作用域范圍了夜畴。

頁(yè)面棧

框架以棧的形式維護(hù)了當(dāng)前的所有頁(yè)面拖刃。 當(dāng)發(fā)生路由切換的時(shí)候,頁(yè)面棧的表現(xiàn)如下:

路由方式頁(yè)面棧表現(xiàn)

初始化新頁(yè)面入棧

打開新頁(yè)面新頁(yè)面入棧

頁(yè)面重定向當(dāng)前頁(yè)面出棧贪绘,新頁(yè)面入棧

頁(yè)面返回頁(yè)面不斷出棧序调,直到目標(biāo)返回頁(yè),新頁(yè)面入棧

Tab 切換頁(yè)面全部出棧兔簇,只留下新的 Tab 頁(yè)面

頁(yè)面的路由

在小程序中所有頁(yè)面的路由全部由框架進(jìn)行管理,對(duì)于路由的觸發(fā)方式以及頁(yè)面生命周期函數(shù)如下:

路由方式觸發(fā)時(shí)機(jī)路由后頁(yè)面路由前頁(yè)面

初始化小程序打開的第一個(gè)頁(yè)面onLoad,onShow

打開新頁(yè)面調(diào)用 APIwx.navigateTo或使用組件onLoad垄琐,onShowonHide

頁(yè)面重定向調(diào)用 APIwx.redirectTo或使用組件onLoad边酒,onShowonUnload

頁(yè)面返回調(diào)用 APIwx.navigateBack或用戶按左上角返回按鈕onShowonUnload(多層頁(yè)面返回每個(gè)頁(yè)面都會(huì)按順序觸發(fā)onUnload)

Tab 切換調(diào)用 APIwx.switchTab或使用組件或用戶切換 Tab

各種情況請(qǐng)參考下表

Tab 切換對(duì)應(yīng)的生命周期(以 A、B 頁(yè)面為 Tabbar 頁(yè)面狸窘,C 是從 A 頁(yè)面打開的頁(yè)面墩朦,D 頁(yè)面是從 C 頁(yè)面打開的頁(yè)面為例):

當(dāng)前頁(yè)面路由后頁(yè)面觸發(fā)的生命周期(按順序)

A ? ? ? ? ? ? ? A ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Nothing happend

A ? ? ? ? ? ? ? B ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A.onHide(), B.onLoad(), B.onShow()

A ? ? ? ? ? ? ? ?B(再次打開) ? ? ? ? ? ? ? A.onHide(), B.onShow()

C ? ? ? ? ? ? ? ? A ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? C.onUnload(), A.onShow()

C ? ? ? ? ? ? ? ? B ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?C.onUnload(), B.onLoad(), B.onShow()

D ? ? ? ? ? ? ? ? ?B ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?D.onUnload(), C.onUnload(), B.onLoad(), B.onShow()

D(從分享進(jìn)入)A ? ? ? ? ? ? ? ? ? ? ? ? ? ? D.onUnload(), A.onLoad(), A.onShow()

D(從分享進(jìn)入)B ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?D.onUnload(), B.onLoad(), B.onShow()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翻擒,隨后出現(xiàn)的幾起案子氓涣,更是在濱河造成了極大的恐慌,老刑警劉巖陋气,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳吠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巩趁,警方通過查閱死者的電腦和手機(jī)痒玩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來议慰,“玉大人蠢古,你說我怎么就攤上這事”鸢迹” “怎么了草讶?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)炉菲。 經(jīng)常有香客問我堕战,道長(zhǎng),這世上最難降的妖魔是什么颁督? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任践啄,我火速辦了婚禮,結(jié)果婚禮上沉御,老公的妹妹穿的比我還像新娘屿讽。我一直安慰自己,他們只是感情好吠裆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布伐谈。 她就那樣靜靜地躺著,像睡著了一般试疙。 火紅的嫁衣襯著肌膚如雪诵棵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天祝旷,我揣著相機(jī)與錄音履澳,去河邊找鬼嘶窄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛距贷,可吹牛的內(nèi)容都是我干的柄冲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼忠蝗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼现横!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阁最,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤戒祠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后速种,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姜盈,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年哟旗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贩据。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闸餐,死狀恐怖饱亮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舍沙,我是刑警寧澤近上,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拂铡,受9級(jí)特大地震影響壹无,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜感帅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一斗锭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧失球,春花似錦岖是、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至黔牵,卻和暖如春聪轿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猾浦。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工陆错, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灯抛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓音瓷,卻偏偏與公主長(zhǎng)得像牧愁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子外莲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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