/** * 页面跳转相关工具方法 */ /** * 智能返回方法:默认返回上一页,如果页面栈只有1层(没有上一页),则返回到首页 * * @param {Object} options 配置参数 * @param {number} options.delay 延迟执行的时间,单位毫秒,默认 0 * @param {string} options.homePath 首页的路径,默认为 '/pages/index/index' */ export const smartNavigateBack = (options = {}) => { const { delay = 0, homePath = '/pages/index/index' } = options; const executeBack = () => { const pages = getCurrentPages(); if (pages.length > 1) { // 有上一页,直接返回 uni.navigateBack({ delta: 1 }); } else { // 页面栈只有一层,返回首页 uni.switchTab({ url: homePath, fail: () => { // 如果首页不是 tabBar 页面,则使用 reLaunch uni.reLaunch({ url: homePath }); } }); } }; if (delay > 0) { setTimeout(executeBack, delay); } else { executeBack(); } }; /** * 对象转 URL 参数 * @param {Object} obj 要转换的对象 * @returns {string} 返回 a=1&b=2 格式的字符串 */ export const objToUrlParams = (obj) => { if (!obj || typeof obj !== 'object') return ''; const params = []; for (let key in obj) { if (obj.hasOwnProperty(key) && obj[key] !== undefined && obj[key] !== null) { // 过滤掉 undefined 和 null 的参数 params.push(`${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`); } } return params.join('&'); }; /** * 封装带参数的跳转方法 * @param {string} url 跳转的页面路径 * @param {Object} params 要传递的参数对象 */ export const navigateToWithParams = (url, params = {}) => { const queryStr = objToUrlParams(params); const finalUrl = queryStr ? `${url}${url.includes('?') ? '&' : '?'}${queryStr}` : url; uni.navigateTo({ url: finalUrl }); }; /** * 获取当前页面的实例 * @returns {Object|null} 当前页面实例 */ export const getCurrentPage = () => { const pages = getCurrentPages(); return pages.length > 0 ? pages[pages.length - 1] : null; }; /** * 刷新当前页面(重新调用 onLoad 和 onShow) * 注意:部分复杂页面可能需要根据具体业务逻辑单独实现刷新机制 */ export const refreshCurrentPage = () => { const currentPage = getCurrentPage(); if (currentPage) { if (typeof currentPage.onLoad === 'function') { currentPage.onLoad(currentPage.options || {}); } if (typeof currentPage.onShow === 'function') { currentPage.onShow(); } } }; /** * 检查当前是否是指定页面 * @param {string} route 页面路由,例如 'pages/index/index' * @returns {boolean} */ export const isCurrentPage = (route) => { const currentPage = getCurrentPage(); if (!currentPage) return false; // 去除可能的首字符 '/' const checkRoute = route.startsWith('/') ? route.substring(1) : route; return currentPage.route === checkRoute; };