小程序怎样让wx.navigateBack更好用的方法实现


Posted in Javascript onNovember 01, 2019

相信只要开发过小程序,对wx.navigateBack 这个 api都不会陌生。在摩拜单车的小程序中,它也被改造的更方便满足复杂的业务需求,可谓之 增强型的 wx.navigateBack。

先来看看官方文档中的用法:

wx.navigateBack({
 delta: 2
})

delta 表示返回的层级数。通过具体的业务示例来说明我们如何改造它:

余额充值的例子

小程序怎样让wx.navigateBack更好用的方法实现

两个页面:

  • A 页面展示用户余额,使用 H5 实现,通过 web-view 嵌套在小程序里
  • B 页面为用户充值,为了方便使用支付api,用小程序原生页面实现

用户在 B 页面充值完成后返回页面 A,更新用户余额。翻译成技术语言就是:从小程序原生页面返回到 H5 页面,需要刷新。

简单的业务代码如下:

<!-- pages/balance/index.wxml -->
<web-view src="{{url}}"></web-view>
Page({
 data: {
 url: 'https://balance/url'
 },
 onShow() {
 // ...
 },
 onHide() {
 // ...
 }
})

只要再次进入 A 页面更新 URL,就能达到刷新的目的。可以每次动态加参数,也可以离开 A 时清空 URL,再次进入的时候还原回来:

const URL = 'https://balance/url'
Page({
 data: {
 url: URL
 },
 onShow() {
 this.setData({
 url: URL
 })
 },
 onHide() {
 setTimeout(() => {
 this.setData({
 url: ''
 })
 }, 800)
 }
})

为了不让屏幕突然变白,加了 setTimeout 延迟下。

选择性的返回刷新

上面虽然实现了需求,但是有个体验问题:不管用户充值与否,回到 A 页面都会刷新下。理论上,只有用户充值成功后才需要刷新 A 页面。

简单看下 B 页面的代码:

Page({
 data: {},
 onTopup() {
 wx.requestPayment({
 // ...
 success(res) {
 wx.navigateBack()
 }
 })
 }
})

可否在返回 A 的时候告诉 A 是否充值成功?这样 A 就能选择性的刷新。

const URL = 'https://balance/url'
Page({
 data: {
 url: URL,
 isPaySuccess: false
 },
 onShow() {
 if (this.data.isPaySuccess) {
 this.setData({
 url: URL + '?refresh=1'
 })
 }
 }
})

A 页面有个 isPaySuccess 标记位控制是否刷新,那么如何在 B 页面支付成功后去修改这个标记位?直接看 B 页面的代码:

Page({
 data: {},
 onTopup() {
 wx.requestPayment({
 // ...
 success(res) {
 let pages = getCurrentPages()
 let pageA = pages[pages.length - 2]
 pageA.setData({
  isPaySuccess: true
 })
 wx.navigateBack()
 }
 })
 }
})

封装成 this.$back

可以封装成通用的 back 方法,返回页面的同时更改其数据:

function back(config) {
 let prevPageData = config.prevPageData
 let delta = config.delta || 1
 if (prevPageData) {
 let pages = getCurrentPages()
 let prevPage = pages[pages.length - (delta + 1)]
 prevPage.setData(config.prevPageData)
 }
 wx.navigateBack(config)
}

通过这样封装,上面的页面 B 的代码可以改成这样:

let back = require('../utils/back')
Page({
 data: {},
 onTopup() {
 wx.requestPayment({
 // ...
 success(res) {
 back({
  prevPageData: {
  isPaySuccess: true
  }
 })
 }
 })
 }
})

如果看过globalData 的那些事儿,把 back 方法挂载到 this.$back 下,将会更方便使用:

Page({
 data: {},
 onTopup() {
 wx.requestPayment({
 // ...
 success(res) {
 this.$back({
  prevPageData: {
  isPaySuccess: true
  }
 })
 }
 })
 }
})

总结

简单的 api 也可以变得丰富,一切都是基于日益复杂的业务需求。通过增强 wx.navigateBack 不仅仅可以改变前一个页面的标记位,还可以改变其页面显示数据。比如页面 A 的余额值是小程序通过参数传给 H5 的,而页面 B 充值成功后接口返回用户新的余额。这样就可以在充值成功后直接改变页面 A 的余额数据,而不是先返回到页面 A 再刷新重新请求接口。‘

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
Jun 06 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
Nov 20 Javascript
点击显示指定元素隐藏其他同辈元素的方法
Feb 19 Javascript
Javascript中的五种数据类型详解
Dec 26 Javascript
jQuery实现瀑布流的取巧做法分享
Jan 12 Javascript
jquery插件corner实现圆角边框的方法
Mar 09 Javascript
jquery实现页面关键词高亮显示的方法
Mar 12 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
Dec 19 Javascript
Bootstrap进度条实现代码解析
Mar 07 Javascript
微信小程序左右滚动公告栏效果代码实例
Sep 16 Javascript
解决pycharm双击但是无法打开的情况
Oct 31 Javascript
vue.js+element 默认提示中英文操作
Nov 11 Javascript
vue实现配置全局访问路径头(axios)
Nov 01 #Javascript
vue.js路由mode配置之去掉url上默认的#方法
Nov 01 #Javascript
js实现漂亮的星空背景
Nov 01 #Javascript
Vue实现push数组并删除的例子
Nov 01 #Javascript
vue实现跳转接口push 转场动画示例
Nov 01 #Javascript
JS实现动态星空背景效果
Nov 01 #Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
Nov 01 #jQuery
You might like
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
详解JS数值Number类型
2018/02/07 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
Python 实现随机数详解及实例代码
2017/04/15 Python
python3下载抖音视频的完整代码
2019/06/05 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
建筑专业自荐信
2013/10/18 职场文书
不假外出检讨书
2014/01/27 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
投诉书格式范本
2015/07/02 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL