前言

由于经常需要进行页面间传参且各种传参的业务场景也不相同,根据官方文档和日常工作进行了总结。共有五种传参方式,各位有什么关于页面间传参的奇思妙想也可在评论区提出,大家共同探讨

概览

方式 优点 缺点
globalData 双向传参、全应用可用 不及时
storage 双向传参、全应用可用 不及时
路由 简单方便、及时 正向传参
通信通道 双向传参、及时 wx.navagateTo()接口调用才可用
页面栈 可操作数据和函数、及时 反向传参、仅wx.navagateTo()<navigator open-type="navigateTo" url="/bbb?id=1"></navigator> 才可用

1、使用globalData

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

代码示例:

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

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

代码示例:

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

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

3、使用url

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

代码示例:

3.1 api跳转

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

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

3.2 组件跳转

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

4、使用通信通道

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

代码示例:

// aaa.js
wx.navigateTo({
  url: '/bbb?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' })//参数名字随便起,前后页面对应上即可
  },
})

//bbb.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'});
  },
})

5、使用页面栈

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

代码示例:

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

// bbb.js
Page({
  onLoad: function (options) {
    //获取当前页面栈
    const pages = getCurrentPages();
    //获取上一页面对象
    let prePage = pages[pages.length - 2];
    console.log(prePage.data.name) //'xiaowang'
    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()或 <navigator open-type="navigateTo" url="/bbb?id=1">跳转</navigator> 这两种方式进入b页面才可使用,因为其他方式跳转到b页面时已经销毁了其他所有页面,页面栈中已经没有上一个页面了。

到此这篇关于小程序页面间传参的五种方式的文章就介绍到这了,更多相关小程序页面间传参内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

小程序页面间传参的五种方式实例详解的更多相关文章

  1. 微信小程序“圣诞帽”的实现思路详解

    这两天朋友圈被圣诞帽刷屏,下面通过本文给大家分享微信小程序“圣诞帽”的实现思路详解,需要的朋友参考下吧

  2. 小程序实现图片裁剪上传

    这篇文章主要为大家详细介绍了小程序实现图片裁剪上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. vue打包chunk-vendors.js文件过大导致页面加载缓慢的解决

    这篇文章主要介绍了vue打包chunk-vendors.js文件过大导致页面加载缓慢的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  4. php实现小程序支付完整版

    这篇文章主要为大家详细介绍了php实现小程序支付完整版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. 微信小程序的宿主环境实现代码

    这篇文章主要介绍了微信小程序的宿主环境,包括scroll-view 组件的基本使用,text 组件的基本使用及rich-text 组件的基本使用,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

  6. 微信小程序使用ucharts在小程序中加入横屏展示功能的全过程

    这篇文章主要给大家介绍了关于微信小程序使用ucharts在小程序中加入横屏展示功能的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友可以参考下

  7. 微信小程序实现页面导航的方法详解

    这篇文章主要为大家详细介绍一下微信小程序实现页面导航的几种方法以及帮助大家掌握如何使用页面之间的导航跳转,感兴趣的可以了解一下

  8. js 页面执行时间计算代码

    一个可以用来计算当前页面的执行时间,方便控制页面的大小等一系列影响页面执行效率的东西

  9. 微信小程序开发WXML模板语法基础教程

    这篇文章主要介绍了微信小程序模板语法,WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构,需要的朋友们下面随着小编来一起学习学习吧

  10. 在jsp页面中响应速度提高的7种方法分享

    这篇文章介绍了在jsp页面中响应速度提高的7种方法,有需要的朋友可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部