小程序怎样让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与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
Mar 12 Javascript
js 禁用只读文本框获得焦点时的退格键
Apr 25 Javascript
jQuery源码中的chunker 正则过滤符分析
Jul 31 Javascript
JS删除数组元素的函数介绍
Mar 27 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
Oct 16 Javascript
js实现使用鼠标拖拽切换图片的方法
May 04 Javascript
浅谈Javascript数组索引
Jul 29 Javascript
用js实现放大镜的效果的简单实例
May 23 Javascript
js实现键盘自动打字效果
Dec 23 Javascript
js Date()日期函数浏览器兼容问题解决方法
Sep 12 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 Javascript
详解mpvue开发微信小程序基础知识
Sep 23 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实现以只读方式打开文件的方法
2015/03/16 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
python 消除 futureWarning问题的解决
2019/12/25 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
办公室文员工作职责
2014/01/31 职场文书
篝火晚会策划方案
2014/05/16 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
医德医风自我评价2015
2015/03/03 职场文书
廉洁自律证明
2015/06/24 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书