怎么理解wx.navigateTo的events参数使用详情

遇到一个这样的业务需求, 用户点击提现按钮, 跳转到提现处理结果页面, 为了避免提现请求被重复提交, 所以需要在用户点击了提交按钮以后就把按钮锁起来不给用户提交, 在拿到请求结果以后再把按钮打开
先看界面

再看实现逻辑

onWithdraw () {
 console.log('加锁', this.data.isWithdrawing)
 if (this.data.isWithdrawing) return
 // isWithdrawing要在data中初始化为false
 this.data.isWithdrawing = true
 console.log('按照预期, 这里在跳转之前应该只执行一次', this.data.isWithdrawing)

 req.redpack.withdraw(this.data.withDrawAmount, this.data.currentCardId)
  .then(res => {
   // 请求参数不用看, 是封装的方法
   if (res.code === 201) {
    this.data.isWithdrawing = true
    wx.navigateTo({
     url: '/pages/redpack/withdrawResult/withdrawResult'
    })
   }
  })
}

于是我输入金额, 疯狂的点击按钮, 看到的是这样的

难道应该把this.data.isWithdrawing = true放在 wx.navigateTo后?于是测试, 无果(有兴趣的同学可以试试)

于是, 我打开了微信官方文档

噢...我懂了, this.data.isWithdrawing = true应该放在complete回调里去支持, 于是我把代码改成这样:

测试

额......

由此我推断, complete回调是在页面跳转前执行的, 跳转前把锁解开, 然后我手速又比较快, 所以才出现了多次执行的情况, 那究竟要怎么处理呢?

再次翻阅文档, 一个event参数吸引了我, 但是官方写得有点模糊, 于是自己进行了代码的测试, 下面将我的理解分享给大家, 我喜欢用图形来表达, 请看图:

重点重点重点:

1) eventChannel是页面跳转时产生的一个独立于页面外的对象, 父页面和子页面都可以在eventChannel里面定义方法, 而eventChannel里面的方法在某种意义上是可以操作两个页面的数据的
2) 父页面通过events参数定义父方法一, 父方法二...
3) 子页面通过this.getOpenerEventChannel()拿到eventChannel对象, 并且通过eventChannel.on来定义子方法一, 子方法二...
4) 父页面通过success或者complete里面的res拿到eventChannel对象, 并通过res.eventChannel.emit来触发子页面通过eventChannel.on定义的方法
5) 子页面通过this.getOpenerEventChannel()拿到eventChannel对象执行emit来触发父页面定义的方法
6) 最后, 我所说的父方法, 子方法, 其实都是定义在eventChannel上的, 这样说只是方便大家理解, 父页面应该也也是可以通过emit去触发自己在events里面定义的方法的, 但是这样没有意义, 所以, 我就不做测试了,因为没有人会傻到自己跟自己通信吧, 哈哈哈...

再回到我们一开始的业务需求:
我们是不是可以这样操作, 在子页面显示的以后再去把父页面的锁打开呢?这样不就避免了重复提交的问题了吗?(当然有人会问我, 你为什么搞得这么复杂?直接锁死不就好了吗?但是你是够考虑到这样一种情况, 用户在提现以后, 又点击了后退页面, 再次进行提现, 这样你的锁还开着, 第二不就不能提现了吗?)
好了, 下面我们来实现代码
父页面:

子页面:

结果:

点返回, 再次提现

妥妥的....

到此这篇关于怎么理解wx.navigateTo的events参数使用详情的文章就介绍到这了,更多相关wx.navigateTo的events参数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 微信小程序wx.navigateTo方法里的events参数使用详情及场景

    个人理解wx.navigateTo方法里的events参数使用详情及场景 微信小程序在2.7.3版本wx.navigateTo这个方法中新增了events这个属性 微信官方文档里面写的很模糊,在微信公众平台的社区里也有一些人在问,我第一次看到也是先百度了一下使用场景,搜到的也只是copy官方文档的抄袭党,并没什么卵用,相信大家都是看的一头雾水,所以用业余时间研究了一下,以下仅代表个人的理解,如果有更好的想法或者使用不当的地方希望大家提出防止我的个人想法误导大家 个人理解这个新增的属性使用的场景就

  • 怎么理解wx.navigateTo的events参数使用详情

    遇到一个这样的业务需求, 用户点击提现按钮, 跳转到提现处理结果页面, 为了避免提现请求被重复提交, 所以需要在用户点击了提交按钮以后就把按钮锁起来不给用户提交, 在拿到请求结果以后再把按钮打开 先看界面 再看实现逻辑 onWithdraw () { console.log('加锁', this.data.isWithdrawing) if (this.data.isWithdrawing) return // isWithdrawing要在data中初始化为false this.data.is

  • 微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步

    小程序wx.navigateTo路由方法中新增加了events属性,可以用于监听被打开页面发送到当前页面的数据.基础库 2.7.3 开始支持. 相关文档链接:https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html 基本使用方法文档中已经有示例,可以参考 上级页面 新打开页面 通过上面的方法,小程序可以实现不同页面直接互相调用相关方法,也能进行页面间传值等处理 以上就是本文的全部内容,希望对大家的学

  • 微信小程序出现wx.navigateTo页面不跳转问题的解决方法

    本文实例讲述了微信小程序出现wx.navigateTo页面不跳转问题的解决方法.分享给大家供大家参考,具体如下: 今天在做微信小程序的时候,做的商品购买流程.流程是这样的: 商品展示-->商品详情-->下单页面-->下单详情页面-->支付结果页面-->跳转订单详情页面. 但是在支付成功之后,点击按钮跳转,发现怎么也跳转不了到订单详情页面,前后log都能打印出来,证明已经执行了wx.navigateTo方法,但是跳转不成功,而且,坑爹的是也不报错. 翻看微信小程序开发文档,参考

  • 深入理解python中函数传递参数是值传递还是引用传递

    目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用"的方式.实际上,这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典 或者列表)的引用,就能修改对象的原始值--相当于通过"传引用"来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能 直接修改原始对象--相当于通过"传值"来传递对象. 你可以在很多讨论该问题

  • Vue 列表页带参数进详情页的操作(router-link)

    首先,仔细看文档!!!一点一点的踩坑过来的~~~ 这里介绍params和query两种方法 1.用params传参 列表页: <router-link :to="{ name:'msgDetail', params: {id: item.msg_id} }">(注意:用params传参这里是命名路由,用name) </router-link> 路由配置如下: export default new Router({ routes: [ { path: '/msgD

  • Python argparse 解析命令行参数模块详情

    目录 一.预备知识 1.安装 2.使用的一般步骤 二.实操笔记 1.函数详解 1.1ArgumentParser 1.2add_argument 2.调用实例 一.预备知识 argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行参数. 1.安装 argsparse是python的命令行解析的标准模块,内置于python,不需要安装.使用的时候直接: import argparse 2.使用的一般步骤 这

  • 理解Python中函数的参数

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解. Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码. 默认参数 我们仍以具体的例子来说明如何定义函数的默认参数.先写一个计算x2的函数: def power(x

  • 你都理解创建线程池的参数吗?

    多线程可以说是面试官最喜欢拿来问的题目之一了,可谓是老生之常谈,不管你是新手还是老司机,我相信你一定会在面试过程中遇到过有关多线程的一些问题.那我现在就充当一次面试官,我来问你: 现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为5,此时有4个任务同时进来,问:线程池会创建几条线程? 如果4个任务还没处理完,这时又同时进来2个任务,问:线程池又会创建几条线程还是不会创建? 如果前面6个任务还是没有处理完,这时又

  • 小程序跨页面交互的作用与方法详解

    去年年末,微信小程序的分包大小已经到达了 12M 大小,一方面说明小程序的确逐步为开发者放开更大的权限,另一方面也说明了对于某些小程序 8M 的大小已经不够用了.我个人今年也是在开发一个 to B 小程序应用.这里列举一些跨页面交互的场景. 对于 B 端应用的业务需求来说,小程序开发的复杂度相对比网页开发要复杂一些.一个是双线程的处理机制问题,另一个是页面栈之间交互问题. 注: 笔者目前只需要开发微信小程序,为了在小程序页面中可以使用 properties behaviors observers

随机推荐