微信小程序页面间跳转传参方式总结


Posted in Javascript onJune 13, 2019

前言

在做微信小程序的时候,经常会遇到需要页面间传递参数的情况,根据目前项目经验,总结了以下几种方式:URL传参、缓存和方法调用。

URL传参

这种方式是最简单也是最常用的,这里就不做过多介绍了。

缓存

虽然URL传参比较简单易用,但也有局限性,就是只能传递简单参数,对于复杂的参数就显得无能为力了,但很多时候我们需要传递的是结构比较复杂的数据,这时候很多开发者都会想到用缓存。

使用缓存我们有两种方式:小程序自带Storage和vuex。因为我们的项目是基于mpvue的,顺带也用了vuex了

  • Storage:通过小程序提供的API可以方便的进行缓存操作,如:wx.setStorage、wx.getStorage等。
  • Vuex:这就跟我们平时在做vue项目时一样了,在store中声明一个变量存放传递的参数。

不管是用上面哪种方式,想法都是一样的:在跳转页面之前先把参数保存到缓存,进入页面之后先获取缓存的参数,然后清除缓存中的参数,进行业务操作。大致伪代码如下:

// pageA.vue 
goToPageB() {
 let arg = {
 name: 'Jack',
 age: 9
 }
 // 先把参数保存到缓存 比如这里用的是小程序的Storage,这里采用同步的方式
 wx.setStorageSync({
 key: 'pageArg',
 data: arg
 })
 wx.navigateTo({
 url: 'pageB'
 })
}


// pageB.vue 
mounted() {
 // 从缓存中取出参数
 let arg = wx.getStorageSync('pageArg')
 // 清除缓存中的页面参数
 wx.removeStorageSync('pageArg')
 // 进行业务处理
 // ...
}

大致就是这么个逻辑,可能具体项目中会对存取缓存进行封装,或者在vuex中的做法又不一样,但思想是一样的。

这样做是可以实现功能,但总感觉不太好,每次都要进行存取操作,感觉很麻烦,而且显得不高端。。。

于是乎,我们想了个方式传递,就是今天的主角:方法调用。

方法调用

这种方式肯定不是最好最优雅的解决方式,因为我们也觉得有欠缺的地方,但目前用起来还是比较方便的,今天放出来也是希望让大家看下怎么进行修改,也以便于我们优化。

主要是用了小程序提供的 getCurrentPages 方法,具体内容可查看文档,我这里直接就贴图了,因为文档说的很简单

微信小程序页面间跳转传参方式总结

小程序对页面的管理感觉跟浏览器中的history差不多,也是有一个页面栈,每次跳转页面都是往这个栈里push一个页面对象,返回的时候就pop一个,当然具体实现要复杂很多。

这里官方重点提示了:不要尝试修改页面栈,这也就是为什么我说我们的这种传参方式不是很好的原因,我们就是 通过方法修改了这个页面栈的数据 。

带参数返回上一页

具体实现方式

// 往前获取页面对象,类似history.go(-n)
function getPageByPreCount(n) {
 let currentPages = getCurrentPages()
 return currentPages[Math.max(0, currentPages.length - (n + 1))]
}

/* 返回上一页并带回参数
 * parameter functionName 上一个页面中用来接收带回参数的方法名称,注意:方法要在data中
 * parameter args 带回去的参数
*/
function returnPrevPage(functionName, ...args) {
 if (functionName) {
 let prevPage = getPageByPreCount(1)
 wx.navigateBack()
 // 方法里手动调用了页面的方法,并把页面参数在这里作为方法参数传递
 prevPage.data.$root[0] && typeof prevPage.data.$root[0][functionName] == 'function' 
 && prevPage.data.$root[0][functionName](...args)
 } else {
 wx.navigateBack()
 }
}

项目中使用,如在搜索页(search.vue)面中有一个过滤条件是用户,但可以选择多个用户,而且选择用户是在另外一个页面(user-pick.vue)里进行的,这就是要从user-picker.vue跳回search.vue,并带回选中的用户列表信息

