微信小程序(導(dǎo)航田巴、傳參、生命周期挟秤、WXS腳本)


一壹哺、頁面導(dǎo)航

頁面導(dǎo)航指的是頁面之間的相互跳轉(zhuǎn)。例如艘刚,瀏覽器中實現(xiàn)頁面導(dǎo)航的方式有如下兩種:

  • <a>鏈接管宵。
  • locaton.href。
    小程序中實現(xiàn)頁面導(dǎo)航的兩種方式:
  • 聲明式導(dǎo)航
    在頁面上聲明一個<navigator>導(dǎo)航組件通過點擊 <navigator> 組件實現(xiàn)頁面跳轉(zhuǎn)攀甚。
  • 編程式導(dǎo)航
    調(diào)用小程序的導(dǎo)航 API箩朴,實現(xiàn)頁面的跳轉(zhuǎn)。
1.1秋度、導(dǎo)航到 tabBar 頁面

tabBar 頁面指的是被配置為 tabBar 的頁面炸庞。
在使用 <navigator>組件跳轉(zhuǎn)到指定的 tabBar 頁面時,需要指定 url屬性和 open-type 屬性静陈,其中:

  • url 表示要跳轉(zhuǎn)的頁面的地址燕雁,必須以/開頭
  • open-type 表示跳轉(zhuǎn)的方式,必須為switchTab
<navigator url="/pages/home/home" open-type="switchTab">導(dǎo)航到首頁</navigator>

調(diào)用 wx.switchTab(0bject object)方法鲸拥,可以跳轉(zhuǎn)到 tabBar 頁面。

<!--頁面結(jié)構(gòu)-->
<button bindtap="gotoHome">跳轉(zhuǎn)到首頁</button>
  //通過編程式導(dǎo)航 跳轉(zhuǎn)到首頁
  gotoHome(){
   wx.switchTab({
     url: '/pages/home/home',
   })
},

其中 0bject 參數(shù)對象的屬性列表如下:


image.png
1.2僧免、導(dǎo)航到非 tabBar 頁面

非 tabBar 頁面指的是沒有被配置為 tabBar 的頁面刑赶。
在使用<navigator>組件跳轉(zhuǎn)到普通的非 tabBar 頁面時,則需要指定 url屬性和 open-type 屬性懂衩,其中:

  • url 表示要跳轉(zhuǎn)的頁面的地址撞叨,必須以/開頭。
  • open-type 表示跳轉(zhuǎn)的方式浊洞,為navigate牵敷。
  • open-type也可以省略不寫。
<navigator url="/pages/info/info" open-type="navigate">導(dǎo)航到info頁面</navigator>
<navigator url="/pages/info/info">導(dǎo)航到info頁面</navigator>

調(diào)用 wx.navigateTo(0bject object)方法法希,可以跳轉(zhuǎn)到非 tabBar 的頁面枷餐。

<!--頁面結(jié)構(gòu)-->
<button bindtap="gotoInfo">跳轉(zhuǎn)到info頁面</button>
 //通過編程式導(dǎo)航 跳轉(zhuǎn)到info頁面
gotoInfo(){
    wx.navigateTo({
      url: '/pages/info/info',
    })
},

其中 0bject 參數(shù)對象的屬性列表參考上圖。

1.3苫亦、后退導(dǎo)航

如果要后退到上一頁面或多級頁面毛肋,則需要指定 open-type 屬性和 delta 屬性,其中:

  • open-type 的值必須是 navigateBack屋剑,表示要進行后退導(dǎo)航润匙。
  • delta 的值必須是數(shù)字,表示要后退的層級唉匾。
    為了簡便孕讳,如果只是后退到上一頁面,則可以省略 delta 屬性,因為其默認(rèn)值就是1厂财。
<navigator open-type="navigateBack" delta="1">返回上一頁</navigator>

調(diào)用 wx.navigateBack(0bject object)方法芋簿,可以返回上一頁面或多級頁面。

