如何让小程序页面更顺滑_小程序怎样让wx.navigateBack更好用的方法实现

相信只要开发过小程序,对wx.navigateBack 这个 api都不会陌生。在摩拜单车的小程序中,它也被改造的更方便满足复杂的业务需求,可谓之 增强型的 wx.navigateBack。

先来看看官方文档中的用法:

wx.navigateBack({

delta: 2

})

delta 表示返回的层级数。通过具体的业务示例来说明我们如何改造它:

余额充值的例子

两个页面:

A 页面展示用户余额,使用 H5 实现,通过 web-view 嵌套在小程序里

B 页面为用户充值,为了方便使用支付api,用小程序原生页面实现

用户在 B 页面充值完成后返回页面 A,更新用户余额。翻译成技术语言就是:从小程序原生页面返回到 H5 页面,需要刷新。

简单的业务代码如下:

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 再刷新重新请求接口。‘

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编制一个c语言成绩记录簿_C语言基础知识点模拟试题

一、单选题(每题2分,共25题,共50分)执行以下程序后,输出结果是( )int a 255;char c;ca;printf("%d",c);A)255 B)0 C)-3 D)-1有以下程序#include void main( ){ FILE *fp; int i,k0,n0; fpfopen("d1.dat&…

opencv方框内图像保存_opencv::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件...

/*** file main-opencv.cpp* date July 2014* brief An exemplative main file for the use of ViBe and OpenCV*///#include #include "vibe-background-sequential.h"using namespacecv;using namespacestd;const int minArea 2; //舍去面积极小的方框const doubl…

闪灯什么意思_开夜车被对方闪了一下是什么意思?老司机:灯语都不懂,晚上别开车...

阅读本文前,请您先点击上面的“蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享,完全是免费订阅,请放心关注。 注:本文转载自网络&#xff…

android radiogroup 获取点击位置_屏幕连点器,解放双手[Android]

这里是“微友集市”,我们坚持分享优质的资源,让更多人能用到更好的资源,少花冤枉钱。如果你有什么需要,可以给我们留言,我们会努力去为你寻找,或许你需要的,也是别人需要的...1自动点击器 是一款…

c语言 freopen txt_C语言文件操作函数freopen详细解析

今天做USACO 用到了文件的操作。 之前做USACO只是格式化的些 写 freopen("xxx.in","r",stdin) 和"freopen("xxx.out","w",stdout)"百度百科上是这么介绍的:函数名: freopen功 能: 替换一个流,或者…

apache poi excel显示 base64 图片_数据处理之带图片Excel数据处理解惑

小编最近项目中遇到一个大批量Excel数据提取的问题,因为Excel数据中含有图片,所以在程序处理时遇到了困难,小编花了点时间才解决了这个问题,所以在这里mark一下。1 问题描述首先来描述一下数据处理的需求,如下图所以是…

qt连接mysql创建表_如何在Qt中创建mysql数据库表?

我想创建表到MySQL数据库。我能够成功地打开数据库,但包含创建表命令不起作用的查询? 如果有人知道它,请让我知道我会很感激。如何在Qt中创建mysql数据库表?mydb QSqlDatabase::addDatabase("QMYSQL");mydb.setDatabas…

mysql加锁后怎么解除_Mysql查看死锁与解除死锁的深入讲解

前言前段时间遇到了一个Mysql 死锁相关的问题,整理一下。问题描述:Mysql 的修改语句似乎都没有生效,同时使用Mysql GUI 工具编辑字段的值时会弹出异常。什么是死锁在解决Mysql 死锁的问题之前,还是先来了解一下什么是死锁。死锁是…

mysql ssd优化_mysql ssd 优化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

mysql查询工具哪个好_一个比较实用的数据库查看管理工具

个人从业四年多,和数据库打交道不计其数,特别是在之前做企业级应用系统的时候,整天就是在业务、数据和程序之间穿梭,那个数据查的呀,平均每天有40% 左右的时间都在手工的写sql进行数据的查询。刚开始,通过数…

