在做微信小程序的时候,经常会遇到需要页面间传递参数的情况,根据目前项目经验,总结了以下几种方式: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方法,这里使用了setTimeoutsetTimeout(() => {let newPage = getCurPage()let oldOnReady = newPage.onReadynewPage.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)}
}
复制代码

小结

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

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

微信小程序中页面间跳转传参方式相关推荐

  1. vue 传参 微信_小猿圈web前端之微信小程序页面间跳转传参方式总结

    原标题:小猿圈web前端之微信小程序页面间跳转传参方式总结 最近小程序发展的越来越快,很多大公司也在打造自己的小程序平台以及购物小程序等等,今天小猿圈web前端讲师就总结了关于微信小程序的知识点,首先 ...

  2. Uni-app的webview,H5页面在微信小程序中webview再跳回小程序的解决方案

    场景: 微信小程序:uni-app开发 H5:uni-app开发 小程序其中一个场景需要使用webview嵌入H5,待H5里的业务处理完成再跳转回小程序 遇到的问题: webview无法跳转回小程序, ...

  3. 如何在微信小程序的页面间传递数据?

    知晓程序注: 我们在之前发布过小程序页面传值方法的 ,说明了在小程序开发中,两种常见的页面之间传值方法. 本期,「知晓程序」为你带来的是「倒数记日」小程序开发者带来的,小程序开发中,有关页面间数据传递 ...

  4. 微信小程序禁止页面上下滑动的三个方式

    开发的时候,会遇到产品或者UI发出如下规定: 1.如果是一屏的页面,就禁止页面能上下滑动 2.如果显示弹窗的时候,长屏幕禁止上下滑动! 感叹一句:好变态 当然,感叹归感叹,但是还是得听不是,我找出了3 ...

  5. 微信小程序中页面跳转时要始终返回首页的问题

    首先,要先说一下项目的需求,我要实现的功能是 在首页有一个按钮可以跳转到一个展示的页面,这个展示的页面上下两个部分,上边的部分是可以切换学科种类的,下面的部分可以展示这个学科下的所有科目,上面切换的部 ...

  6. 微信小程序关于页面不跳转的问题

    使用组件navigator或者使用api---->wx.navigateTo(),wx.redirectTo()等进行页面跳转的情况下,在app.json中tabbar中就不能存在跳转的标签; ...

  7. 微信小程序eventChannel页面间事件通信通道

    可以运用在父子组件或点击下一个页面传值回上一个页面 一.当前页面跳转下一页注册监听 events,监听被打开页面的回调 wx.navigateTo({url: 'home?id=1',<!-- ...

  8. 微信小程序父子页面间得数据传递(对象或者数组)

    1.页面跳转时向子页面传入数据 父页面js goexit() { //跳转方法var data = JSON.stringify(this.data.data.follow) // this.data ...

  9. 微信小程序中页面引入js文件

    一.引入util中的util.js文件: utils.js可以存储全局的方法(function).变量(const url)等,类似于可以实现公共存储. 首先,来看utils.js中: const f ...

  10. 微信小程序分享到朋友圈onShareTimeline()传参及接参

    代码如下: // index.jsonShareTimeline: function () {return {title: '我是分享后显示的标题', // 可不填query: 'id=123', / ...

最新文章

  1. Android和iOS那个好?
  2. 细粒度情感分析:还在用各种花式GNN?或许只用RoBERTa就够了
  3. dart服务器开发性能,DartVM服务器开发(第四天)--代码优化
  4. coreseek mysql.sock_Coreseek + Sphinx + Mysql + PHP构建中文检索引擎
  5. linux shell解析1
  6. View如何设置16进制颜色值
  7. 架构篇:高可用 Redis 服务架构分析与搭建
  8. 按键精灵定位坐标循环_[按键精灵教程]带你了解多点找色、多点比色
  9. flink sql运用入门
  10. 关于 u-nas 报警声音
  11. 使用DSP28335控制三相三电平PWM整流器-软启动
  12. 微信小程序上传代码, Error: 分包大小超过限制,main package source size 4732KB exceed max limit 2MB
  13. 这几款简单好用的录屏软件,快收藏起来
  14. 正则表达式-RegExp-常用正则表达式
  15. Win11蓝屏代码0x0000001A的解决方法
  16. 技术人员应该具备的几项基本技能
  17. python派森编程软件_《派森》(Python)
  18. OpenGLES2.0后台绘制图片
  19. 分享4张炫酷农业大屏模板,Smartbi教你“智慧”种田
  20. 第一章 计算机基础知识随堂练习,计算机应用基础随堂练习全解

热门文章

  1. Linux中级之netfilter防火墙(iptables)
  2. Codeforces Round #565 (div. 3)
  3. 文件写入一行 、读取一行的工具类案例
  4. BZOJ 1878: [SDOI2009]HH的项链【莫队】
  5. [译] What is some general advice for a new PhD student?
  6. MyBatis 基础知识
  7. BZOJ-3207 花神的嘲讽计划Ⅰ
  8. 公司居然使用监听设备,大家来讨论下IT公司应该怎样管理
  9. JavaScript 盖尔-沙普利算法
  10. Django学习手册 - csrf