// user-pick.vue
methods: {
 onSelectConfirm(users) {
 returnPrevPaeg('onSelectUser', users)
 }
}

// user-pick.vue
data() {
 return {
 // 把具体处理还是放到了methods中,如果处理逻辑比较简单也可以直接放这里
 onSelectUser: this.onUserOk
 }
},
methods: {
 onUserOk(users) {
 // 拿到用户信息 进行搜索操作
 // this.search(user)
 }
}

带参数跳转页面

返回上一页还是比较好理解的,因为页面已经在页面栈里存在了,可以取到并调用方法,但对于跳转的就不太好实现了,因为每次跳转页面都是往页面栈里追加一个新的对象,在跳转前无法获取到该对象。

这里就是我说的做的不太好的地方,因为我们采用的是setTimeout方式。。。

// 前进页面回调方法
function navigateTo (url,functionName,...args) {
 triggerNextPageFn('onHide', functionName, ...args)
 // 跳转后处理数据
 wx.navigateTo({url})
}
function redirectTo (url,functionName,...args) {
 triggerNextPageFn('onUnload', functionName, ...args)
 // 跳转后处理数据
 wx.redirectTo({url})
}

// 通用触发后一个页面的方法
function triggerNextPageFn(type, functionName, ...args) {
 let prePage = getCurPage()
 if (functionName) {
 // 保存当前变量
 ((..._args) => {
  let oldEventFn = prePage[type]
  prePage[type] = () => {
  // 前进页面改变onReady方法,这里使用了setTimeout
  setTimeout(() => {
   let newPage = getCurPage()
   let oldOnReady = newPage.onReady
   newPage.onReady = function () {
   newPage.data.$root[0] && typeof newPage.data.$root[0][functionName] == 'function' 
   && newPage.data.$root[0][functionName](..._args)
   oldOnReady.apply(newPage)
   newPage.onReady = oldOnReady
   }
  })
  prePage[type] = oldEventFn
  }
 })(...args)
 }
}

小结

传递方式那么多,选择适合自己的才是最重要的。虽然我们写的这个传参方法不是微信官方支持的,因为文档里面明确说了不要修改页面栈,但就目前使用情况来看还是没遇到什么问题的,也许还没遇到吧。

就本篇文章中介绍的传参方式,如果有不妥的地方或者更好的修改建议,希望大家能帮我们提出来,大家共同进步。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
实用的Jquery选项卡TAB示例代码
Aug 28 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
js 自带的sort() 方法全面了解
Aug 16 Javascript
炫酷的js手风琴效果
Oct 13 Javascript
微信小程序 数据封装,参数传值等经验分享
Jan 09 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
Mar 09 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 Javascript
JavaScript中重名的函数与对象示例详析
Sep 28 Javascript
浅谈Vue响应式(数组变异方法)
May 07 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
Sep 27 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
Oct 08 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 Javascript
微信小程序位置授权处理方法
Jun 13 #Javascript
json数据格式常见操作示例
Jun 13 #Javascript
微信小程序实现渐入渐出动画效果
Jun 13 #Javascript
微信小程序前端自定义分享的实现方法
Jun 13 #Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
Jun 13 #Javascript
javascript实现的字符串转换成数组操作示例
Jun 13 #Javascript
javascript实现的时间格式加8小时功能示例
Jun 13 #Javascript
You might like
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
Python实现字典依据value排序
2016/02/24 Python
详解python中的文件与目录操作
2017/07/11 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
QML使用Python的函数过程解析
2019/09/26 Python
Python线程指南分享
2019/11/19 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
国际会议邀请函范文
2014/01/16 职场文书
管理失职检讨书
2014/02/12 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
合伙经营协议书范本
2014/04/18 职场文书
员工趣味活动方案
2014/08/27 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
Pandas 数据编码的十种方法
2022/04/20 Python