import Taro from '@tarojs/taro'
import { showToast } from '@utils/util.common'
export function getCurrentRoute (): string {
const pages = Taro.getCurrentPages()
return pages?.[pages.length - 1]?.route ?? ''
}
export async function backHandler (delta: number = 1): Promise<boolean> {
const length: number = Taro.getCurrentPages()?.length
if (length === 1) {
console.error('禁止在首页调用此方法')
return Promise.resolve(false)
}
return new Promise(resolve => {
Taro.navigateBack({
fail: () => resolve(false),
success: () => resolve(true),
delta: delta === -1 ? length : delta
})
})
}
export async function backToHandler (path: string): Promise<boolean> {
const pages = Taro.getCurrentPages() ?? {}
const len: number = pages.length ?? 0
let delta: number = 0
for (let i: number = 1; i <= len; i++) {
if (pages?.[len - i]?.route !== path) {
delta++
} else {
break
}
}
return backHandler(delta)
}
const baseRouterHandle = (method: string): Function => (path: string, params: object, force: boolean = false): Promise<boolean> => {
const route = getCurrentRoute()
if (!force && path.includes(route)) {
return Promise.resolve(false)
}
let paramsJsonStr: string
try {
paramsJsonStr = JSON.stringify(params)
} catch (error) {
showToast(error)
return Promise.resolve(false)
}
return new Promise(resolve => {
Taro[method]({
url: `/${path}?data=${paramsJsonStr}`,
fail: () => resolve(false),
success: () => resolve(true)
})
})
}
export const navigateHandler = baseRouterHandle('navigateTo')
export const redirectHandler = baseRouterHandle('redirectTo')
export const getRouteParams = (params) => {
let routeParams = {}
try {
const data = JSON.parse(params.data as string)
routeParams = Object.freeze(data)
} catch (error) {
console.error(error)
}
return routeParams
}
配合FC组件使用的hook函数
import { useRef } from 'react'
import { useRouter } from '@tarojs/taro'
const defaultRouteParams = Object.freeze({ data: {}, parse: false })
interface UseVnRouterRes {
[keyProp: string]: any
}
export default function useVnRouter (): UseVnRouterRes {
const { params } = useRouter()
const routeParams = useRef(defaultRouteParams)
if (!routeParams.current.parse) {
try {
const data = JSON.parse(params.data as string)
routeParams.current = Object.freeze({ data, parse: true })
} catch (error) {
routeParams.current = defaultRouteParams
}
}
return routeParams.current.data
}