<!--頁面結(jié)構(gòu)-->
<button bind:tap="goBack">返回上一頁</button>
  //通過編程式導(dǎo)航 返回上一頁
  goBack(){
    wx.navigateBack()
},

其中 0bject 參數(shù)對象的屬性列表如下:


image.png

二蟀苛、導(dǎo)航傳參

navigator 組件的 url屬性用來指定將要跳轉(zhuǎn)到的頁面的路徑益咬。同時,路徑的后面還可以攜帶參數(shù):

  • 參數(shù)與路徑之間使用?分隔
  • 參數(shù)鍵與參數(shù)值用=相連
  • 不同參數(shù)用 &分隔
<navigator url="/pages/info/info?name=zs&age=18">導(dǎo)航到info頁面</navigator>
 //通過編程式導(dǎo)航 跳轉(zhuǎn)到info頁面并傳參
gotoInfo(){
    wx.navigateTo({
      url: '/pages/info/info?name=ls&age=20',
    })
},
2.1帜平、在 onLoad 中接收導(dǎo)航參數(shù)

通過聲明式導(dǎo)航傳參或編程式導(dǎo)航傳參所攜帶的參數(shù)幽告,可以直接在 onLoad 事件中直接獲取到,示例代碼如下:

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面加載
   */
  onLoad(options) {
    // options 就是導(dǎo)航傳遞過來的參數(shù)對象
    console.log(options)
    this.setData({
        query:options
    })
  },

  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {
    //掛載導(dǎo)航傳遞參數(shù)對象
    query:{}
  },
image.png

三裆甩、頁面事件

3.1冗锁、下拉刷新

下拉刷新是移動端的專有名詞,指的是通過手指在屏幕上的下拉滑動操作嗤栓,從而重新加載頁面數(shù)據(jù)的行為冻河。

3.1.1、啟用下拉刷新
  • 全局開啟下拉刷新
    在 app.json 的 window節(jié)點中茉帅,將enablePullDownRefresh 設(shè)置為 true局部開啟下拉刷新叨叙。
  • 局部開啟下拉刷新
    在頁面的 .json 配置文件中,將 enablePullDownRefresh 設(shè)置為 true
3.1.2堪澎、配置下拉刷新窗口的樣式

在全局或頁面的 .json 配置文件中擂错,通過 backgroundColor 和 backgroundTextstyle 來配置下拉刷新窗口的樣式,其中:

  • backgroundcolor用來配置下拉刷新窗口的背景顏色,樱蛤,僅支持16 進制的顏色值钮呀。
  • backgroundTextstyle 用來配置下拉刷新 loading 的樣式,僅支持 dark 和 light昨凡。
{
  "usingComponents": {},
  "enablePullDownRefresh":true,
  "backgroundcolor":"#efefef",
  "backgroundTextstyle":"drak"
}
3.1.3爽醋、監(jiān)聽頁面的下拉刷新事件

在頁面的.js 文件中,通過 onPullDownRefresh()函數(shù)即可監(jiān)聽當(dāng)前頁面的下拉刷新事件便脊。

  /**
   * 頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作
   */
  onPullDownRefresh() {
    console.log("下拉刷新被觸發(fā)蚂四!")
  },
image.png
3.1.4、停止下拉刷新

當(dāng)處理完下拉刷新后就轧,下拉刷新的loading 效果會一直顯示证杭,不會主動消失,所以需要手動隱藏loading 效果妒御。此時解愤,調(diào)用 wx.stopPullDownRefresh()可以停止當(dāng)前頁面的下拉刷新。

 /**
   * 頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作
   */
  onPullDownRefresh() {
    console.log("下拉刷新被觸發(fā)乎莉!")

    //當(dāng)數(shù)據(jù)被重置后 調(diào)用此函數(shù) 關(guān)閉下拉刷新的效果
    wx.stopPullDownRefresh()
  },
3.2送讲、上拉觸底

