小程序怎样让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 相关文章推荐
jQuery 动画基础教程
Dec 25 Javascript
js列举css中所有图标的实现代码
Jul 04 Javascript
jquery动态加载图片数据练习代码
Aug 04 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
Apr 03 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
May 01 Javascript
js中的json对象详细介绍
Oct 29 Javascript
JavaScript的9种继承实现方式归纳
May 18 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
基于bootstrap插件实现autocomplete自动完成表单
May 07 Javascript
移动端横屏的JS代码(beta)
May 16 Javascript
js实现双人五子棋小游戏
May 28 Javascript
详解vue 组件
Jun 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调用三种数据库的方法(1)
2006/10/09 PHP
php 空格,换行,跳格使用说明
2009/12/18 PHP
curl 出现错误的调试方法(必看)
2017/02/13 PHP
PHP时间函数使用详解
2019/03/21 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
js Event对象的5种坐标
2011/09/12 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
学习python (1)
2006/10/31 Python
判断网页编码的方法python版
2016/08/12 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python生成器推导式用法简单示例
2019/10/08 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
Python如何给函数库增加日志功能
2020/08/04 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
党支部季度考核意见
2015/06/02 职场文书
机器人总动员观后感
2015/06/09 职场文书
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
golang的文件创建及读写操作
2022/04/14 Golang
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python