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>
相关推荐
清汤饺子1 分钟前
OpenClaw 本地部署教程 - 从 0 到 1 跑通你的第一只龙虾
前端·javascript·vibecoding
颜酱18 分钟前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
橙某人4 小时前
LogicFlow 小地图性能优化:从「实时克隆」到「占位缩略块」!🚀
前端·javascript·vue.js
boooooooom5 小时前
讲清 Proxy + effect + track/trigger 流程
javascript·vue.js·面试
leafyyuki5 小时前
在 Vue 项目中玩转 FullCalendar:从零搭建可交互的事件日历
前端·javascript·vue.js
豆苗学前端5 小时前
彻底讲透浏览器缓存机制,吊打面试官
前端·javascript·面试
swipe6 小时前
箭头函数与 this 面试题深度解析:从原理到实战
前端·javascript·面试
进击的尘埃7 小时前
拖拽搭建场景下的智能布局算法:栅格吸附、参考线与响应式出码
javascript
小猪努力学前端7 小时前
基于PixiJS的试玩广告开发-续篇
前端·javascript·游戏
wuhen_n8 小时前
v-model 的进阶用法:搞定复杂的父子组件数据通信
前端·javascript·vue.js