小程序怎样让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 相关文章推荐
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
May 07 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
Aug 13 Javascript
Node.js插件的正确编写方式
Aug 03 Javascript
JavaScript分秒倒计时器实现方法
Feb 02 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
Mar 29 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
详解React 16 中的异常处理
Jul 28 Javascript
d3.js实现自定义多y轴折线图的示例代码
May 30 Javascript
vue和webpack打包项目相对路径修改的方法
Jun 15 Javascript
微信小程序返回上一页传参并刷新过程解析
Dec 13 Javascript
JS函数本身的作用域实例分析
Mar 16 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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
表单JS弹出填写提示效果代码
2011/04/16 Javascript
子页向父页传值示例
2013/11/27 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
【python】matplotlib动态显示详解
2019/04/11 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
会计自我鉴定
2014/02/04 职场文书
采购意向书范本
2014/03/31 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
贷款担保书范文
2014/05/13 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
升学宴学生答谢词
2015/01/05 职场文书
简历自我评价范文
2019/04/24 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS