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>
相关推荐
老码沉思录35 分钟前
写给初学者的React Native 全栈开发实战班
javascript·react native·react.js
我不当帕鲁谁当帕鲁39 分钟前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂43 分钟前
工程化实战内功修炼测试题
前端·javascript
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html
Dread_lxy6 小时前
vue 依赖注入(Provide、Inject )和混入(mixins)
前端·javascript·vue.js
奔跑草-7 小时前
【前端】深入浅出 - TypeScript 的详细讲解
前端·javascript·react.js·typescript
羡与7 小时前
echarts-gl 3D柱状图配置
前端·javascript·echarts
前端郭德纲7 小时前
浏览器是加载ES6模块的?
javascript·算法
JerryXZR7 小时前
JavaScript核心编程 - 原型链 作用域 与 执行上下文
开发语言·javascript·原型模式