|
|
import $store from '@/sheep/store';import { showAuthModal, showShareModal } from '@/sheep/hooks/useModal';import { isNumber, isString, isEmpty, startsWith, isObject, isNil, clone } from 'lodash-es';import throttle from '@/sheep/helper/throttle';
const _go = ( path, params = {}, options = { redirect: false, },) => { let page = ''; // 跳转页面
let query = ''; // 页面参数
let url = ''; // 跳转页面完整路径
if (isString(path)) { // 判断跳转类型是 path | 还是http
if (startsWith(path, 'http')) { // #ifdef H5
window.location = path; return; // #endif
// #ifndef H5
page = `/pages/public/webview`; query = `url=${encodeURIComponent(path)}`; // #endif
} else if (startsWith(path, 'action:')) { handleAction(path); return; } else { [page, query] = path.split('?'); } if (!isEmpty(params)) { let query2 = paramsToQuery(params); if (isEmpty(query)) { query = query2; } else { query += '&' + query2; } } }
if (isObject(path)) { page = path.url; if (!isNil(path.params)) { query = paramsToQuery(path.params); } }
const nextRoute = ROUTES_MAP[page];
// 未找到指定跳转页面
// mark: 跳转404页
if (!nextRoute) { console.log(`%c跳转路径参数错误<${page || 'EMPTY'}>`, 'color:red;background:yellow'); return; }
// 页面登录拦截
if (nextRoute.meta?.auth && !$store('user').isLogin) { showAuthModal(); return; }
url = page; if (!isEmpty(query)) { url += `?${query}`; }
// 跳转底部导航
if (TABBAR.includes(page)) { uni.switchTab({ url, }); return; }
// 使用redirect跳转
if (options.redirect) { uni.redirectTo({ url, }); return; }
uni.navigateTo({ url, });};
// 限流 防止重复点击跳转
function go(...args) { throttle(() => { _go(...args); });}
function paramsToQuery(params) { if (isEmpty(params)) { return ''; } // return new URLSearchParams(Object.entries(params)).toString();
let query = []; for (let key in params) { query.push(key + '=' + params[key]); }
return query.join('&');}
function back() { // #ifdef H5
history.back(); // #endif
// #ifndef H5
uni.navigateBack(); // #endif
}
function redirect(path, params = {}) { go(path, params, { redirect: true, });}
// 检测是否有浏览器历史
function hasHistory() { // #ifndef H5
const pages = getCurrentPages(); if (pages.length > 1) { return true; } return false; // #endif
// #ifdef H5
return !!history.state.back; // #endif
}
function getCurrentRoute(field = '') { let currentPage = getCurrentPage(); // #ifdef MP
currentPage.$page['route'] = currentPage.route; currentPage.$page['options'] = currentPage.options; // #endif
if (field !== '') { return currentPage.$page[field]; } else { return currentPage.$page; }}
function getCurrentPage() { let pages = getCurrentPages(); return pages[pages.length - 1];}
function handleAction(path) { const action = path.split(':'); switch (action[1]) { case 'showShareModal': showShareModal(); break; }}
function error(errCode, errMsg = '') { redirect('/pages/public/error', { errCode, errMsg, });}
export default { go, back, hasHistory, redirect, getCurrentPage, getCurrentRoute, error,};
|