小程序怎样让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修改css样式style
Apr 15 Javascript
SeaJS入门教程系列之使用SeaJS(二)
Mar 03 Javascript
JavaScript编程的单例设计模讲解
Nov 10 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
Jun 24 Javascript
jQuery判断邮箱格式对错实例代码讲解
Apr 12 jQuery
JS实现div模块的截图并下载功能
Oct 17 Javascript
浅谈在react中如何实现扫码枪输入
Jul 04 Javascript
微信小程序实现天气预报功能
Jul 18 Javascript
浅谈vue 组件中的setInterval方法和window的不同
Jul 30 Javascript
如何基于viewport vm适配移动端页面
Nov 13 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
flash javascript之间的通讯方法小结
2008/12/20 Javascript
javascript 函数使用说明
2010/04/07 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
教你安装python Django(图文)
2013/11/04 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
教师应聘自荐信范文
2014/03/14 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书