uniapp自定义返回事件(封装)

uniapp自定义返回事件

在我们使用uniapp时,我们导航栏一般都是自定义的,比如用uview框架的导航栏,那么返回事件通常会遇到以下几个问题

  • 返回事件前需要做一些额外的处理
  • h5项目刷新页面后返回失效
  • 返回按钮点击后到指定页面

如果只是监听返回按钮,可以通过onBackPress实现,但是很多时候为了开发起来维护方便,一般都是写一个导航栏组件统一管理,于是我这边简单封装了下导航栏组件。

核心代码如下:

javascript 复制代码
  customBack (callback) {
    if (this.customUrl) {
      uni[this.pageType]({url:this.customUrl })
      return
    }
    const pages = getCurrentPages()
    if (callback) {
      callback()
    }else  {
      if(pages.length === 1) {
        history.back()
      }	else {
        uni.navigateBack()
      }
    }
  }
  • (参数)customUrl 自定义跳转路径
  • (参数)pageType 跳转类型,如navigateTo、redirectTo、switchTab
  • (参数)callback 回调函数,一般用于处理一些额外逻辑
  • (参数)isOverlay 这个是我根据自己的业务需求加的,本身导航栏会占位,部分页面需要不占位,下面代码中有这个参数。
  • getCurrentPages 获取页面栈,如果h5项目刷新后,将会被清除页面栈,这个时候如果要返回上一级,则需要调用浏览器的返回方法history.back()
  • sort插槽右侧按钮

使用起来也方便

html 复制代码
  <navbar title="标题"/>

  <navbar title="标题" custom-url="/pages/meu/index" page-type="switchTab"/>

  <navbar title="标题">
    <view class="navbar-right" @click="saveEvent">自定义右侧按钮</view>
  </navbar>

完整代码如下

html 复制代码
  <template>
    <u-navbar :title="title" :is-back='isBack' :class="isOverlay ? 'overlay' : ''" :custom-back='customBack'>
      <template slot="right">
        <slot></slot>
      </template>
    </u-navbar>
  </template>
  <script>
    export default {
      props: {
        title: {
          type: String,
          default: ''
        },
        isBack: { // 是否显示返回按钮
          type: Boolean,
          default: true
        },
        isOverlay: { // 是否遮罩页面上(不占位)
          type: Boolean,
          default: false
        },
        customUrl: { // 自定义跳转地址
          type: String,
          default: ''
        },
        pageType: { // 跳转方式
          type: String,
          default: 'navigateTo'
        }
      },
      methods: {
        customBack (callback) {
          if (this.customUrl) {
            uni[this.pageType]({url:this.customUrl })
            return
          }
          const pages = getCurrentPages()
          if (callback) {
            callback()
          }else  {
            if(pages.length === 1) {
              history.back()
            }	else {
              uni.navigateBack()
            }
          }
        }
      }
    }
  </script>

  <style lang="scss" scoped>
    .overlay{
      ::v-deep {
        .u-navbar-fixed{
          background: transparent !important;
        }
        .u-navbar-placeholder{
          display: none;
        }
      }
      
    }
  </style>
相关推荐
Dream-Y.ocean28 分钟前
鸿蒙PC平台星图遥感适配实战:基于 Electron 壳方案的纯 JavaScript 遥感图像处理引擎开发
javascript·electron·harmonyos
螺丝钉tina1 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
Highcharts.js3 小时前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
Java后端的Ai之路3 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
薛定谔的猫-菜鸟程序员4 小时前
Electron开发超详细教程(从入门到放弃)
前端·javascript·electron
htzyl2065 小时前
前端阶梯——第四十三章、实战二:待办清单To-Do
前端·javascript·html
程序员大阳5 小时前
HTML+CSS+JS对话式实战(1)-开篇:认识我们要做的社团活动发布平台
javascript·css·html·实战·系统·平台·社团活动发布
速易达网络5 小时前
Three.js 动画入门教学:从场景搭建到流畅动效
开发语言·javascript·ecmascript
Hilaku6 小时前
CORS 到底在保护谁?90% 的前端理解错了跨域的本质
前端·javascript·程序员