需求背景

在开发过程中,总会有需求是在用户返回前做一些事情,而目前小程序提供的并没有直接支持,需要点奇淫巧技才可以。

解决方案

利用page-componentbind:beforeleave来捕获到页面返回。整体思路:

  • 在页面插入一个page-container, z-index设置成-1,把页面其他元素设置定位,覆盖在该组件上,将page-container隐藏起来。
  • 添加bind:beforeleave事件监听,再用户触发返回时可以捕获到。
  • 用户触发返回后,page-container组件会被销毁,需要重新插入。可以利用setDatewx:if 来实现。 这有就实现了对返回操作的监听

代码实现

<page-container
  wx:if="{{isHackGobackTrackPageComponent}}"
  show="{{true}}"
  bind:beforeleave="beforeleave"
  z-index="{{-1}}"
>
</page-container>
{
  data: {
    ...
    isHackGobackTrackPageComponent: true
    ...
  },
  ...
  beforeleave() {
    this.setData(
      {
        isHackGobackTrackPageComponent: false
      },
      () => {
        setTimeout(() => {
          this.setData({
            isHackGobackTrackPageComponent: true
          })
        }, 100)
      }
    )
    wx.showModal({
      title: '提示',
      content: '确认要退出吗?',
      success: res => {
        if (res.confirm) {
          console.log('用户点击确认')
          // TODO
        } else if (res.cancel) {
          console.log('用户点击取消')
        }
      }
    })

  }
  ...
}

相关API

disableSwipeBack

禁止滑动返回,只能通过点击,这个时候就可以捕获到退出页面,但功能已下线

wx.enableAlertBeforeUnload

enableAlertBeforeUnload 是小程序提供的开启小程序页面返回询问对话框。功能局限性太高,且安卓手势返回并不支持。

相关阅读