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>
相关推荐
用户9163574409515 分钟前
LeetCode热题100——15.三数之和
javascript·算法
skykun15 分钟前
都2026年了还在说闭包吗?
javascript
饮水机战神19 分钟前
小程序被下架后,我连夜加了个 "安全接口"
前端·javascript
柯南二号32 分钟前
【大前端】 TypeScript vs JavaScript:全面对比与实践指南
前端·javascript·typescript
用户9047066835744 分钟前
uniapp Vue3版本,用pinia存储持久化插件pinia-plugin-persistedstate对微信小程序的配置
前端·uni-app
Larry_Yanan1 小时前
QML学习笔记(三十一)QML的Flow定位器
java·前端·javascript·笔记·qt·学习·ui
拉不动的猪1 小时前
从底层逻辑和实用性来分析ref中的值为什么不能直接引用
前端·javascript·面试
enki08152 小时前
【CANN训练营】+开源之星+GitCode算子开发环境快速搭建手册
javascript·ecmascript·jquery
通往曙光的路上2 小时前
vue啊哈哈哈哈哈哈哈哈
前端·javascript·vue.js
进阶的鱼2 小时前
React+ts+vite脚手架搭建(四)【mock篇】
前端·javascript·react.js