根据UI设计,在项目中使用了自定义的导航栏。导航栏有三部分,中间的标题,左边的返回按钮,右边的其他功能按钮。
一般情况下,点击返回按钮返回上一个页面,直接调用wx.navigateBack()即可。但是我们的业务中,有一个修改密码功能,需要在一个页面中请求验证码,验证成功后进入到设置新密码页面,设置成功后再回到登录页面。
而在小程序的页面栈管理框架中实现起来却遇到了一点问题,在设置密码成功后,使用后退或者重定向,都无法很好的在后台销毁请求验证码页面(由于我们在登录页面前还有一个页面,也无法使用reLaunch方式)。
所以最后我只能把请求验证码和设置密码功能写在一个页面中,通过布局的显示和隐藏进行切换。那么接下来就要处理一个问题,在这个页面中,点击返回键,有时要回到上一个页面,有时要切换布局。
而为了方便维护,我的自定义导航栏是必须是全局的,那么它的返回方法除了wx.navigateBack(),还必须提供可重载的能力,方便调用的页面自定义实现。
小程序的页面和数据的交互基本都是通过设置data中的值实现的,那么可以这样设计,在自定义导航栏中,将返回方法提取到data中。
//自定义导航栏 page/js
data:{
/**
* 左上角按钮回退方法,可以被调用者重写
*/
goBack:function(){
wx.navigateBack()
}
},
methods:{
/**
* 调用者设置新的返回方法
*/
setGoBack: function (_goback){
this.setData({ goBack : _goback})
},
/**
* 返回上一页
*/
goBack: function(){
this.data.goBack()
},
}
在自定义导航栏中的view绑定了goBack方法。这样一般情况下,点击返回按钮直接调用data中的boBack方法,返回到上一个页面。在设置密码页面中
//获取自定义导航栏对象
let titlelayout = this.selectComponent('#titlelayout');
//重写titleLayout左键返回方法,切换布局,或返回上一页
titlelayout.setGoBack(function(){
if(_this.data.step == 2) {
_this.setData({ step: '1' })
} else {
wx.navigateBack()
}
});
其中根据step的数值判断布局的显示和隐藏。这样返回方法可以在不同页面,有不同的实现。
网友评论