press-ui
Version:
简单、易用的跨端组件库,兼容 Vue2 和 Vue3,同时支持 uni-app和普通 Vue 项目
89 lines (75 loc) • 1.91 kB
JavaScript
import pathToRegexp from './path-to-regexp';
export function getQueryBaseStr(str = '') {
if (!str) {
return {};
}
return str.split('&').reduce((acc, item) => {
const list = item.split('=');
acc[list[0]] = list[1];
return acc;
}, {});
}
export function isMatchPath(meta, path) {
const { rawPath = [] } = meta;
if (!rawPath?.length) return;
for (const item of rawPath) {
// eslint-disable-next-line prefer-const
let keys = [];
const regexp = pathToRegexp(item, keys);
const match = path.match(regexp);
if (match) {
return {
match,
regexp,
keys,
};
}
}
return;
}
/**
* 根据路由表,找到 path 对应的 路由名称
* @param {string} path 路由路径
* @param {array} routes 路由表
* @returns {object} 匹配到的路由信息
*
* @example
* ```ts
* const { name, params, meta, path } = findRouteName(rawPath, ALL_ROUTES) || {};
*
* console.log('name', name);
* ```
*/
export function findRouteName(path, routes) {
// eslint-disable-next-line @typescript-eslint/prefer-for-of
for (let i = 0;i < routes.length;i++) {
const item = routes[i];
const { name, meta = {}, path: itemPath } = item;
let purePath = path;
let queryStr = '';
if (path.includes('?')) {
const idx = path.indexOf('?');
purePath = path.slice(0, idx);
queryStr = path.slice(idx + 1);
}
const match = isMatchPath(meta, purePath);
const queryBasePath = getQueryBaseStr(queryStr);
if (match) {
const { match: iMatch, keys } = match;
const params = keys.reduce((acc, key, index) => {
const { name } = key;
acc[name] = iMatch[index + 1];
return acc;
}, {});
return {
name,
params: {
...params,
...queryBasePath,
},
path: itemPath,
meta,
};
}
}
}