最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

小程序頁(yè)面間傳參的五種方式實(shí)例詳解

 更新時(shí)間:2022年08月02日 14:49:46   作者:sKK07  
頁(yè)面跳轉(zhuǎn),頁(yè)面之間傳遞參數(shù)在開(kāi)發(fā)APP應(yīng)用的時(shí)候會(huì)經(jīng)常用到這樣的功能,下面這篇文章主要給大家介紹了關(guān)于小程序頁(yè)面間傳參的五種方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

由于經(jīng)常需要進(jìn)行頁(yè)面間傳參且各種傳參的業(yè)務(wù)場(chǎng)景也不相同,根據(jù)官方文檔和日常工作進(jìn)行了總結(jié)。共有五種傳參方式,各位有什么關(guān)于頁(yè)面間傳參的奇思妙想也可在評(píng)論區(qū)提出,大家共同探討

概覽

方式優(yōu)點(diǎn)缺點(diǎn)
globalData雙向傳參、全應(yīng)用可用不及時(shí)
storage雙向傳參、全應(yīng)用可用不及時(shí)
路由簡(jiǎn)單方便、及時(shí)正向傳參
通信通道雙向傳參、及時(shí)wx.navagateTo()接口調(diào)用才可用
頁(yè)面棧可操作數(shù)據(jù)和函數(shù)、及時(shí)反向傳參、僅wx.navagateTo()<navigator open-type="navigateTo" url="/bbb?id=1"></navigator> 才可用

1、使用globalData

說(shuō)明:globalData是小程序app.js中固定的一個(gè)屬性,存儲(chǔ)的數(shù)據(jù)可在全項(xiàng)目任意處使用

代碼示例:

// app.js
App({
  globalData:{},
})

// aaa.js
const app = getApp();
app.globalData.name='xiaowang';

// bbb.js
const app = getApp();
console.log(app.globalData.name) //xiaowang

2、使用storage

說(shuō)明:storage是微信分給每個(gè)小程序的緩存,單個(gè)參數(shù)最大1M,數(shù)據(jù)總和最大10M

代碼示例:

// aaa.js
Page({
    data:{
        name:'xiaowang'    
    },
})
//只支持原生類(lèi)型、Date、及能夠通過(guò)JSON.stringify序列化的對(duì)象
wx.setStorageSync('name',this.data.name)

// bbb.js
console.log(wx.getStorageSync(name)) //xiaowang

3、使用url

說(shuō)明:url上直接攜帶參數(shù)長(zhǎng)度是有限的且不支持特殊符號(hào),可用編碼、解碼的方式解決

代碼示例:

3.1 api跳轉(zhuǎn)

// aaa.js
//跳轉(zhuǎn)到 tabBar 頁(yè)面,并關(guān)閉其他所有非 tabBar 頁(yè)面
wx.switchTab({
    url:'/bbb?id=1',
})
//關(guān)閉所有頁(yè)面,打開(kāi)到應(yīng)用內(nèi)的某個(gè)頁(yè)面
wx.reLaunch({
  url: '/bbb?id=1',
})
//關(guān)閉當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面。但是不允許跳轉(zhuǎn)到 tabbar 頁(yè)面
wx.redirectTo({
  url: '/bbb?id=1',
})
//保留當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面。但是不能跳到 tabbar 頁(yè)面。
wx.navigateTo({
  url: '/bbb?id='+ encodeURIComponent(this.data.id),
})
//以上四種路由方式在傳參和接參上沒(méi)有任何區(qū)別

// bbb.js
Page({
  //地址傳參帶過(guò)來(lái)的參數(shù)只能在該方法的options參數(shù)中獲取
  onLoad:function(options){
    console.log(decodeURIComponent(options.id)) //'1' ,無(wú)論傳的變量是數(shù)字、布爾還是對(duì)象接收的時(shí)候都是字符串
  },
})

3.2 組件跳轉(zhuǎn)

// aaa.wxml
<view>
  <navigator open-type="switchTab" url="/bbb?id=1">跳轉(zhuǎn)到 tabBar 頁(yè)面,并關(guān)閉其他所有非 tabBar 頁(yè)面</navigator>
  <navigator open-type="reLaunch" url="/bbb?id=1">關(guān)閉所有頁(yè)面,打開(kāi)到應(yīng)用內(nèi)的某個(gè)頁(yè)面</navigator>
  <navigator open-type="redirectTo" url="/bbb?id=1">關(guān)閉當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面。但是不允許跳轉(zhuǎn)到 tabbar 頁(yè)面</navigator>
  <navigator open-type="navigateTo" url="/bbb?id=1">保留當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面。但是不能跳到 tabbar 頁(yè)面</navigator>
</view>
//以上四種路由方式在傳參和接參上沒(méi)有任何區(qū)別
// bbb.wxml
Page({
  //地址傳參帶過(guò)來(lái)的參數(shù)只能在該方法的options參數(shù)中獲取
  onLoad:function(options){
    console.log(options.id) //'1' ,無(wú)論傳的變量是數(shù)字、布爾還是對(duì)象接收的時(shí)候都是字符串
  },
})

4、使用通信通道

說(shuō)明:通信通道是wx.navitageTo()獨(dú)有的

代碼示例:

