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>