mysql运维机制_《MySQL运维内参》节选 | InnoDB日志管理机制(一)

引 子InnoDB 存储引擎是支持事务ACID特性的,它是以二十多年前IBM的一篇著名文章《ARIES:A Transaction Recovery Method Supporting Fine-Granularity Locking and PartialRollbacks Using Write-Ahead Logging》为理论基础,大多数关系型数据库的实现都是…

mysql 多个实例 备份_Linux下安装Mysql多实例作为数据备份服务器实现多主到一从多实例的备份...

1、从MYSQL官方下载MYSQL的源码版本【一定要是源码版本】2、按以下代码键入LINUX命令行[注] 添加mysql组和用户#groupadd mysql#useradd -g mysql mysql[注] 解包到/usr/local# tar -xzf mysql-standard-4.1.9-pc-linux-gnu-i686.tar.gz -C /usr/local[注] 建立软链接&#xff…

数mysql据分析优化_从零开始学习数据分析-mysql架构与优化理论

mysql的逻辑分层:连接层 服务层 引擎层 存储层引擎层主要分为两类:InnoDB、MyIsam(使用show engines;查看)InnoDB是事务优先的,会进行行锁,适合高并发操作MyIsam是性能优先的,进行表锁sql优化点:等待时间长…

检验int值在list中是否存在_R语言统计与绘图:卡方检验

卡方检验在计数资料中的应用,包括推断两个总体率或构成比之间有无差别、多个总体率或构成比之间有无差别、多个样本率间的多重比较、两个分类变量之间有无关联性、多维列联表的分析和频数分布拟合优度的卡方检验。选自:周支瑞老师下面分别介绍计数资料怎…

mysql in 多个字段_MySQL如何同时自增自减多个字段

“本文将带大家聊一下如何同时自增自减多个字段”前言最近小Q同学去面试了,然后就问了题目的问题,如何同时自增自减多个字段。小Q一时回答不出来,最终的结果就是回家等通知....关于这个问题咔咔来给小Q简单的进行解答一下。一、ThinkPHP框架实…

wxpython 调用子窗口_wxpython入门第一步(简单例子)

在这部分wxPython教程中,我们将创建一些简单的例子。简单的例子​ 我们从一个非常简单的例子开始。我们的第一个脚本将只显示一个小窗口。它不会做太多事情。我们将逐行分析这个脚本。# simple.pyimport wxapp wx.App()frame wx.Frame(None, )frame.Show()app.Mai…

orderd mysql_Oracle入门教程:leading vs ordered hint

odered hint 可以指示oracle 使用from 关键字后面的表的顺序进行join连接!cbo会优先按照from 后面的表的顺序来进行join,当统计leading hint 可以指示Oracle使用leading 中指定的表作为驱动表,比如 正常的访问计划如下SCOTT> select e.ename, hiredat…

sed mysql配置文件_shell解析my.cnf配置文件

my.cnf配置格式如下vi my.cnf[client]port3306socket/tmp/mysql.socket[mysqld]port3306server-id1datadir/usr/local/mysql/data[mysqld_safe]port3306more parseMy.sh#!/bin/bashcnf$(cd dirname $0;pwd)"/my.cnf"#得到区块数组g_sec(sed -n ‘/\[*\]/p‘ $cnf |gr…

mysql标识列从一开始_mysql中标识列是什么意思有什么用

标识列是什么?标识列又称为自增长列。含义:可以不用手动的插入值,系统提供默认的序列值特点:1、标识列必须和主键搭配吗?不一定,但要求是一个key2、一个表可以有几个标识列?至多一个&#xff01…

mysql 及时点还原_mysqlbinglog基于即时点还原

mysqlbinlog介绍要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。(mysql5.7开启binglog 时需要同时设置server-id否则无法启动)要想确定当前的二进制日志文件…