// aaa.js
wx.navigateTo({
  url: '/bbb?id=1',
  events: {
    // 為指定事件添加一個(gè)監(jiān)聽(tīng)器,獲取被打開(kāi)頁(yè)面?zhèn)魉偷疆?dāng)前頁(yè)面的數(shù)據(jù)
    acceptDataFromOpenedPage: function(data) {//參數(shù)名字隨便起,前后頁(yè)面對(duì)應(yīng)上即可
    //對(duì)發(fā)送回來(lái)的數(shù)據(jù)進(jìn)行處理
      console.log(data)
    },
    someEvent: function(data) {//參數(shù)名字隨便起,前后頁(yè)面對(duì)應(yīng)上即可
      console.log(data)
    }
  },
  success: function(res) {
    // 通過(guò)eventChannel向被打開(kāi)頁(yè)面?zhèn)魉蛿?shù)據(jù)
    res.eventChannel.emit('acceptDataFromOpenerPage', { data: 'test' })//參數(shù)名字隨便起,前后頁(yè)面對(duì)應(yīng)上即可
  },
})

//bbb.js
Page({
  onLoad: function(option){
    //獲取通信通道
    const eventChannel = this.getOpenerEventChannel()
    // 監(jiān)聽(tīng)acceptDataFromOpenerPage事件,獲取上一頁(yè)面通過(guò)eventChannel傳送到當(dāng)前頁(yè)面的數(shù)據(jù)
    eventChannel.on('acceptDataFromOpenerPage', function(data) {
        //對(duì)發(fā)送過(guò)來(lái)的數(shù)據(jù)進(jìn)行處理
      console.log(data)
    })
    //向上一頁(yè)面發(fā)送數(shù)據(jù)
    eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'});
    eventChannel.emit('someEvent', {data: 'test'});
  },
})

5、使用頁(yè)面棧

說(shuō)明:只對(duì)當(dāng)前頁(yè)面棧中存在的頁(yè)面生效

代碼示例:

// aaa.js
Page({
  data:{
    name:'xiaowang',
    age:22
  },
  eatFood:function(food){
    console.log('eating '+ food)    
  },
})

// bbb.js
Page({
  onLoad: function (options) {
    //獲取當(dāng)前頁(yè)面棧
    const pages = getCurrentPages();
    //獲取上一頁(yè)面對(duì)象
    let prePage = pages[pages.length - 2];
    console.log(prePage.data.name) //'xiaowang'
    prePage.eatFood('apple')//eating apple
  },
})

總結(jié)

  1. globalData與storage原理相同都是將數(shù)據(jù)放在一個(gè)公共的地方全應(yīng)用隨意取用,但是他們的數(shù)據(jù)不推送也不關(guān)聯(lián),即globalData和storage中的數(shù)據(jù)更新了,但已經(jīng)獲取過(guò)值的頁(yè)面其對(duì)應(yīng)的值并 不會(huì)更新。
    解決辦法:將各頁(yè)面獲取值的事件放到onShow()中,每次頁(yè)面進(jìn)入前臺(tái)的時(shí)候都會(huì)重新從globalData和storage中取值。
  2. 路由攜帶參數(shù)簡(jiǎn)單方便,但是地址長(zhǎng)度有限不能攜帶大量參數(shù)和特殊符號(hào)。
    解決辦法:在傳參之前進(jìn)行編碼encodeURIComponent(),接收的時(shí)候進(jìn)行解碼 decodeURIComponent()。如此大量參數(shù)可以攜帶但是只能單方面?zhèn)鬟f參數(shù),即只能a向b傳,反之則不行。
  3. 通信通道,頁(yè)面可以互相傳參,但是該通道僅存在于wx.navagateTo()的接口調(diào)用時(shí)才有效。
  4. 頁(yè)面棧,這是一個(gè)極其強(qiáng)大功能,它本質(zhì)上不是向頁(yè)面?zhèn)鲄⒍侵苯有薷捻?yè)面參數(shù)和方法。通過(guò)頁(yè)面棧我們可以拿到該頁(yè)面的對(duì)象,然后就可以對(duì)該頁(yè)面的各項(xiàng)數(shù)據(jù)和函數(shù)進(jìn)行操作。但是這種方法只能在b頁(yè)面去操作a頁(yè)面,并不能在a頁(yè)面操作b頁(yè)面,因?yàn)榇藭r(shí)頁(yè)面棧中還沒(méi)有b。并且該方法也僅限于通過(guò)wx.navagateTo()或 <navigator open-type="navigateTo" url="/bbb?id=1">跳轉(zhuǎn)</navigator> 這兩種方式進(jìn)入b頁(yè)面才可使用,因?yàn)槠渌绞教D(zhuǎn)到b頁(yè)面時(shí)已經(jīng)銷(xiāo)毀了其他所有頁(yè)面,頁(yè)面棧中已經(jīng)沒(méi)有上一個(gè)頁(yè)面了。

到此這篇關(guān)于小程序頁(yè)面間傳參的五種方式的文章就介紹到這了,更多相關(guān)小程序頁(yè)面間傳參內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

奇台县| 准格尔旗| 长丰县| 霸州市| 湘西| 大竹县| 云阳县| 永靖县| 金昌市| 静宁县| 黔西县| 班玛县| 南和县| 观塘区| 星子县| 乐亭县| 江安县| 大同县| 新蔡县| 桃源县| 云浮市| 延长县| 洛浦县| 黄石市| 崇明县| 雅安市| 宁津县| 巩义市| 调兵山市| 阳江市| 双峰县| 武穴市| 乐业县| 长顺县| 舞钢市| 洪泽县| 芮城县| 太白县| 富顺县| 台北县| 芜湖市|