peixue-dev/peidu/uniapp/utils/navigation.js

140 lines
3.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 统一的页面跳转工具
* 自动判断是否为 tabBar 页面,使用正确的跳转方法
*/
// tabBar 页面列表
const TAB_BAR_PAGES = [
'/pages/index/index',
'/pages/service/list',
'/pages/booking/quick-booking',
'/pages/order/list',
'/pages/user/index'
]
/**
* 智能跳转页面
* @param {String} url - 页面路径(可以包含参数)
* @param {Object} options - 额外选项
* @param {String} options.method - 强制使用的跳转方法navigateTo, redirectTo, switchTab, reLaunch
*/
export function navigateTo(url, options = {}) {
// 提取路径和参数
const [path, queryString] = url.split('?')
// 判断是否为 tabBar 页面
const isTabBar = TAB_BAR_PAGES.includes(path)
if (isTabBar) {
// tabBar 页面不支持传参,需要使用本地存储
if (queryString) {
console.warn(`[Navigation] tabBar 页面不支持传参: ${url}`)
console.warn('[Navigation] 请使用 navigateToTabBar 方法并传递 params 对象')
// 解析参数
const params = {}
queryString.split('&').forEach(item => {
const [key, value] = item.split('=')
params[decodeURIComponent(key)] = decodeURIComponent(value)
})
// 保存到本地存储
const storageKey = getStorageKey(path)
uni.setStorageSync(storageKey, params)
}
// 使用 switchTab 跳转
uni.switchTab({ url: path })
} else {
// 普通页面使用 navigateTo
const method = options.method || 'navigateTo'
uni[method]({ url })
}
}
/**
* 跳转到 tabBar 页面(支持传参)
* @param {String} path - tabBar 页面路径
* @param {Object} params - 参数对象
*/
export function navigateToTabBar(path, params = {}) {
if (!TAB_BAR_PAGES.includes(path)) {
console.error(`[Navigation] ${path} 不是 tabBar 页面`)
return
}
// 保存参数到本地存储
if (Object.keys(params).length > 0) {
const storageKey = getStorageKey(path)
uni.setStorageSync(storageKey, params)
}
// 跳转
uni.switchTab({ url: path })
}
/**
* 在 tabBar 页面中读取参数
* @param {String} path - 当前页面路径
* @returns {Object} 参数对象
*/
export function getTabBarParams(path) {
const storageKey = getStorageKey(path)
const params = uni.getStorageSync(storageKey)
// 读取后清除
if (params) {
uni.removeStorageSync(storageKey)
}
return params || {}
}
/**
* 获取存储键名
* @param {String} path - 页面路径
* @returns {String} 存储键名
*/
function getStorageKey(path) {
// 将路径转换为存储键名
// /pages/service/list -> serviceListParams
// /pages/booking/quick-booking -> bookingQuickBookingParams
const parts = path.split('/').filter(p => p && p !== 'pages')
const key = parts.map((p, i) => {
if (i === 0) return p
return p.charAt(0).toUpperCase() + p.slice(1).replace(/-([a-z])/g, (m, c) => c.toUpperCase())
}).join('') + 'Params'
return key
}
/**
* 重定向
*/
export function redirectTo(url) {
navigateTo(url, { method: 'redirectTo' })
}
/**
* 重启应用
*/
export function reLaunch(url) {
uni.reLaunch({ url })
}
/**
* 返回
*/
export function navigateBack(delta = 1) {
uni.navigateBack({ delta })
}
export default {
navigateTo,
navigateToTabBar,
getTabBarParams,
redirectTo,
reLaunch,
navigateBack
}