小程序怎样让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实现点击输入框弹出窗体选择信息
Dec 11 Javascript
js获取视频时长代码
Apr 10 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
PHP PDO操作总结
Nov 17 Javascript
基于jquery实现图片上传本地预览功能
Jan 08 Javascript
js 倒计时(高效率服务器时间同步)
Sep 12 Javascript
vue中vee validate表单校验的几种基本使用
Jun 25 Javascript
Vue-router 切换组件页面时进入进出动画方法
Sep 01 Javascript
微信小程序框架的页面布局代码
Aug 17 Javascript
vue.js购物车添加商品组件的方法
Sep 17 Javascript
vue + elementUI实现省市县三级联动的方法示例
Oct 29 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 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
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
功能强大的php文件上传类
2016/08/29 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
vue $mount 和 el的区别说明
2020/09/11 Javascript
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
Python基础教程之异常详解
2019/01/10 Python
python实现名片管理器的示例代码
2019/12/17 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
品德评语大全
2014/05/05 职场文书
安全生产年活动总结
2014/08/29 职场文书
护士节慰问信
2015/02/15 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