/** * 页面跳转工具类 * * @author terrfly * @site https://www.jeequan.com * @date 2022/11/14 17:12 */ // 引入 pages用于解析 pageId 变量 , 注意 需要在 pages.json 定义pageId 参数。 // 使用方法: go.to(""), 优点: 扩展分包可任意路径,业务调用不再传入固定URL, 传入的是pageId变量。 import pagesJSON from '@/pages.json' import emit from './emit.js' // 获取到全部的页面路径 和 ID const ALL_PAGES = { } // 添加到 ALL_PAGES function addPages(pagesRoot){ let rootUrl = pagesRoot.root ? `/${pagesRoot.root}/` : '/' pagesRoot.pages.forEach(r => { if(r.pageId){ ALL_PAGES[r.pageId] = rootUrl + r.path } }) } // 1. 添加 主目录 addPages(pagesJSON) // 2. 添加分包文件 目录 if(pagesJSON.subPackages){ pagesJSON.subPackages.forEach(r => addPages(r)) } const model = { // 跳转类型 GO_TYPE_TO: 'navigateTo', GO_TYPE_REDIRECT: 'redirect', GO_TYPE_RELAUNCH: 'reLaunch', GO_TYPE_SWITCHTAB: 'switchTab', // 对象转换url参数 object2param: (obj) => { if(!obj || Object.keys(obj).length <= 0){ return "" } let result = "?" Object.keys(obj).forEach(k => { let val = obj[k] // H5需要转码, 其他平台不需要 // #ifdef H5 val = encodeURIComponent(val) // #endif result += `${k}=${val}&` }) return result.substr(0, (result.length - 1)); }, // uni.navigateTo函数的封装: 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 // 参数: pagesIdOrUrl(路径或者pageId), 页面参数, 扩展参数 to: (pagesIdOrUrl, params = {}, type = model.GO_TYPE_TO, extObject = {}) => { // 使用ID作为标识 if(pagesIdOrUrl.indexOf('PAGES_') == 0){ pagesIdOrUrl = ALL_PAGES[pagesIdOrUrl] } pagesIdOrUrl += model.object2param(params) if(type == model.GO_TYPE_TO){ uni.navigateTo(Object.assign({ url: pagesIdOrUrl }, extObject)) } if(type == model.GO_TYPE_REDIRECT){ uni.redirectTo(Object.assign({ url: pagesIdOrUrl }, extObject)) } if(type == model.GO_TYPE_RELAUNCH){ uni.reLaunch(Object.assign({ url: pagesIdOrUrl }, extObject)) } if(type == model.GO_TYPE_SWITCHTAB){ uni.switchTab(Object.assign({ url: pagesIdOrUrl }, extObject)) } }, // 跳转到通用搜索页面 toSearchPage: (pageType, extObject = {}) => { model.to("PAGES_LIST_SEARCH", Object.assign({type: pageType}, extObject)) }, // delta 返回到第几页, refEmitEventName: 触发全局更新函数 (更新 list and search ) back: (delta = 1, refEmitEventName) => { if(refEmitEventName){ emit.refPageAndSearchEmit(refEmitEventName) } uni.navigateBack(delta) } } export default model