uniapp自定义返回事件
在我们使用uniapp时,我们导航栏一般都是自定义的,比如用uview框架的导航栏,那么返回事件通常会遇到以下几个问题
- 返回事件前需要做一些额外的处理
- h5项目刷新页面后返回失效
- 返回按钮点击后到指定页面
如果只是监听返回按钮,可以通过onBackPress实现,但是很多时候为了开发起来维护方便,一般都是写一个导航栏组件统一管理,于是我这边简单封装了下导航栏组件。
核心代码如下:
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插槽右侧按钮
使用起来也方便
<navbar title="标题"/><navbar title="标题" custom-url="/pages/meu/index" page-type="switchTab"/><navbar title="标题"><view class="navbar-right" @click="saveEvent">自定义右侧按钮</view></navbar>
完整代码如下
<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>