@heathenjs/taro-router 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/exception/index.d.ts +1 -0
- package/dist/exception/index.js +6 -0
- package/dist/exception/index.js.map +1 -0
- package/dist/exception/no-page.d.ts +3 -0
- package/dist/exception/no-page.js +10 -0
- package/dist/exception/no-page.js.map +1 -0
- package/dist/func/getCurrentRouteKey.d.ts +1 -0
- package/dist/func/getCurrentRouteKey.js +16 -0
- package/dist/func/getCurrentRouteKey.js.map +1 -0
- package/dist/func/index.d.ts +2 -0
- package/dist/func/index.js +19 -0
- package/dist/func/index.js.map +1 -0
- package/dist/func/isNil.d.ts +1 -0
- package/dist/func/isNil.js +7 -0
- package/dist/func/isNil.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/compose.d.ts +9 -0
- package/dist/lib/compose.js +46 -0
- package/dist/lib/compose.js.map +1 -0
- package/dist/middleware/index.d.ts +10 -0
- package/dist/middleware/index.js +50 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/type.d.ts +13 -0
- package/dist/middleware/type.js +3 -0
- package/dist/middleware/type.js.map +1 -0
- package/dist/page-data/index.d.ts +15 -0
- package/dist/page-data/index.js +52 -0
- package/dist/page-data/index.js.map +1 -0
- package/dist/router/index.d.ts +55 -0
- package/dist/router/index.js +201 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/type.d.ts +35 -0
- package/dist/router/type.js +15 -0
- package/dist/router/type.js.map +1 -0
- package/dist/router-back-listener/index.d.ts +7 -0
- package/dist/router-back-listener/index.js +21 -0
- package/dist/router-back-listener/index.js.map +1 -0
- package/dist/router-back-listener/type.d.ts +2 -0
- package/dist/router-back-listener/type.js +3 -0
- package/dist/router-back-listener/type.js.map +1 -0
- package/package.json +30 -0
- package/src/constants.ts +2 -0
- package/src/exception/index.ts +1 -0
- package/src/exception/no-page.ts +5 -0
- package/src/func/getCurrentRouteKey.ts +10 -0
- package/src/func/index.ts +2 -0
- package/src/func/isNil.ts +3 -0
- package/src/index.ts +12 -0
- package/src/lib/compose.ts +37 -0
- package/src/middleware/index.ts +40 -0
- package/src/middleware/type.ts +16 -0
- package/src/page-data/index.ts +67 -0
- package/src/router/index.ts +179 -0
- package/src/router/type.ts +38 -0
- package/src/router-back-listener/index.ts +21 -0
- package/src/router-back-listener/type.ts +3 -0
- package/tsconfig.json +25 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface Route<E = any> {
|
|
2
|
+
/** 页面 url,与配置在 app.config.ts 中的一致 */
|
|
3
|
+
url: string;
|
|
4
|
+
/** 附加数据 */
|
|
5
|
+
ext?: E;
|
|
6
|
+
}
|
|
7
|
+
export type Page = {
|
|
8
|
+
dirName: string;
|
|
9
|
+
dirPath: string;
|
|
10
|
+
path: string;
|
|
11
|
+
fullPath: string;
|
|
12
|
+
packageName: string;
|
|
13
|
+
};
|
|
14
|
+
export declare enum NavigateType {
|
|
15
|
+
/** 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 Router.back 可以返回到原页面。小程序中页面栈最多十层。 */
|
|
16
|
+
navigateTo = "navigateTo",
|
|
17
|
+
/** 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。 */
|
|
18
|
+
redirectTo = "redirectTo",
|
|
19
|
+
/** 关闭所有页面,打开到应用内的某个页面 */
|
|
20
|
+
reLaunch = "reLaunch",
|
|
21
|
+
/** 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 */
|
|
22
|
+
switchTab = "switchTab"
|
|
23
|
+
}
|
|
24
|
+
export interface NavigateOptions {
|
|
25
|
+
/** 跳转类型 */
|
|
26
|
+
type?: NavigateType;
|
|
27
|
+
/** 路由参数 */
|
|
28
|
+
params?: unknown;
|
|
29
|
+
/** 跳转完成的回调方法 */
|
|
30
|
+
complete?: (res: TaroGeneral.CallbackResult) => void;
|
|
31
|
+
/** 跳转失败的回调方法 */
|
|
32
|
+
fail?: (res: TaroGeneral.CallbackResult) => void;
|
|
33
|
+
/** 跳转成功的回调方法 */
|
|
34
|
+
success?: (res: TaroGeneral.CallbackResult) => void;
|
|
35
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NavigateType = void 0;
|
|
4
|
+
var NavigateType;
|
|
5
|
+
(function (NavigateType) {
|
|
6
|
+
/** 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 Router.back 可以返回到原页面。小程序中页面栈最多十层。 */
|
|
7
|
+
NavigateType["navigateTo"] = "navigateTo";
|
|
8
|
+
/** 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。 */
|
|
9
|
+
NavigateType["redirectTo"] = "redirectTo";
|
|
10
|
+
/** 关闭所有页面,打开到应用内的某个页面 */
|
|
11
|
+
NavigateType["reLaunch"] = "reLaunch";
|
|
12
|
+
/** 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 */
|
|
13
|
+
NavigateType["switchTab"] = "switchTab";
|
|
14
|
+
})(NavigateType || (exports.NavigateType = NavigateType = {}));
|
|
15
|
+
//# sourceMappingURL=type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/router/type.ts"],"names":[],"mappings":";;;AAeA,IAAY,YASX;AATD,WAAY,YAAY;IACtB,+EAA+E;IAC/E,yCAAyB,CAAA;IACzB,6CAA6C;IAC7C,yCAAyB,CAAA;IACzB,yBAAyB;IACzB,qCAAqB,CAAA;IACrB,uCAAuC;IACvC,uCAAuB,CAAA;AACzB,CAAC,EATW,YAAY,4BAAZ,YAAY,QASvB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RouterBackListener } from './type';
|
|
2
|
+
import { Route } from '../router';
|
|
3
|
+
export type { RouterBackListener };
|
|
4
|
+
export declare const routerBackListenerCollection: RouterBackListener[];
|
|
5
|
+
/** 注册全局路由返回监听 */
|
|
6
|
+
export declare function registerRouterBackListener(listener: RouterBackListener): void;
|
|
7
|
+
export declare function execRouterBackListener(from: Route): void;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.routerBackListenerCollection = void 0;
|
|
4
|
+
exports.registerRouterBackListener = registerRouterBackListener;
|
|
5
|
+
exports.execRouterBackListener = execRouterBackListener;
|
|
6
|
+
const taro_1 = require("@tarojs/taro");
|
|
7
|
+
exports.routerBackListenerCollection = [];
|
|
8
|
+
/** 注册全局路由返回监听 */
|
|
9
|
+
function registerRouterBackListener(listener) {
|
|
10
|
+
exports.routerBackListenerCollection.push(listener);
|
|
11
|
+
}
|
|
12
|
+
function execRouterBackListener(from) {
|
|
13
|
+
var _a;
|
|
14
|
+
const to = {
|
|
15
|
+
url: ((_a = taro_1.Current.router) === null || _a === void 0 ? void 0 : _a.path) || '',
|
|
16
|
+
};
|
|
17
|
+
for (const listener of exports.routerBackListenerCollection) {
|
|
18
|
+
listener(to, from);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router-back-listener/index.ts"],"names":[],"mappings":";;;AASA,gEAEC;AAED,wDAOC;AApBD,uCAAuC;AAM1B,QAAA,4BAA4B,GAAyB,EAAE,CAAC;AAErE,iBAAiB;AACjB,SAAgB,0BAA0B,CAAC,QAA4B;IACrE,oCAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAAW;;IAChD,MAAM,EAAE,GAAG;QACT,GAAG,EAAE,CAAA,MAAA,cAAO,CAAC,MAAM,0CAAE,IAAI,KAAI,EAAE;KAChC,CAAC;IACF,KAAK,MAAM,QAAQ,IAAI,oCAA4B,EAAE,CAAC;QACpD,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/router-back-listener/type.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@heathenjs/taro-router",
|
|
3
|
+
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"prod": "tsc -p ./tsconfig.json",
|
|
10
|
+
"clean": "rimraf dist",
|
|
11
|
+
"build": "pnpm run clean && pnpm run prod",
|
|
12
|
+
"tsc": "tsc -p ./tsconfig.json --noEmit",
|
|
13
|
+
"lint": "eslint --ext .ts --max-warnings 0 \"./src\" "
|
|
14
|
+
},
|
|
15
|
+
"keywords": [],
|
|
16
|
+
"author": "",
|
|
17
|
+
"license": "ISC",
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"@tarojs/taro": "^3.6.35",
|
|
20
|
+
"react": "^18.0.0"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"normalize-path": "^3.0.0",
|
|
24
|
+
"query-string": "^7.0.0",
|
|
25
|
+
"ts-morph": "^21.0.1"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/normalize-path": "^3.0.0"
|
|
29
|
+
}
|
|
30
|
+
}
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { NoPageException } from './no-page';
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Router } from './router';
|
|
2
|
+
|
|
3
|
+
export { NoPageException } from './exception';
|
|
4
|
+
export { execMiddlewares, getMiddlewares, registerMiddleware, registerMiddlewares } from './middleware';
|
|
5
|
+
export { NavigateType, Router } from './router';
|
|
6
|
+
export { registerRouterBackListener } from './router-back-listener';
|
|
7
|
+
|
|
8
|
+
export type { Middleware, MiddlewareCondition, RouteContext } from './middleware';
|
|
9
|
+
export type { NavigateOptions, Route } from './router';
|
|
10
|
+
export type { RouterBackListener } from './router-back-listener';
|
|
11
|
+
|
|
12
|
+
export default Router;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compose `middleware` returning
|
|
3
|
+
* a fully valid middleware comprised
|
|
4
|
+
* of all those which are passed.
|
|
5
|
+
*
|
|
6
|
+
* @param {Array} middleware
|
|
7
|
+
* @return {Function}
|
|
8
|
+
*/
|
|
9
|
+
export function compose(middleware: Function[]) {
|
|
10
|
+
if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!');
|
|
11
|
+
for (const fn of middleware) {
|
|
12
|
+
if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param {Object} context
|
|
17
|
+
* @return {Promise}
|
|
18
|
+
* @api public
|
|
19
|
+
*/
|
|
20
|
+
return function (context: any, next?: Function) {
|
|
21
|
+
// last called middleware #
|
|
22
|
+
let index = -1;
|
|
23
|
+
const dispatch = (i: number): Promise<any> => {
|
|
24
|
+
if (i <= index) return Promise.reject(new Error('next() called multiple times'));
|
|
25
|
+
index = i;
|
|
26
|
+
let fn: Function | undefined = middleware[i];
|
|
27
|
+
if (i === middleware.length) fn = next;
|
|
28
|
+
if (!fn) return Promise.resolve();
|
|
29
|
+
try {
|
|
30
|
+
return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
|
|
31
|
+
} catch (err) {
|
|
32
|
+
return Promise.reject(err);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return dispatch(0);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { compose } from '../lib/compose';
|
|
2
|
+
import { Middleware, MiddlewareCondition, RouteContext } from './type';
|
|
3
|
+
|
|
4
|
+
export type { Middleware, RouteContext, MiddlewareCondition };
|
|
5
|
+
|
|
6
|
+
export const middlewareCollection: {
|
|
7
|
+
middlewares: Middleware[];
|
|
8
|
+
condition?: MiddlewareCondition;
|
|
9
|
+
}[] = [];
|
|
10
|
+
|
|
11
|
+
export function registerMiddleware(middleware: Middleware, condition?: MiddlewareCondition) {
|
|
12
|
+
middlewareCollection.push({
|
|
13
|
+
middlewares: [middleware],
|
|
14
|
+
condition,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function registerMiddlewares(middlewares: Middleware[], condition?: MiddlewareCondition) {
|
|
19
|
+
middlewareCollection.push({
|
|
20
|
+
middlewares,
|
|
21
|
+
condition,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function getMiddlewares(ctx: RouteContext) {
|
|
26
|
+
return middlewareCollection
|
|
27
|
+
.filter((mc) => {
|
|
28
|
+
if (!mc.condition) return true;
|
|
29
|
+
else return mc.condition(ctx);
|
|
30
|
+
})
|
|
31
|
+
.map((mc) => mc.middlewares)
|
|
32
|
+
.reduce((pre, cur) => {
|
|
33
|
+
return [...pre, ...cur];
|
|
34
|
+
}, []);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function execMiddlewares(middlewares: Middleware[], ctx: RouteContext) {
|
|
38
|
+
const fn = compose(middlewares);
|
|
39
|
+
return await fn(ctx);
|
|
40
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NavigateType, Route } from '../router/type';
|
|
2
|
+
|
|
3
|
+
export interface RouteContext<E = any> {
|
|
4
|
+
/** 目标路由 */
|
|
5
|
+
route: Route<E>;
|
|
6
|
+
/** 路由参数 */
|
|
7
|
+
params: any;
|
|
8
|
+
/** 跳转类型 */
|
|
9
|
+
type: NavigateType;
|
|
10
|
+
/** 路由所在包 */
|
|
11
|
+
packageName?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type Middleware<E = any> = (ctx: RouteContext<E>, next: () => Promise<any>) => Promise<void>;
|
|
15
|
+
|
|
16
|
+
export type MiddlewareCondition = (ctx: RouteContext) => boolean;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { getCurrentRouteKey } from '../func';
|
|
2
|
+
|
|
3
|
+
export class PageData {
|
|
4
|
+
private static pageData: Map<string, any> = new Map();
|
|
5
|
+
private static pagePromise: Map<
|
|
6
|
+
string,
|
|
7
|
+
{
|
|
8
|
+
res: (val: any) => void;
|
|
9
|
+
rej: (err: any) => void;
|
|
10
|
+
}
|
|
11
|
+
> = new Map();
|
|
12
|
+
|
|
13
|
+
private static backResult: Map<string, any> = new Map();
|
|
14
|
+
|
|
15
|
+
static getPageData<T = any>(default_value?: T): T {
|
|
16
|
+
const route_key = getCurrentRouteKey();
|
|
17
|
+
const result = PageData.pageData.get(route_key) || default_value;
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
private static delPageData(route_key: string) {
|
|
22
|
+
PageData.pageData.delete(route_key);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private static delPagePromise(route_key: string) {
|
|
26
|
+
PageData.pagePromise.delete(route_key);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static setPageData(route_key: string, data: any) {
|
|
30
|
+
this.pageData.set(route_key, data);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static setPagePromise(
|
|
34
|
+
route_key: string,
|
|
35
|
+
options: {
|
|
36
|
+
res: (val: any) => void;
|
|
37
|
+
rej: (err: any) => void;
|
|
38
|
+
},
|
|
39
|
+
) {
|
|
40
|
+
this.pagePromise.set(route_key, options);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static emitBack(route_key: string) {
|
|
44
|
+
const pme = PageData.pagePromise.get(route_key);
|
|
45
|
+
if (!pme) return;
|
|
46
|
+
const result = PageData.backResult.get(route_key);
|
|
47
|
+
|
|
48
|
+
PageData.delPageData(route_key);
|
|
49
|
+
PageData.delPagePromise(route_key);
|
|
50
|
+
|
|
51
|
+
if (result) {
|
|
52
|
+
PageData.backResult.delete(route_key);
|
|
53
|
+
if (result instanceof Error) {
|
|
54
|
+
pme.rej(result);
|
|
55
|
+
} else {
|
|
56
|
+
pme.res(result);
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
pme.res(null);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
static setBackResult(result: any) {
|
|
64
|
+
const route_key = getCurrentRouteKey();
|
|
65
|
+
PageData.backResult.set(route_key, result);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import Taro, { Current, getCurrentInstance } from '@tarojs/taro';
|
|
2
|
+
import { ROUTE_KEY } from '../constants';
|
|
3
|
+
import { NoPageException } from '../exception/no-page';
|
|
4
|
+
import { getCurrentRouteKey, isNil } from '../func';
|
|
5
|
+
import { execMiddlewares, getMiddlewares, RouteContext } from '../middleware';
|
|
6
|
+
import { PageData } from '../page-data';
|
|
7
|
+
import { execRouterBackListener } from '../router-back-listener';
|
|
8
|
+
import { NavigateOptions, NavigateType, Page, Route } from './type';
|
|
9
|
+
import { useRef } from 'react';
|
|
10
|
+
|
|
11
|
+
export { NavigateType } from './type';
|
|
12
|
+
export type { NavigateOptions, Route } from './type';
|
|
13
|
+
|
|
14
|
+
export class Router {
|
|
15
|
+
/**
|
|
16
|
+
* 页面跳转
|
|
17
|
+
* @param route 目标路由对象
|
|
18
|
+
* @param options 跳转选项
|
|
19
|
+
*/
|
|
20
|
+
static async navigate<T = any>(route: Route, options?: NavigateOptions): Promise<T> {
|
|
21
|
+
options = { ...{ type: NavigateType.navigateTo, params: {} }, ...options };
|
|
22
|
+
options.params = Object.assign({}, options.params);
|
|
23
|
+
const route_key = Date.now() + '';
|
|
24
|
+
|
|
25
|
+
// TODO: taro官方缺少类型定义,as any过渡一下
|
|
26
|
+
(Current as any)['_page'] = Current.page;
|
|
27
|
+
Object.defineProperties(Current, {
|
|
28
|
+
page: {
|
|
29
|
+
set: function (page) {
|
|
30
|
+
if (page === undefined || page === null) {
|
|
31
|
+
this._page = page;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!page[ROUTE_KEY]) {
|
|
35
|
+
const originOnUnload = page.onUnload;
|
|
36
|
+
page.onUnload = function () {
|
|
37
|
+
originOnUnload && originOnUnload.apply(this);
|
|
38
|
+
PageData.emitBack(route_key);
|
|
39
|
+
setTimeout(() => execRouterBackListener(route));
|
|
40
|
+
};
|
|
41
|
+
page[ROUTE_KEY] = route_key;
|
|
42
|
+
}
|
|
43
|
+
this._page = page;
|
|
44
|
+
},
|
|
45
|
+
get: function () {
|
|
46
|
+
return this._page;
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
if (options.params) {
|
|
52
|
+
PageData.setPageData(route_key, options.params);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const pages = (Router?.['_pages'] ?? []) as Page[];
|
|
56
|
+
|
|
57
|
+
const context: RouteContext = {
|
|
58
|
+
route,
|
|
59
|
+
type: options.type!,
|
|
60
|
+
params: options.params,
|
|
61
|
+
packageName: pages.find((page) => page.path === route.url)?.packageName,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const middlewares = getMiddlewares(context);
|
|
65
|
+
middlewares.push(async (_, next) => {
|
|
66
|
+
switch (options!.type) {
|
|
67
|
+
case NavigateType.reLaunch:
|
|
68
|
+
await Taro.reLaunch({
|
|
69
|
+
url: route.url,
|
|
70
|
+
complete: options?.complete,
|
|
71
|
+
fail: options?.fail,
|
|
72
|
+
success: options?.success,
|
|
73
|
+
});
|
|
74
|
+
break;
|
|
75
|
+
case NavigateType.redirectTo:
|
|
76
|
+
await Taro.redirectTo({
|
|
77
|
+
url: route.url,
|
|
78
|
+
complete: options?.complete,
|
|
79
|
+
fail: options?.fail,
|
|
80
|
+
success: options?.success,
|
|
81
|
+
});
|
|
82
|
+
break;
|
|
83
|
+
case NavigateType.switchTab:
|
|
84
|
+
await Taro.switchTab({
|
|
85
|
+
url: route.url,
|
|
86
|
+
complete: options?.complete,
|
|
87
|
+
fail: options?.fail,
|
|
88
|
+
success: options?.success,
|
|
89
|
+
});
|
|
90
|
+
break;
|
|
91
|
+
default:
|
|
92
|
+
await Taro.navigateTo({
|
|
93
|
+
url: route.url,
|
|
94
|
+
complete: options?.complete,
|
|
95
|
+
fail: options?.fail,
|
|
96
|
+
success: options?.success,
|
|
97
|
+
});
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
next();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return new Promise(async (res, rej) => {
|
|
104
|
+
try {
|
|
105
|
+
PageData.setPagePromise(route_key, { res, rej });
|
|
106
|
+
await execMiddlewares(middlewares, context);
|
|
107
|
+
} catch (err) {
|
|
108
|
+
rej(err);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 返回上一个页面
|
|
115
|
+
* @param result 返回给上一个页面的数据,如果 result 是 Error 的实例,则是抛出异常给上一个页面
|
|
116
|
+
* @param options 其他选项
|
|
117
|
+
*/
|
|
118
|
+
static back(
|
|
119
|
+
result?: unknown,
|
|
120
|
+
options?: {
|
|
121
|
+
/** 返回的页面数,如果 delta 大于现有页面数,则返回到首页。 */
|
|
122
|
+
delta?: number;
|
|
123
|
+
},
|
|
124
|
+
) {
|
|
125
|
+
if (!isNil(result)) {
|
|
126
|
+
PageData.setBackResult(result);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const currentPages = Taro.getCurrentPages();
|
|
130
|
+
if (currentPages.length > 1) {
|
|
131
|
+
return Taro.navigateBack(options);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
throw new NoPageException();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 设置页面返回的数据
|
|
139
|
+
* 当物理键返回和左上角返回也需要带数据时会使用到
|
|
140
|
+
*/
|
|
141
|
+
static setBackResult(result: any) {
|
|
142
|
+
PageData.setBackResult(result);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* 获取页面携带过来的数据,混合顺序为 路由参数 > URL参数
|
|
147
|
+
* @param default_value 默认参数
|
|
148
|
+
*/
|
|
149
|
+
static getParams<T extends Record<string, any> = {}>(): T {
|
|
150
|
+
const urlParams = Object.assign({}, getCurrentInstance().router?.params) as T;
|
|
151
|
+
const routerParams = PageData.getPageData<T>();
|
|
152
|
+
return {
|
|
153
|
+
...urlParams,
|
|
154
|
+
...routerParams,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* 获取页面携带过来的数据,混合顺序为 路由参数 > URL参数
|
|
160
|
+
* @param default_value 默认参数
|
|
161
|
+
*/
|
|
162
|
+
static useParams<T extends Record<string, any> = {}>(): T {
|
|
163
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
164
|
+
const { current } = useRef({
|
|
165
|
+
obj: {} as T,
|
|
166
|
+
initialized: false,
|
|
167
|
+
});
|
|
168
|
+
if (current.initialized === false) {
|
|
169
|
+
current.obj = this.getParams();
|
|
170
|
+
current.initialized = true;
|
|
171
|
+
}
|
|
172
|
+
return current.obj;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
static setParams<T extends Record<string, any> = {}>(value: T) {
|
|
176
|
+
const route_key = getCurrentRouteKey();
|
|
177
|
+
PageData.setPageData(route_key, value);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface Route<E = any> {
|
|
2
|
+
/** 页面 url,与配置在 app.config.ts 中的一致 */
|
|
3
|
+
url: string;
|
|
4
|
+
/** 附加数据 */
|
|
5
|
+
ext?: E;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export type Page = {
|
|
9
|
+
dirName: string;
|
|
10
|
+
dirPath: string;
|
|
11
|
+
path: string;
|
|
12
|
+
fullPath: string;
|
|
13
|
+
packageName: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export enum NavigateType {
|
|
17
|
+
/** 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 Router.back 可以返回到原页面。小程序中页面栈最多十层。 */
|
|
18
|
+
navigateTo = 'navigateTo',
|
|
19
|
+
/** 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。 */
|
|
20
|
+
redirectTo = 'redirectTo',
|
|
21
|
+
/** 关闭所有页面,打开到应用内的某个页面 */
|
|
22
|
+
reLaunch = 'reLaunch',
|
|
23
|
+
/** 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 */
|
|
24
|
+
switchTab = 'switchTab',
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface NavigateOptions {
|
|
28
|
+
/** 跳转类型 */
|
|
29
|
+
type?: NavigateType;
|
|
30
|
+
/** 路由参数 */
|
|
31
|
+
params?: unknown;
|
|
32
|
+
/** 跳转完成的回调方法 */
|
|
33
|
+
complete?: (res: TaroGeneral.CallbackResult) => void;
|
|
34
|
+
/** 跳转失败的回调方法 */
|
|
35
|
+
fail?: (res: TaroGeneral.CallbackResult) => void;
|
|
36
|
+
/** 跳转成功的回调方法 */
|
|
37
|
+
success?: (res: TaroGeneral.CallbackResult) => void;
|
|
38
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Current } from '@tarojs/taro';
|
|
2
|
+
import { RouterBackListener } from './type';
|
|
3
|
+
import { Route } from '../router';
|
|
4
|
+
|
|
5
|
+
export type { RouterBackListener };
|
|
6
|
+
|
|
7
|
+
export const routerBackListenerCollection: RouterBackListener[] = [];
|
|
8
|
+
|
|
9
|
+
/** 注册全局路由返回监听 */
|
|
10
|
+
export function registerRouterBackListener(listener: RouterBackListener) {
|
|
11
|
+
routerBackListenerCollection.push(listener);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function execRouterBackListener(from: Route) {
|
|
15
|
+
const to = {
|
|
16
|
+
url: Current.router?.path || '',
|
|
17
|
+
};
|
|
18
|
+
for (const listener of routerBackListenerCollection) {
|
|
19
|
+
listener(to, from);
|
|
20
|
+
}
|
|
21
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"module": "CommonJS",
|
|
5
|
+
"removeComments": false,
|
|
6
|
+
"moduleResolution": "node",
|
|
7
|
+
"experimentalDecorators": false,
|
|
8
|
+
"noImplicitAny": false,
|
|
9
|
+
"allowSyntheticDefaultImports": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"noUnusedLocals": false,
|
|
12
|
+
"noUnusedParameters": false,
|
|
13
|
+
"strictNullChecks": true,
|
|
14
|
+
"resolveJsonModule": true,
|
|
15
|
+
"sourceMap": true,
|
|
16
|
+
"skipLibCheck": true,
|
|
17
|
+
"target": "es2015",
|
|
18
|
+
"outDir": "dist",
|
|
19
|
+
"rootDir": "./src",
|
|
20
|
+
"declaration": true,
|
|
21
|
+
"noEmit": false
|
|
22
|
+
},
|
|
23
|
+
"include": ["./**/*.ts", "./**/*.tsx", "src/index.ts"],
|
|
24
|
+
"exclude": ["node_modules", "dist"]
|
|
25
|
+
}
|