小程序怎样让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做flash做的事..才完成的一个类.Auntion Action var 0.1
Feb 23 Javascript
Mootools 1.2教程 滚动条(Slider)
Sep 15 Javascript
javascript下4个跨浏览器必备的函数
Mar 07 Javascript
JS中confirm,alert,prompt函数使用区别分析
Apr 01 Javascript
Array.prototype 的泛型应用分析
Apr 30 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
May 15 Javascript
JS打字效果的动态菜单代码分享
Aug 21 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
JS设置CSS样式的方式汇总
Jan 21 Javascript
javascript+jQuery实现360开机时间显示效果
Nov 03 jQuery
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
Jul 31 jQuery
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安全编程之加密功能
2006/10/09 PHP
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
Javascript点击按钮随机改变数字与其颜色
2016/09/01 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
利用nohup来开启python文件的方法
2019/01/14 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
python 错误处理 assert详解
2020/04/20 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
小学一年级评语大全
2014/04/22 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
设备技术员岗位职责
2015/04/11 职场文书
欠条格式范本
2015/07/03 职场文书
MySQL基础(一)
2021/04/05 MySQL
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL