小程序怎样让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 自动播放的实例代码
Nov 19 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
JavaScript类型系统之Object详解
Jan 07 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
Sep 08 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 Javascript
详解微信小程序 页面跳转 传递参数
Dec 08 Javascript
livereload工具实现前端可视化开发【推荐】
Dec 23 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
jquery animate动画持续运动的实例
Nov 29 jQuery
js计算两个时间差 天 时 分 秒 毫秒的代码
May 21 Javascript
对vue中的事件穿透与禁止穿透实例详解
Oct 28 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 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
PHP中几个常用的魔术常量
2012/02/23 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
万能的php分页类
2017/07/06 PHP
php实现登录页面的简单实例
2019/09/29 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
js实现上传图片及时预览
2016/05/07 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
几种tab切换详解
2017/02/03 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
python操作MySQL数据库的方法分享
2012/05/29 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
python查看模块安装位置的方法
2018/10/16 Python
python基于递归解决背包问题详解
2019/07/03 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
为什么需要版本控制?
2013/08/08 面试题
我的画教学反思
2014/04/28 职场文书
基层党员对照检查材料
2014/09/24 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android