微信小程序传参的五种方式

文章目录


前言

大家好,今天和大家分享一下微信小程序页面之间传参的五种方式,这个的话也是有人问了我一嘴,然后现在我和大家分享一下。

使用GPT搜索的话给我的答案是纯文字的描述,但是大致就是这样:

  1. URL参数传递:可以将参数直接拼接在页面的URL中,在打开目标页面时,通过获取URL的query参数来获取传递的数值。
  2. Storage本地存储:可以使用小程序提供的Storage API,将参数存储在本地缓存中,然后在目标页面读取并使用。
  3. 全局变量:可以在小程序的App全局对象中定义一个全局变量,在页面间进行传递和访问。在源页面设置变量值,在目标页面获取变量值。
  4. 页面跳转时传参:使用小程序提供的导航API(如navigateTo、redirectTo等)进行页面跳转时,可以通过在跳转API的url参数中传递数据,目标页面可以通过获取跳转API的options参数来获取传递的数据。
  5. 页面栈传参:小程序提供了页面栈的概念,可以通过页面栈来传递参数。在源页面使用navigateTo或redirectTo等导航方法打开目标页面时,可以在导航方法的参数中传递参数,目标页面可以通过页面栈的相关API(如getCurrentPages等)获取来源页面的参数。

一、URL参数传递

url上直接携带参数长度是有限的且不支持特殊符号,可用编码、解码的方式解决

1.api跳转

代码示例:

javascript 复制代码
// pagea.js
//跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
wx.switchTab({
    url:'/pageb?id=1',
})
//关闭所有页面,打开到应用内的某个页面
wx.reLaunch({
  url: '/pageb?id=1',
})
//关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面
wx.redirectTo({
  url: '/pageb?id=1',
})
//保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。
wx.navigateTo({
  url: '/pageb?id='+ encodeURIComponent(this.data.id),
})
//以上四种路由方式在传参和接参上没有任何区别

// pageb.js
Page({
  //地址传参带过来的参数只能在该方法的options参数中获取
  onLoad:function(options){
    console.log(decodeURIComponent(options.id)) //'1' ,无论传的变量是数字、布尔还是对象接收的时候都是字符串
  },
})

2.组件跳转

代码示例:

javascript 复制代码
// pagea.wxml
<view>
  <navigator open-type="switchTab" url="/pageb?id=1">跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面</navigator>
  <navigator open-type="reLaunch" url="/pageb?id=1">关闭所有页面,打开到应用内的某个页面</navigator>
  <navigator open-type="redirectTo" url="/pageb?id=1">关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面</navigator>
  <navigator open-type="navigateTo" url="/pageb?id=1">保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面</navigator>
</view>
//以上四种路由方式在传参和接参上没有任何区别
javascript 复制代码
// pageb.wxml
Page({
  //地址传参带过来的参数只能在该方法的options参数中获取
  onLoad:function(options){
    console.log(options.id) //'1' ,无论传的变量是数字、布尔还是对象接收的时候都是字符串
  },
})

二、Storage本地存储

storage是微信分给每个小程序的缓存,单个参数最大1M,数据总和最大10M。

代码示例:

javascript 复制代码
// pagea.js
Page({
    data:{
        name:'xiaosun'    
    },
})
//只支持原生类型、Date、及能够通过JSON.stringify序列化的对象
wx.setStorageSync('name',this.data.name)

// pageb.js
console.log(wx.getStorageSync(name)) //xiaosun

三、全局变量globalData

globalData是小程序app.js中固定的一个属性,存储的数据可在全项目任意处使用

代码示例:

javascript 复制代码
// app.js
App({
  globalData:{},
})

// pagea.js
const app = getApp();
app.globalData.name='xiaosun';

// pageb.js
const app = getApp();
console.log(app.globalData.name) //xiaosun

四、页面跳转时传参

通信通道是wx.navitageTo()独有的

代码示例:

javascript 复制代码
// pagea.js
wx.navigateTo({
  url: '/pageb?id=1',
  events: {
    // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
    acceptDataFromOpenedPage: function(data) {//参数名字随便起,前后页面对应上即可
    //对发送回来的数据进行处理
      console.log(data)
    },
    someEvent: function(data) {//参数名字随便起,前后页面对应上即可
      console.log(data)
    }
  },
  success: function(res) {
    // 通过eventChannel向被打开页面传送数据
    res.eventChannel.emit('acceptDataFromOpenerPage', { data: 'test' })//参数名字随便起,前后页面对应上即可
  },
})

//pageb.js
Page({
  onLoad: function(option){
    //获取通信通道
    const eventChannel = this.getOpenerEventChannel()
    // 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
    eventChannel.on('acceptDataFromOpenerPage', function(data) {
        //对发送过来的数据进行处理
      console.log(data)
    })
    //向上一页面发送数据
    eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'});
    eventChannel.emit('someEvent', {data: 'test'});
  },
})

五、页面栈传参

只对当前页面栈中存在的页面生效

代码示例:

javascript 复制代码
// pagea.js
Page({
  data:{
    name:'xiaosun',
    age:22
  },
  eatFood:function(food){
    console.log('eating '+ food)    
  },
})

// pageb.js
Page({
  onLoad: function (options) {
    //获取当前页面栈
    const pages = getCurrentPages();
    //获取上一页面对象
    let prePage = pages[pages.length - 2];
    console.log(prePage.data.name) //'xiaosun'
    prePage.eatFood('apple')//eating apple
  },
})

总结

  1. globalData与storage原理相同都是将数据放在一个公共的地方全应用随意取用,但是他们的数据不推送也不关联,即globalData和storage中的数据更新了,但已经获取过值的页面其对应的值并 不会更新。
    解决办法:将各页面获取值的事件放到onShow()中,每次页面进入前台的时候都会重新从globalData和storage中取值。
  2. 路由携带参数简单方便,但是地址长度有限不能携带大量参数和特殊符号。
    解决办法:在传参之前进行编码encodeURIComponent(),接收的时候进行解码 decodeURIComponent()。如此大量参数可以携带但是只能单方面传递参数,即只能a向b传,反之则不行。
  3. 通信通道,页面可以互相传参,但是该通道仅存在于wx.navagateTo()的接口调用时才有效。
  4. 页面栈,这是一个极其强大功能,它本质上不是向页面传参而是直接修改页面参数和方法。通过页面栈我们可以拿到该页面的对象,然后就可以对该页面的各项数据和函数进行操作。但是这种方法只能在b页面去操作a页面,并不能在a页面操作b页面,因为此时页面栈中还没有b。并且该方法也仅限于通过wx.navagateTo()或 跳转 这两种方式进入b页面才可使用,因为其他方式跳转到b页面时已经销毁了其他所有页面,页面栈中已经没有上一个页面了。

结语

以上就是本章的全部内容了,希望能够帮助到您,同时也希望我有写错的地方可以指出,谢谢!

相关推荐
灵机一物2 小时前
灵机一物AI智能电商小程序-ReAct驱动的虚拟试穿智能体产品方案
人工智能·小程序
CHU7290352 小时前
剧本杀组车约玩小程序前端功能版块设计及玩法介绍
前端·小程序
chushiyunen3 小时前
pycharm创建桌面时间控件小程序
ide·小程序·pycharm
宁夏雨科网3 小时前
SaaS系统搭建宠物用品小程序可行吗
小程序·商城小程序·微信商城·制作小程序·宠物用品小程序·宠物用品商城
CHU72903514 小时前
直播逛购新体验——直播商城APP前端功能详解
前端·小程序
云起SAAS19 小时前
设备质保保修维修保质包换期查询H5抖音快手微信小程序看广告流量主开源
微信小程序·小程序
焦糖玛奇朵婷1 天前
盲盒小程序一站式开发
java·大数据·服务器·前端·小程序
CHU7290351 天前
潮玩解锁新方式!扭蛋机盲盒小程序前端功能玩法解析
小程序
程序媛徐师姐1 天前
Java基于微信小程序的线上教育商城,附源码+文档说明
java·微信小程序·线上教育商城小程序·java线上教育商城小程序·线上教育商城微信小程序·线上教育小程序·线上教育微信小程序
2501_915106321 天前
如何在 Mac 上面代理抓包和数据流分析
android·macos·ios·小程序·uni-app·iphone·webview