一:复杂数据的传递页面跳转进行数据传递是一个必不可少的功能,有很多应用场景需要使用比如买商品的流程是“选择商品” - “购物车” - “物流信息” - “确认订单”,所以在这几个不同 ...
一:复杂数据的传递
页面跳转进行数据传递是一个必不可少的功能,有很多应用场景需要使用
比如买商品的流程是“选择商品” -> “购物车” -> “物流信息” -> “确认订单”,所以在这几个不同页面进行跳转的时候,相应的数据也需要传递下去
在android中,我们可以用Intent 来进行数据的传递,新界面通过getIntent来进行获取
在IOS中,一般是通过controller 的属性来进行传值
在React-Native中,可以在navigator.push 方法传递对象
上面三种进行数据的传递都很简单,而且也很方法。
而在小程序中,我们可以看到,页面跳转和传递数据是通过
代码实现
wx.navigateTo({
url: 'page?a=1&b=2',
success: function (res) {
// success
},
fail: function (err) {
// fail
},
complete: function () {
// complete
}
});
他是通过url字段来控制跳转的页面,同时路径“?”后面的表示传递的参数,这跟http的GET请求传参一致
在新页面获取参数信息也很简单
Page({
data: {},
onLoad: function(options) {
console.log(options)
}
});
可以直接在每个页面的onLoad 回调中来进行获取。
看了上面的代码,你会疑问这不是很简单吗?还需要你来说吗?两句代码搞定的事
确实,如果你只是做简单的数据传递是很简单
但是,回到最上面说的那个问题,如果页面层级比较多,数据比较多且复杂的时候,你会抓狂,因为wx.navigateTo 的url自动是String类型,也就是说你不能直接传递对象,如果数据很多的话,会是一件很痛苦的事
wx.navigateTo({
url: "page?productId=1&count=2&name=zhangzy&phone=13488888888&address=xxx"
});
代码可读性极差而且非常繁琐,万一那个字段忘记拼进去,很容易出bug
所以,我们必须要做改变,需要优化
结合上篇文章《返回上级页面并传递数据》封装另外一个大同小异的方法
class Router {
navigateTo(obj) {
wx.navigateTo({
url: obj.url,
success: function (res) {
// success
obj.success && obj.success(res);
if (obj.data) {
setTimeout(() => {
let pages = getCurrentPages()
let curPage = pages[pages.length - 1];
if(curPage.startPageForData) {
curPage.startPageForData(obj.data);
} else {
curPage.setData(obj.data);
}
}, 1000);
}
},
fail: function (err) {
// fail
obj.fail && obj.fail(res);
},
complete: function () {
// complete
obj.complete && obj.complete();
}
});
}
}
Router = new Router();
module.exports = Router;
实际上还是基于微信提供的wx.navigateTo接口,在跳转成功之后,我们获取页面栈里面最上层的一个,也就是最新打开的那个页面,从而进行数据绑定或是执行对应的startPageForData方法,上面我们加了1000毫秒的延时,主要是当页面跳转之后,可能没那么快注册的栈里面,不延时可能获取的还是之前页面数