微信小程序从子页面退回父页面时的数据传递 wx.navigateBack()

Posted caitangbutian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序从子页面退回父页面时的数据传递 wx.navigateBack()相关的知识,希望对你有一定的参考价值。

我们知道,在微信小程序中,从一个页面转到另一个页面,一般情况下可以通过navigate或redirect时候的url来携带参数,然后在目标页面的onLoad函数参数中获取这些url参数。例如:

// 源页面A相关代码
wx.navigateTo(
  url: "/pages/mypage/mypage?a=1&b=2"
)

// 目标页面B相关代码
Page(
  onLoad: function (options) 
    var a = options.a; // 值:1
    var b = options.b; // 值:2
  
)

 

 

但是,这种方式只有在目标页面还没有创建的时候,才有效。因为一个页面的onLoad方法在页面的生命周期中,只执行一次。

我们来考虑一下以下场景:

1. 在【页面A】中调用wx.navigateTo方法跳转到【页面B】
2. 然后从【页面B】返回【页面A】, 并将【页面B】中的一些数据传回【页面A】

举个更实际点的例子,如下图所示,我在这个表单页面A中填写数据:

技术图片
A页面

然后这个页面上,有一个搜索按钮,点击该按钮,将跳转到另一个证券代码搜索页面B:

技术图片
页面B

当我在这个搜索列表中选中一个证券代码后,将返回到上一个表单页面,继续我未完成的表单填写与提交操作。

这种场景是非常合理和常见的。

但是,我们来想一下,怎么在退出页面B,返回页面A的时候,把页面B中选中的证券代码回传给页面A呢?使用navigateTo()中url携带参数的方式?

基于Page生命周期的原因,我们的答案是:不行!

那有什么办法可以做到呢?

方法1:使用全局数据存储
  • 将要传递的数据,存储在App对象上(比如globalData属性)。
  • 将要传递的数据,存储在小程序的本地数据缓存(Storage)中。

例如,我们在将要退出页面B的时候,作如下调用:

//=== 1. 存储到app对象上的方式 ========
var app = getApp()
app.globalData.mydata = a:1, b:2;  //存储数据到app对象上
wx.navigateBack();  //返回上一个页面

//=== 2.存储到数据缓存的方式 =========
wx.setStorage(
  key: "mydata",
  data: a:1, b:2,
  success: function () 
    wx.navigateBack();   //返回上一个页面
  
)

 

这样一来,当返回到上一个页面的时候,可以通过读取这些全局存储区域,来获取到我们需要的数据。

不过,这种方式也是有很明显的缺点的。由于是全局数据存储,所以当你存入了那些数据后,必须谨慎的去管理这些全局数据(何时被销毁),否则一不小心,就会产生副作用。

方法2:从页面路由栈中直接获取和操作目标Page对象

这种方式,是通过调用小程序的API: getCurrentPages(),来获取当前页面路由栈的信息,这个路由栈中按照页面的路由顺序存放着相应的Page对象,我们可以很容易的获取到上一级页面的完整Page对象,从而使直接调用Page对象的属性和方法成为可能。

如下所示:

var pages = getCurrentPages();
var currPage = pages[pages.length - 1];   //当前页面的数据data
var prevPage = pages[pages.length - 2];  //上一个页面 的数据data

 

//直接调用上一个页面的setData()方法,把数据存到上一个页面中去
prevPage.setData(
      mydata: a:1, b:2
) 

比起全局数据存储的方式,这种方式在逻辑上要清晰得多,也不存在对数据的销毁有额外的管理工作。

总之,目前来看,如果你遇上了这样的场景,我推荐你使用方法2来设计你的代码。也希望小程序框架能推出更好更优雅的方式,来解决这种数据回传问题。

最后呢,如果你有什么更好的方式,请不吝赐教啦。

 

 

 

文章来源(侵删):https://www.cnblogs.com/caicaizi/p/6652103.html

 

以上是关于微信小程序从子页面退回父页面时的数据传递 wx.navigateBack()的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序不跳转页面传递数据

微信小程序组件通信

商城微信小程序(二)——完成分类页面及商品列表页

微信小程序的页面间传递数据

开发 | 如何在微信小程序的页面间传递数据?

微信小程序页面跳转url传参,对象、数据过长、特殊字符问题