上拉觸底是移動端的專有名詞奸笤,通過手指在屏幕上的上拉滑動操作,從而加載更多數(shù)據(jù)的行為哼鬓,實現(xiàn)數(shù)據(jù)的分頁监右。

3.2.1、監(jiān)聽頁面的上拉觸底事件

當(dāng)頁面高度超過屏幕高度時异希,在頁面的 .js 文件中健盒,通過 onReachBottom()函數(shù)即可監(jiān)聽當(dāng)前頁面的上拉觸底事件。示例代碼如下:

  /**
   * 頁面上拉觸底事件的處理函數(shù)
   */
  onReachBottom() {
  //當(dāng)數(shù)據(jù)被重置后 調(diào)用以下方法可以關(guān)閉下拉刷新的效果
    wx.stopPullDownRefresh()
  },
3.2.2称簿、配置上拉觸底距離

上拉觸底距離指的是觸發(fā)上拉觸底事件時扣癣,滾動條距離頁面底部的距離可以在全局或頁面的 .json 配置文件中,通過 onReachBottomDistance 屬性來配置上拉觸底的距離(默認(rèn)距離為50px)憨降。

{
  "usingComponents": {},
  "enablePullDownRefresh":true,
  "backgroundcolor":"#efefef",
  "backgroundTextstyle":"drak",
  "onReachBottomDistance":100
}
3.3.3父虑、上拉觸底節(jié)流處理

通過節(jié)流閥的方式,控制數(shù)據(jù)加載授药。

  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {
   isLoading:false,
   listValue:[]
  },


getList(){
    this.setData({isLoading:true})
    wx.showLoading({title: '數(shù)據(jù)加載中...',})
    wx.request({
      url: 'https://127.0.0.1/9191/list',
      method:'GET',
      data:{},
      success:(res)=>{
         this.setData({
             listValue:[...this.data.listValue,...res.data]
         })
      },
      complete:()=>{
        wx.hideLoading()
        this.setData({isLoading:false})
      }
    })
},

/**
   * 頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作
   */
  onPullDownRefresh() {
    if(this.data.isLoading) return
    this.getList()
  },

四士嚎、生命周期

生命周期(Life Cycle)是指一個對象從創(chuàng)建 ->運行 ->銷毀的整個階段,強調(diào)的是一個時間段悔叽。
我們可以把每個小程序運行的過程莱衩,概括為生命周期:

  • 小程序的啟動,表示生命周期的開始娇澎。
  • 小程序的關(guān)閉膳殷,表示生命周期的結(jié)束。
  • 中間小程序運行的過程九火,就是小程序的生命周期。
4.2册招、生命周期的分類

在小程序中岔激,生命周期分為兩類,分別是:

  • 應(yīng)用生命周期
    特指小程序從啟動 ->運行->銷毀的過程是掰。
  • 頁面生命周期
    特指小程序中虑鼎,每個頁面的加載 ->渲染->銷毀的過程。


    image.png
4.3键痛、什么是生命周期函數(shù)

生命周期函數(shù):是由小程序框架提供的內(nèi)置函數(shù)炫彩,會伴隨著生命周期,自動按次序執(zhí)行絮短。
生命周期函數(shù)的作用:允許程序員在特定的時間點江兢,執(zhí)行某些特定的操作。例如丁频,頁面剛加載的時候杉允,可以在onLoad 生命周期函數(shù)中初始化頁面的數(shù)據(jù)邑贴。

  • 注意
    生命周期強調(diào)的是時間段,生命周期函數(shù)強調(diào)的是時間點叔磷。
4.4拢驾、生命周期函數(shù)的分類

小程序中的生命周期函數(shù)分為兩類,分別是:

  • 應(yīng)用的生命周期函數(shù)
    特指小程序從啟動 ->運行 ->銷毀期間依次調(diào)用的那些函數(shù)改基。
  • 頁面的生命周期函數(shù)
    特指小程序中繁疤,每個頁面從加載 ->渲染->銷毀期間依次調(diào)用的那些函數(shù)。
