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>
相关推荐
Ajie'Blog9 分钟前
Claude Opus 4.8 发布:Claude Code 能不能接住复杂项目
服务器·前端·javascript·人工智能·ai编程
2501_9181269110 分钟前
火柴人踢任意球
javascript·css·css3
晓得迷路了43 分钟前
栗子前端技术周刊第 132 期 - date-fns 支持 Temporal、npm 攻击事件、VoidZero...
前端·javascript·css
ct9781 小时前
Promise
前端·javascript·vue.js
怕浪猫1 小时前
Electron 开发实战(十一):自动更新机制|服务架构、公私网更新、版本回滚全解
前端·javascript·electron
AI视觉网奇1 小时前
three-bvh-csg glb分割
开发语言·前端·javascript
很楠爱上1 小时前
TypeScript 核心知识精要
javascript·ubuntu·typescript
rising start1 小时前
五、Vue3 ref 用法 + Props 完整指南
前端·javascript·vue.js
web打印社区1 小时前
前端html转换pdf并静默打印pdf最佳实现路径
前端·javascript·vue.js·electron·html
Curvatureflight2 小时前
浏览器音频采集实践:麦克风权限、降噪、回声消除与 PCM 转换
前端·javascript·音视频·信息与通信·web·pcm