zgg-ui
Version:
2.0.1 正式版本 基于 Vue 3、UniApp 和 TypeScript 开发的多端适配移动端 UI 组件库,旨在提供丰富的组件集合,帮助开发者快速构建多端响应式的移动应用界面
128 lines (121 loc) • 2.97 kB
text/typescript
import z from '../libs/z'
type navType = 'navigateTo' | 'redirectTo' | 'reLaunch' | 'switchTab'
/**
* 判断是否有跳转操作正在执行
*/
let isNavigating = false
/**
* 返回上一页
* @param indexUrl 首页地址
* @param delta 返回的页面数,如果 delta 大于现有页面数,则返回到首页
*/
export function zNavBack(indexUrl?: string, delta = 1) {
/**
* 有操作直接返回
*/
if (isNavigating) return
isNavigating = true
const indexPageUrl = z.isEmptyVariableInDefault(
indexUrl,
'/pages/index/index'
)
// 通过判断当前页面的页面栈信息,是否有上一页进行返回,如果没有则跳转到首页
const pages = getCurrentPages()
if (pages?.length) {
const firstPage = pages[0]
if (
pages.length === 1 &&
(!firstPage.route || firstPage?.route != indexPageUrl)
) {
return zNavPage(indexPageUrl, 'reLaunch')
} else {
uni.navigateBack({
delta,
complete: () => {
isNavigating = false
},
})
return Promise.resolve()
}
} else {
return zNavPage(indexPageUrl, 'reLaunch')
}
}
/**
* 跳转到指定页面
* @param url 页面地址
* @param type 跳转类型
*/
export function zNavPage(url: string, type: navType = 'navigateTo') {
/**
* 有操作直接返回
*/
if (isNavigating) return
isNavigating = true
function handelNavFail(err: any) {
z.error(`zNavPage 跳转页面失败: ${err}`)
}
return new Promise<void>((resolve, reject) => {
switch (type) {
case 'navigateTo':
uni.navigateTo({
url,
success: () => {
resolve()
},
fail: (err) => {
handelNavFail(err)
reject(err)
},
complete: () => {
isNavigating = false
},
})
break
case 'redirectTo':
uni.redirectTo({
url,
success: () => {
resolve()
},
fail: (err) => {
handelNavFail(err)
reject(err)
},
complete: () => {
isNavigating = false
},
})
break
case 'reLaunch':
uni.reLaunch({
url,
success: () => {
resolve()
},
fail: (err) => {
handelNavFail(err)
reject(err)
},
complete: () => {
isNavigating = false
},
})
break
case 'switchTab':
uni.switchTab({
url,
success: () => {
resolve()
},
fail: (err) => {
handelNavFail(err)
reject(err)
},
complete: () => {
isNavigating = false
},
})
}
})
}