4.5秕狰、應(yīng)用的生命周期函數(shù)

小程序的應(yīng)用生命周期函數(shù)需要在 app.js 中進行聲明稠腊。

// app.js
App({

  /**
   * 當(dāng)小程序初始化完成時,會觸發(fā) onLaunch(全局只觸發(fā)一次)
   */
  onLaunch: function () {
     //todo 可以在頁面初始化時讀取本地數(shù)據(jù) 
  },

  /**
   * 當(dāng)小程序啟動封恰,或從后臺進入前臺顯示麻养,會觸發(fā) onShow
   */
  onShow: function (options) {},

  /**
   * 當(dāng)小程序從前臺進入后臺,會觸發(fā) onHide
   */
  onHide: function () {},

  /**
   * 當(dāng)小程序發(fā)生腳本錯誤诺舔,或者 api 調(diào)用失敗時鳖昌,會觸發(fā) onError 并帶上錯誤信息
   */
  onError: function (msg) {}
})
4.6、頁面的生命周期函數(shù)

小程序的頁面生命周期函數(shù)需要在頁面的.js 文件中進行聲明低飒。

// pages.js
Page({

  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {},

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面加載
   */
  onLoad(options) {},

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
   */
  onReady() {},

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面顯示
   */
  onShow() {},

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面隱藏
   */
  onHide() {},

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面卸載
   */
  onUnload() {},

  /**
   * 頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作
   */
  onPullDownRefresh() {},

  /**
   * 頁面上拉觸底事件的處理函數(shù)
   */
  onReachBottom() {},

  /**
   * 用戶點擊右上角分享
   */
  onShareAppMessage() {}
})

五许昨、WXS 腳本

WXS(WeiXin Script)是小程序獨有的一套腳本語言,結(jié)合 WXML褥赊,可以構(gòu)建出頁面的結(jié)構(gòu)糕档。
wxml中無法調(diào)用在頁面的 .js 中定義的函數(shù),但是拌喉,wxml中可以調(diào)用 wxs 中定義的函數(shù)速那。因此,小程序中wxs 的典型應(yīng)用場景就是“過濾器”尿背。

5.1端仰、WXS和JavaScript 的關(guān)系

雖然 wXs 的語法類似于lavaScript,但是 wxs 和lavaScrint 是完全不同的兩種語言:

  • wxs 有自己的數(shù)據(jù)類型
    number 數(shù)值類型田藐、string 字符串類型荔烧、boolean 布爾類型、object 對象類型function 函數(shù)類型汽久、array 數(shù)組類型鹤竭、regexp 正則date 日期類型。
  • wxs 不支持類似于 ES6 及以上的語法形式
    不支持:let景醇、const臀稚、解構(gòu)賦值、展開運算符啡直、箭頭函數(shù)烁涌、對象屬性簡寫苍碟、etc...。
    支持:var定義變量撮执、普通 function 函數(shù)等類似于 ES5 的語法微峰。
  • wxs 遵循 commonls 規(guī)范
    module 對象。
    require()函數(shù)抒钱。
    module.exports 對象蜓肆。
5.2、內(nèi)嵌 WXS腳本

WXS 代碼可以編寫在 wxml文件中的<wxs>標(biāo)簽內(nèi)谋币,就像JavaScript 代碼可以編寫在 html文件中的<script>標(biāo)簽內(nèi)一樣仗扬。
wxml文件中的每個 <wxs></wxs>標(biāo)簽,必須提供 module 屬性蕾额,用來指定當(dāng)前 wxs 的模塊名稱早芭,方便在wxml中訪問模塊中的成員。

<view>{{m.toUpper(username)}}</view>

<!--將數(shù)據(jù)轉(zhuǎn)為大寫-->
<wxs module="m">
    module.exports.toUpper=function(str){
        return str.toUpperCase()
    }
</wxs>
5.3诅蝶、定義外聯(lián)的 wxs 腳本

wxs 代碼還可以編寫在以 .wxs 為后綴名的文件內(nèi)退个,就像 javascript 代碼可以編寫在以 .js 為后綴名的文件中一樣。

//tools.wxs
function toUpper(str){
    return str.toUpperCase()
}
  
module.exports={
    toUpper:toUpper
}
5.4调炬、使用外聯(lián)的 wxs 腳本

在 wxml 中引入外聯(lián)的 wxs 腳本時语盈,必須為 <wxs>標(biāo)簽添加 module 和 src 屬性,其中:

  • module 用來指定模塊的名稱缰泡。
  • src用來指定要引入的腳本的路徑刀荒,且必須是相對路徑。
<!--調(diào)用模塊中的方法-->
<view>{{m.toUpper(username)}}</view>

<!--引入外聯(lián)的wxs腳本 并命名-->
<wxs src="../../utils/tools.wxs" module="m"></wxs>
5.5棘钞、WXS 的特點
  • 與JavaScript 不同
    為了降低 wxs(WeiXin Script)的學(xué)習(xí)成本wxs 語言在設(shè)計時借大量鑒了JavaScript的語法缠借。但是本質(zhì)上wxs 和JavaScript 是完全不同的兩種語言!
  • 不能作為組件的事件回調(diào)
    wxs 典型的應(yīng)用場景就是“過濾器”經(jīng)常配合 Mustache 語法進行使用,例如:
<view>{{m.toUpper(username)}}</view>

但是宜猜,在 wxs 中定義的函數(shù)不能作為組件的事件回調(diào)函數(shù)烈炭。例如,下面的用法是錯誤的:

 <button bindtap="m.toUpper">按鈕</button>
  • 隔離性
    隔離性指的是 wxs 的運行環(huán)境和其他JavaScript 代碼是隔離的宝恶。體現(xiàn)在如下兩方面:
    wxs 不能調(diào)用 js 中定義的函數(shù)。
    wxs 不能調(diào)用小程序提供的 API趴捅。
  • 性能好
    在 i0s 設(shè)備上垫毙,小程序內(nèi)的 WXS 會比Javascript 代碼快 2~20 倍。
    在 android 設(shè)備上拱绑,二者的運行效率無差異综芥。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市猎拨,隨后出現(xiàn)的幾起案子膀藐,更是在濱河造成了極大的恐慌屠阻,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件额各,死亡現(xiàn)場離奇詭異国觉,居然都是意外死亡,警方通過查閱死者的電腦和手機虾啦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門麻诀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傲醉,你說我怎么就攤上這事蝇闭。” “怎么了硬毕?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵呻引,是天一觀的道長。 經(jīng)常有香客問我吐咳,道長逻悠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任挪丢,我火速辦了婚禮蹂风,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乾蓬。我一直安慰自己惠啄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布任内。 她就那樣靜靜地躺著撵渡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪死嗦。 梳的紋絲不亂的頭發(fā)上趋距,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音越除,去河邊找鬼节腐。 笑死,一個胖子當(dāng)著我的面吹牛摘盆,可吹牛的內(nèi)容都是我干的翼雀。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼孩擂,長吁一口氣:“原來是場噩夢啊……” “哼狼渊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起类垦,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤狈邑,失蹤者是張志新(化名)和其女友劉穎城须,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米苹,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡糕伐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驱入。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赤炒。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亏较,靈堂內(nèi)的尸體忽然破棺而出莺褒,到底是詐尸還是另有隱情,我是刑警寧澤雪情,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布遵岩,位于F島的核電站,受9級特大地震影響巡通,放射性物質(zhì)發(fā)生泄漏尘执。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一宴凉、第九天 我趴在偏房一處隱蔽的房頂上張望誊锭。 院中可真熱鬧误墓,春花似錦俭厚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽温治。三九已至,卻和暖如春戒悠,著一層夾襖步出監(jiān)牢的瞬間熬荆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工绸狐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卤恳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓寒矿,卻偏偏與公主長得像纬黎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子劫窒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351