vitarx-router 1.0.0-beta.2 → 1.0.0-beta.3
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/vitarx-router.d.ts +1302 -0
- package/dist/vitarx-router.js +73 -85
- package/package.json +4 -3
- package/type-make.js +74 -0
- package/dist/index.d.ts +0 -2
- package/dist/router/helper.d.ts +0 -92
- package/dist/router/index.d.ts +0 -7
- package/dist/router/memory-router.d.ts +0 -45
- package/dist/router/router.d.ts +0 -414
- package/dist/router/type.d.ts +0 -483
- package/dist/router/update.d.ts +0 -8
- package/dist/router/utils.d.ts +0 -152
- package/dist/router/validate/index.d.ts +0 -2
- package/dist/router/validate/inject-props.d.ts +0 -8
- package/dist/router/validate/validate-widget.d.ts +0 -8
- package/dist/router/web-history-router.d.ts +0 -65
- package/dist/widget/RouterLink.d.ts +0 -80
- package/dist/widget/RouterView.d.ts +0 -84
- package/dist/widget/index.d.ts +0 -2
|
@@ -0,0 +1,1302 @@
|
|
|
1
|
+
import { Computed } from 'vitarx';
|
|
2
|
+
import { Element as Element_2 } from 'vitarx';
|
|
3
|
+
import { LazyLoader } from 'vitarx';
|
|
4
|
+
import { Reactive } from 'vitarx';
|
|
5
|
+
import { VNode } from 'vitarx';
|
|
6
|
+
import { WebRuntimeDom } from 'vitarx';
|
|
7
|
+
import { Widget } from 'vitarx';
|
|
8
|
+
import { WidgetType } from 'vitarx';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 全局路由后置钩子
|
|
12
|
+
*
|
|
13
|
+
* 此时视图已经渲染完成,可以做一些操作,如:修改页面标题等。
|
|
14
|
+
*
|
|
15
|
+
* @this {Router} - 路由器实例
|
|
16
|
+
* @param {DeepReadonly<RouteLocation>} to - 当前路由数据
|
|
17
|
+
* @param {DeepReadonly<RouteLocation>} from - 从哪个路由跳转过来
|
|
18
|
+
*/
|
|
19
|
+
declare type AfterEachCallback = (this: Router, to: DeepReadonly<RouteLocation>, from: DeepReadonly<RouteLocation>) => void;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 允许的路由小部件联合类型
|
|
23
|
+
*/
|
|
24
|
+
declare type AllowedRouteWidget = RouteWidget | NamedRouteWidget;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 全局路由前置钩子
|
|
28
|
+
*
|
|
29
|
+
* 此时路由导航还未正式开始,此钩子常用于鉴权,如果不符合条件,可以返回false阻止路由,亦可以返回重定向目标。
|
|
30
|
+
*
|
|
31
|
+
* @this {Router} - 路由器实例
|
|
32
|
+
* @param {DeepReadonly<RouteLocation>} to - 要跳转的目标路由
|
|
33
|
+
* @param {DeepReadonly<RouteLocation>} from - 从哪个路由跳转过来
|
|
34
|
+
* @returns {boolean | RouteTarget | void} - 返回false表示阻止路由跳转,返回{@link RouteTarget}重定向目标
|
|
35
|
+
*/
|
|
36
|
+
export declare type BeforeEachCallback = (this: Router, to: DeepReadonly<RouteLocation>, from: DeepReadonly<RouteLocation>) => BeforeEachCallbackResult;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 路由前置钩子返回值
|
|
40
|
+
*
|
|
41
|
+
* 1. 返回false表示阻止路由跳转,true表示继续路由跳转
|
|
42
|
+
* 2. 返回{@link RouteTarget}重定向目标
|
|
43
|
+
* 3. 返回void表示继续路由跳转
|
|
44
|
+
* @note 如果返回promise,则promise resolve的值会被作为返回值
|
|
45
|
+
*/
|
|
46
|
+
export declare type BeforeEachCallbackResult = boolean | RouteTarget | void | Promise<boolean | RouteTarget | void>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 创建内存路由器
|
|
50
|
+
*
|
|
51
|
+
* 不支持浏览器的前进后退等操作,只能通过实例中的方法来管理路由。
|
|
52
|
+
*
|
|
53
|
+
* 你必须调用一次`router.replace(target)`方法来跳转到目标路由。
|
|
54
|
+
*
|
|
55
|
+
* @param {RouterOptions} options - 配置
|
|
56
|
+
* @return {MemoryRouter} - 内存路由器实例
|
|
57
|
+
*/
|
|
58
|
+
export declare function createRouter(options: RouterOptions & {
|
|
59
|
+
mode: 'memory';
|
|
60
|
+
}): MemoryRouter;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 创建History路由器
|
|
64
|
+
*
|
|
65
|
+
* 基于History API实现路由功能,支持浏览器前进后退、刷新等操作。
|
|
66
|
+
*
|
|
67
|
+
* 它与`MemoryRouter`路由不同的是,它不需要初始化过后调用`router.replace(target)`方法来替换默认路由,
|
|
68
|
+
* 内部会自动根据`window.location`去匹配路由。
|
|
69
|
+
*
|
|
70
|
+
* @param {RouterOptions} options - 路由配置
|
|
71
|
+
* @return {WebHistoryRouter} - HistoryRouter实例
|
|
72
|
+
*/
|
|
73
|
+
export declare function createRouter(options: RouterOptions | (RouterOptions & {
|
|
74
|
+
mode: 'path' | 'hash';
|
|
75
|
+
})): WebHistoryRouter;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 定义路由
|
|
79
|
+
*
|
|
80
|
+
* 使用defineRoute定义路由可以获得更好的代码提示。
|
|
81
|
+
*
|
|
82
|
+
* @param {Route} route - 路由配置
|
|
83
|
+
*/
|
|
84
|
+
export declare function defineRoute(route: Route): Route;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 定义路由表
|
|
88
|
+
*
|
|
89
|
+
* 使用defineRoutes定义路由表可以获得更好的代码提示。
|
|
90
|
+
*
|
|
91
|
+
* @param {Route[]} routes - 路由配置表
|
|
92
|
+
*/
|
|
93
|
+
export declare function defineRoutes(...routes: Route[]): Route[];
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* 动态路由记录
|
|
97
|
+
*/
|
|
98
|
+
export declare interface DynamicRouteRecord {
|
|
99
|
+
regex: RegExp;
|
|
100
|
+
route: RouteNormalized;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* hash字符串类型
|
|
105
|
+
*/
|
|
106
|
+
export declare type HashStr = `#${string}` | '';
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 路由模式
|
|
110
|
+
*/
|
|
111
|
+
export declare type HistoryMode = 'hash' | 'path' | 'memory';
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 已初始化的路由配置
|
|
115
|
+
*/
|
|
116
|
+
export declare type InitializedRouterOptions = MakeRequired<RouterOptions, Exclude<keyof RouterOptions, 'beforeEach' | 'afterEach'>>;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 命名的props
|
|
120
|
+
*/
|
|
121
|
+
export declare type InjectNamedProps<k extends string = string> = Record<k, InjectProps>;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* 路由参数注入
|
|
125
|
+
*/
|
|
126
|
+
export declare type InjectProps = boolean | Record<string, any> | ((route: RouteLocation) => Record<string, any>);
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* ## 标记延迟加载
|
|
130
|
+
*
|
|
131
|
+
* 由于直接定义`() => import('./xxx.js')`会导致类型与函数式组件冲突,
|
|
132
|
+
* 在未执行函数之前难以有效判断其类型,所以这里使用Symbol标记懒加载器。
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* lazy(() => import('./xxx.js'))
|
|
136
|
+
*
|
|
137
|
+
* @template T - WidgetType
|
|
138
|
+
* @param {LazyLoader<T>} lazyLoader - 函数返回的import即是惰性加载器
|
|
139
|
+
*/
|
|
140
|
+
export declare function lazy<T extends WidgetType>(lazyLoader: LazyLoader<T>): LazyLoad<T>;
|
|
141
|
+
|
|
142
|
+
declare const LAZY_LOADER_SYMBOL: unique symbol;
|
|
143
|
+
|
|
144
|
+
declare type LAZY_LOADER_SYMBOL = typeof LAZY_LOADER_SYMBOL;
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* 延迟加载/惰性加载
|
|
148
|
+
*/
|
|
149
|
+
export declare interface LazyLoad<T> {
|
|
150
|
+
[LAZY_LOADER_SYMBOL]: boolean;
|
|
151
|
+
(): Promise<{
|
|
152
|
+
default: T;
|
|
153
|
+
}>;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 路由匹配结果
|
|
158
|
+
*/
|
|
159
|
+
export declare type MatchResult = {
|
|
160
|
+
/**
|
|
161
|
+
* 匹配的路由对象
|
|
162
|
+
*/
|
|
163
|
+
route: RouteNormalized;
|
|
164
|
+
/**
|
|
165
|
+
* path参数
|
|
166
|
+
*
|
|
167
|
+
* 非动态路由path,值固定为undefined
|
|
168
|
+
*/
|
|
169
|
+
params: Record<string, string> | undefined;
|
|
170
|
+
} | undefined;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* 基于内存实现的路由器
|
|
174
|
+
*
|
|
175
|
+
* 仅支持路由器操作前进、后退、跳转等操作
|
|
176
|
+
*
|
|
177
|
+
* > 注意:不要在浏览器端使用,因为浏览器端有原生的history对象,使用内存模式会和浏览器端的历史记录冲突,导致路由异常。
|
|
178
|
+
*/
|
|
179
|
+
export declare class MemoryRouter extends Router {
|
|
180
|
+
protected _history: RouteLocation[];
|
|
181
|
+
protected _pendingGo: number | null;
|
|
182
|
+
constructor(options: RouterOptions<'memory'>);
|
|
183
|
+
private _currentIndex;
|
|
184
|
+
/**
|
|
185
|
+
* 当前历史路由索引
|
|
186
|
+
*
|
|
187
|
+
* @protected
|
|
188
|
+
*/
|
|
189
|
+
protected get currentIndex(): number;
|
|
190
|
+
/**
|
|
191
|
+
* @inheritDoc
|
|
192
|
+
*/
|
|
193
|
+
go(delta?: number): void;
|
|
194
|
+
/**
|
|
195
|
+
* @inheritDoc
|
|
196
|
+
*/
|
|
197
|
+
protected initializeRouter(): void;
|
|
198
|
+
/**
|
|
199
|
+
* 添加历史记录
|
|
200
|
+
*/
|
|
201
|
+
protected pushHistory(data: RouteLocation): void;
|
|
202
|
+
/**
|
|
203
|
+
* 替换历史记录
|
|
204
|
+
*/
|
|
205
|
+
protected replaceHistory(data: RouteLocation): void;
|
|
206
|
+
/**
|
|
207
|
+
* 更新历史记录
|
|
208
|
+
*
|
|
209
|
+
* @param {RouteLocation} data - 目标路由
|
|
210
|
+
* @param {boolean} isReplace - 是否为替换操作
|
|
211
|
+
* @private
|
|
212
|
+
*/
|
|
213
|
+
private _updateHistory;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* 命名的路由视图小部件
|
|
218
|
+
*/
|
|
219
|
+
declare type NamedRouteWidget<K extends string = string> = Record<K, RouteWidget>;
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 导航结果
|
|
223
|
+
*/
|
|
224
|
+
export declare interface NavigateResult {
|
|
225
|
+
/**
|
|
226
|
+
* 状态
|
|
227
|
+
*
|
|
228
|
+
* @see NavigateStatus
|
|
229
|
+
*/
|
|
230
|
+
status: NavigateStatus;
|
|
231
|
+
/**
|
|
232
|
+
* 状态描述
|
|
233
|
+
*/
|
|
234
|
+
message: string;
|
|
235
|
+
/**
|
|
236
|
+
* 最终的导航数据
|
|
237
|
+
*
|
|
238
|
+
* 它和守卫钩子`to`参数一致。
|
|
239
|
+
*/
|
|
240
|
+
to: Readonly<RouteLocation>;
|
|
241
|
+
/**
|
|
242
|
+
* 导航完成前的路由数据
|
|
243
|
+
*
|
|
244
|
+
* 它和守卫钩子`from`参数一致。
|
|
245
|
+
*/
|
|
246
|
+
from: Readonly<RouteLocation>;
|
|
247
|
+
/**
|
|
248
|
+
* 如果在守卫过程中被重定向,则redirectFrom为最初的路由目标,否则为undefined。
|
|
249
|
+
*/
|
|
250
|
+
redirectFrom: RouteTarget | undefined;
|
|
251
|
+
/**
|
|
252
|
+
* 捕获到的异常
|
|
253
|
+
*/
|
|
254
|
+
error?: unknown;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* 导航结果
|
|
259
|
+
*
|
|
260
|
+
* 枚举值:
|
|
261
|
+
* 0. success: 导航成功
|
|
262
|
+
* 1. aborted: 导航被阻止
|
|
263
|
+
* 2. cancelled: 导航被取消
|
|
264
|
+
* 3. duplicated: 重复导航
|
|
265
|
+
* 4. not_matched: 路由未匹配
|
|
266
|
+
* 5. exception: 捕获到异常
|
|
267
|
+
*/
|
|
268
|
+
export declare enum NavigateStatus {
|
|
269
|
+
/**
|
|
270
|
+
* 导航成功
|
|
271
|
+
*/
|
|
272
|
+
success = 0,
|
|
273
|
+
/**
|
|
274
|
+
* 导航被阻止
|
|
275
|
+
*/
|
|
276
|
+
aborted = 1,
|
|
277
|
+
/**
|
|
278
|
+
* 导航被取消
|
|
279
|
+
*
|
|
280
|
+
* 正在等待中间件处理结果时又触发了新的导航请求
|
|
281
|
+
*/
|
|
282
|
+
cancelled = 2,
|
|
283
|
+
/**
|
|
284
|
+
* 重复导航
|
|
285
|
+
*/
|
|
286
|
+
duplicated = 3,
|
|
287
|
+
/**
|
|
288
|
+
* 路由未匹配
|
|
289
|
+
*/
|
|
290
|
+
not_matched = 4,
|
|
291
|
+
/**
|
|
292
|
+
* 捕获到异常
|
|
293
|
+
*/
|
|
294
|
+
exception = 5
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* 路由路线配置
|
|
299
|
+
*
|
|
300
|
+
* @template WIDGET 允许的路由小部件类型,用于类型重载
|
|
301
|
+
*/
|
|
302
|
+
export declare interface Route<WIDGET extends AllowedRouteWidget = AllowedRouteWidget> {
|
|
303
|
+
/**
|
|
304
|
+
* 路由路径
|
|
305
|
+
*
|
|
306
|
+
* 支持动态路由参数
|
|
307
|
+
*
|
|
308
|
+
* example:
|
|
309
|
+
* `/user` // 静态路径
|
|
310
|
+
* `/user/{id}` // 必填参数
|
|
311
|
+
* `/user/{id?}` // 可选参数
|
|
312
|
+
* `/user/{id?}/{name}` // 错误的用例,可选参数后面不能再有其他参数
|
|
313
|
+
*/
|
|
314
|
+
path: RoutePath;
|
|
315
|
+
/**
|
|
316
|
+
* 动态路由参数匹配规则
|
|
317
|
+
*
|
|
318
|
+
* @example
|
|
319
|
+
* path:`/user/[id]`
|
|
320
|
+
* pattern:{id:'\d+'}
|
|
321
|
+
*/
|
|
322
|
+
pattern?: Record<string, RegExp>;
|
|
323
|
+
/**
|
|
324
|
+
* 路由名称
|
|
325
|
+
*
|
|
326
|
+
* 必须全局保持唯一!
|
|
327
|
+
*/
|
|
328
|
+
name?: string;
|
|
329
|
+
/**
|
|
330
|
+
* 要展示的Widget
|
|
331
|
+
*
|
|
332
|
+
* 支持两种类型:
|
|
333
|
+
* 1. WidgetType: `YourWidget` 可以是函数式小部件,也可以是类小部件
|
|
334
|
+
* 2. LazyLoad: `() => import('./YourWidget')` 代码分块,懒加载,它会自动被LazyWidget包裹。
|
|
335
|
+
* 3. undefined: 自身不展示任何ui,仅做为父路由,使children继承父路由的`path`和`pattern`。
|
|
336
|
+
* 4. Record<string, WidgetType | LazyLoad<WidgetType>>: 命名的小部件,同级的`RouterView`会根据name属性展示对应的小部件。
|
|
337
|
+
*/
|
|
338
|
+
widget?: WIDGET;
|
|
339
|
+
/**
|
|
340
|
+
* 子路由
|
|
341
|
+
*
|
|
342
|
+
* 子路由path不要以父路由path开头,内部会自动拼接。
|
|
343
|
+
*/
|
|
344
|
+
children?: Route[];
|
|
345
|
+
/**
|
|
346
|
+
* 路由元数据
|
|
347
|
+
*
|
|
348
|
+
* 存储一些自定义的数据,不会影响路由匹配
|
|
349
|
+
*/
|
|
350
|
+
meta?: RouteMeta;
|
|
351
|
+
/**
|
|
352
|
+
* 将路由参数注入到小部件实例的props中
|
|
353
|
+
*
|
|
354
|
+
* 如果是命名视图,则必须定义给每个命名视图定义`props`配置
|
|
355
|
+
*
|
|
356
|
+
* @default true
|
|
357
|
+
*/
|
|
358
|
+
injectProps?: (WIDGET extends NamedRouteWidget<infer k> ? InjectNamedProps<k> : InjectProps) | boolean;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* 路由索引
|
|
363
|
+
*/
|
|
364
|
+
export declare type RouteIndex = RoutePath | RouteName | VitarxRouterRouteIndexTyped;
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* 路由匹配的详情数据
|
|
368
|
+
*
|
|
369
|
+
* 所有和url相关的数据都已`decodeURIComponent`解码
|
|
370
|
+
*/
|
|
371
|
+
export declare interface RouteLocation {
|
|
372
|
+
/**
|
|
373
|
+
* 路由索引,调用`push`|`replace`时传入的index
|
|
374
|
+
*/
|
|
375
|
+
index: RouteIndex;
|
|
376
|
+
/**
|
|
377
|
+
* 完整的path,包含了query和hash
|
|
378
|
+
*
|
|
379
|
+
* 1. path|memory模式:`${base}${path}${query}${hash}`
|
|
380
|
+
* 2. hash模式:`${base}/#${path}${query}${hash}`
|
|
381
|
+
*/
|
|
382
|
+
fullPath: string;
|
|
383
|
+
/**
|
|
384
|
+
* pathname
|
|
385
|
+
*
|
|
386
|
+
* 如果是`hash`模式,pathname和`window.location.pathname`获取的值是不一致的,因为它是从`window.location.hash`中提取出来的
|
|
387
|
+
*/
|
|
388
|
+
path: `/${string}`;
|
|
389
|
+
/**
|
|
390
|
+
* hash
|
|
391
|
+
*
|
|
392
|
+
* 带有#前缀,空字符串代表没有hash。
|
|
393
|
+
*
|
|
394
|
+
* @default ''
|
|
395
|
+
*/
|
|
396
|
+
hash: HashStr;
|
|
397
|
+
/**
|
|
398
|
+
* 动态路由path匹配的参数,包括调用`push`|`replace`时传入的params
|
|
399
|
+
*
|
|
400
|
+
* > 注意:必须是能够被序列化的参数,否则会导致异常。
|
|
401
|
+
*
|
|
402
|
+
* @default {}
|
|
403
|
+
*/
|
|
404
|
+
params: Record<string, any>;
|
|
405
|
+
/**
|
|
406
|
+
* search参数
|
|
407
|
+
*
|
|
408
|
+
* @default {}
|
|
409
|
+
*/
|
|
410
|
+
query: Record<string, string>;
|
|
411
|
+
/**
|
|
412
|
+
* 路由线路配置的元数据
|
|
413
|
+
*
|
|
414
|
+
* 如果没有配置元数据,那它将会是空对象,未匹配到任何路由也会是空对象。
|
|
415
|
+
*
|
|
416
|
+
* @default {}
|
|
417
|
+
*/
|
|
418
|
+
meta: RouteMeta;
|
|
419
|
+
/**
|
|
420
|
+
* 匹配的路由对象
|
|
421
|
+
*
|
|
422
|
+
* > 注意:如果数组中存在多个`RouteNormalized`对象,则说明是嵌套路由,第一个则是最顶层的父路由,最后一个是精确匹配到的路由。
|
|
423
|
+
*
|
|
424
|
+
* 未匹配到路由时,它会是空数组。
|
|
425
|
+
*
|
|
426
|
+
* @default []
|
|
427
|
+
*/
|
|
428
|
+
matched: RouteNormalized[];
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* 路由元数据
|
|
433
|
+
*/
|
|
434
|
+
export declare interface RouteMeta {
|
|
435
|
+
[key: string]: any;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* 命名路由
|
|
440
|
+
*/
|
|
441
|
+
export declare type RouteName = string;
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* 规范化过后的路由线路配置
|
|
445
|
+
*/
|
|
446
|
+
export declare interface RouteNormalized extends MakeRequired<Route, 'meta' | 'pattern'> {
|
|
447
|
+
children: RouteNormalized[];
|
|
448
|
+
widget: undefined | Record<string, RouteWidget>;
|
|
449
|
+
injectProps: undefined | InjectNamedProps;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export declare interface RouteOptions {
|
|
453
|
+
/**
|
|
454
|
+
* 命名视图
|
|
455
|
+
*
|
|
456
|
+
* @default 'default'
|
|
457
|
+
*/
|
|
458
|
+
name?: string;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* 路由路径
|
|
463
|
+
*/
|
|
464
|
+
export declare type RoutePath = `/${string}`;
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* 路由器基类
|
|
468
|
+
*/
|
|
469
|
+
export declare abstract class Router {
|
|
470
|
+
#private;
|
|
471
|
+
private readonly _options;
|
|
472
|
+
private readonly _namedRoutes;
|
|
473
|
+
private readonly _dynamicRoutes;
|
|
474
|
+
private readonly _pathRoutes;
|
|
475
|
+
private readonly _parentRoute;
|
|
476
|
+
private _currentTaskId;
|
|
477
|
+
private _taskCounter;
|
|
478
|
+
/**
|
|
479
|
+
* 是否正在执行 replace 操作
|
|
480
|
+
*
|
|
481
|
+
* @private
|
|
482
|
+
*/
|
|
483
|
+
private _pendingReplace;
|
|
484
|
+
/**
|
|
485
|
+
* 是否正在执行 push 操作
|
|
486
|
+
*
|
|
487
|
+
* @private
|
|
488
|
+
*/
|
|
489
|
+
private _pendingPush;
|
|
490
|
+
private _scrollBehaviorHandler;
|
|
491
|
+
private readonly _currentRouteLocation;
|
|
492
|
+
protected constructor(options: RouterOptions);
|
|
493
|
+
/**
|
|
494
|
+
* 获取单例实例
|
|
495
|
+
*
|
|
496
|
+
* @return {Router} - 路由器实例
|
|
497
|
+
*/
|
|
498
|
+
static get instance(): Router;
|
|
499
|
+
private _isBrowser;
|
|
500
|
+
/**
|
|
501
|
+
* 是否运行在浏览器端
|
|
502
|
+
*/
|
|
503
|
+
get isBrowser(): boolean;
|
|
504
|
+
private _scrollBehavior;
|
|
505
|
+
/**
|
|
506
|
+
* 滚动行为
|
|
507
|
+
*
|
|
508
|
+
* 如果options.scrollBehavior为函数,则scrollBehavior固定为auto'。
|
|
509
|
+
*/
|
|
510
|
+
get scrollBehavior(): _ScrollBehavior;
|
|
511
|
+
/**
|
|
512
|
+
* 获取配置
|
|
513
|
+
*
|
|
514
|
+
* @return {Readonly<InitializedRouterOptions>} - 初始化配置
|
|
515
|
+
*/
|
|
516
|
+
get options(): Readonly<InitializedRouterOptions>;
|
|
517
|
+
/**
|
|
518
|
+
* 路由器模式
|
|
519
|
+
*/
|
|
520
|
+
get mode(): HistoryMode;
|
|
521
|
+
/**
|
|
522
|
+
* 获取所有路由映射
|
|
523
|
+
*
|
|
524
|
+
* map键值是path,值是路由对象
|
|
525
|
+
*
|
|
526
|
+
* @return {Map<string, Route>}
|
|
527
|
+
*/
|
|
528
|
+
get pathRoutes(): ReadonlyMap<string, Route>;
|
|
529
|
+
/**
|
|
530
|
+
* 获取所有命名路由映射
|
|
531
|
+
*
|
|
532
|
+
* map键值是name,值是路由对象
|
|
533
|
+
*
|
|
534
|
+
* @return {Map<string, Route>}
|
|
535
|
+
*/
|
|
536
|
+
get namedRoutes(): ReadonlyMap<string, Route>;
|
|
537
|
+
/**
|
|
538
|
+
* 动态路由记录
|
|
539
|
+
*
|
|
540
|
+
* map键值是path段长度,值是Array<{regex: RegExp,route:RouteNormalized}>
|
|
541
|
+
*/
|
|
542
|
+
get dynamicRoutes(): Map<number, DynamicRouteRecord[]>;
|
|
543
|
+
/**
|
|
544
|
+
* ## 获取已规范的路由表
|
|
545
|
+
*
|
|
546
|
+
* 它的内存地址始终指向的是初始化时传入的路由表,但它的数据结构是经过内部规范化处理过的。
|
|
547
|
+
*
|
|
548
|
+
* 所有嵌套`Route`的path都会被自动补全为完整的路径
|
|
549
|
+
*
|
|
550
|
+
* > 注意:不要尝试修改已规范化的路由表!请使用`removeRoute`和`addRoute`方法实现路由的变更。
|
|
551
|
+
*
|
|
552
|
+
* @return {RouteNormalized[]}
|
|
553
|
+
*/
|
|
554
|
+
get routes(): ReadonlyArray<RouteNormalized>;
|
|
555
|
+
/**
|
|
556
|
+
* 基本路径
|
|
557
|
+
*/
|
|
558
|
+
get basePath(): `/${string}`;
|
|
559
|
+
/**
|
|
560
|
+
* 判断路由器是否初始化完成
|
|
561
|
+
*
|
|
562
|
+
* @return {boolean} - 如果初始化完成,返回true,否则返回false
|
|
563
|
+
*/
|
|
564
|
+
get initialized(): boolean;
|
|
565
|
+
/**
|
|
566
|
+
* 受支持的`path`后缀名
|
|
567
|
+
*/
|
|
568
|
+
get suffix(): Exclude<RouterOptions['suffix'], void>;
|
|
569
|
+
/**
|
|
570
|
+
* 当前路由数据
|
|
571
|
+
*
|
|
572
|
+
* 它是只读的,不要在外部修改它!
|
|
573
|
+
*
|
|
574
|
+
* @return {Readonly<RouteLocation>} - 当前路由数据
|
|
575
|
+
*/
|
|
576
|
+
get currentRouteLocation(): Readonly<Reactive<RouteLocation>>;
|
|
577
|
+
/**
|
|
578
|
+
* 是否处于等待状态
|
|
579
|
+
*
|
|
580
|
+
* @protected
|
|
581
|
+
*/
|
|
582
|
+
protected get isPendingNavigation(): boolean;
|
|
583
|
+
/**
|
|
584
|
+
* 等待替换完成的数据
|
|
585
|
+
*
|
|
586
|
+
* @protected
|
|
587
|
+
*/
|
|
588
|
+
protected get pendingReplaceData(): RouteLocation | null;
|
|
589
|
+
/**
|
|
590
|
+
* 等待跳转完成的数据
|
|
591
|
+
*
|
|
592
|
+
* @protected
|
|
593
|
+
*/
|
|
594
|
+
protected get pendingPushData(): RouteLocation | null;
|
|
595
|
+
/* Excluded from this release type: routeView */
|
|
596
|
+
/**
|
|
597
|
+
* 跳转指定的历史记录位置
|
|
598
|
+
*
|
|
599
|
+
* 如果未向该函数传参或delta相等于 0,则该函数与调用location.reload()具有相同的效果。
|
|
600
|
+
*
|
|
601
|
+
* @param {number} delta - 跳转的步数(正数为前进,负数为后退)
|
|
602
|
+
*/
|
|
603
|
+
abstract go(delta?: number): void;
|
|
604
|
+
/**
|
|
605
|
+
* 后退到上一个历史记录
|
|
606
|
+
*/
|
|
607
|
+
back(): void;
|
|
608
|
+
/**
|
|
609
|
+
* 前进到下一个历史记录
|
|
610
|
+
*/
|
|
611
|
+
forward(): void;
|
|
612
|
+
/**
|
|
613
|
+
* 替换当前页面
|
|
614
|
+
*
|
|
615
|
+
* @param {RouteTarget} target - 目标
|
|
616
|
+
* @return {boolean} - 是否跳转成功,非内存模式始终返回true
|
|
617
|
+
*/
|
|
618
|
+
replace(target: RouteTarget | RouteIndex): Promise<NavigateResult>;
|
|
619
|
+
/**
|
|
620
|
+
* 跳转到新的页面
|
|
621
|
+
*
|
|
622
|
+
* @param {RouteTarget} target - 目标
|
|
623
|
+
* @return {boolean} - 是否跳转成功,非内存模式始终返回true
|
|
624
|
+
*/
|
|
625
|
+
push(target: RouteTarget | RouteIndex): Promise<NavigateResult>;
|
|
626
|
+
/**
|
|
627
|
+
* 删除路由
|
|
628
|
+
*
|
|
629
|
+
* @param {string} index 路由索引,如果/开头则匹配path,其他匹配name
|
|
630
|
+
* @param {boolean} isRemoveFromRoutes 是否从路由表中移除,内部递归时传递的参数,无需外部传入!
|
|
631
|
+
*/
|
|
632
|
+
removeRoute(index: RouteIndex, isRemoveFromRoutes?: boolean): void;
|
|
633
|
+
/**
|
|
634
|
+
* 添加路由
|
|
635
|
+
*
|
|
636
|
+
* @param {Route} route - 路由描述对象
|
|
637
|
+
* @param {string} parent - 父路由的path或name,不传入则添加至路由表根节点
|
|
638
|
+
*/
|
|
639
|
+
addRoute(route: Route, parent?: string): void;
|
|
640
|
+
/**
|
|
641
|
+
* 超找路由
|
|
642
|
+
*
|
|
643
|
+
* 传入的是`path`则会调用`matchRoute`方法,传入的是`name`则会调用`getNamedRoute`方法
|
|
644
|
+
*
|
|
645
|
+
* @param {RouteIndex|RouteTarget} target - 路由索引,如果index以/开头则匹配path,其他匹配name
|
|
646
|
+
* @return {RouteNormalized | undefined} - 路由对象,如果不存在则返回undefined
|
|
647
|
+
*/
|
|
648
|
+
findRoute(target: RouteIndex | RouteTarget): RouteNormalized | undefined;
|
|
649
|
+
/**
|
|
650
|
+
* 查找命名路由
|
|
651
|
+
*
|
|
652
|
+
* @param {string} name - 路由名称
|
|
653
|
+
*/
|
|
654
|
+
findNamedRoute(name: RouteName): RouteNormalized | undefined;
|
|
655
|
+
/**
|
|
656
|
+
* 初始化路由器
|
|
657
|
+
*
|
|
658
|
+
* 只能初始化一次,多次初始化无效。
|
|
659
|
+
*
|
|
660
|
+
* 如果你使用的`createRouter(options)`助手函数创建的路由器实例则无需调用该方法。
|
|
661
|
+
*
|
|
662
|
+
* @return {this} - 返回当前路由器实例
|
|
663
|
+
*/
|
|
664
|
+
initialize(): this;
|
|
665
|
+
/**
|
|
666
|
+
* 此方法用于浏览器端滚动到指定位置
|
|
667
|
+
*
|
|
668
|
+
* @param scrollTarget
|
|
669
|
+
* @protected
|
|
670
|
+
*/
|
|
671
|
+
scrollTo(scrollTarget: ScrollTarget | undefined): void;
|
|
672
|
+
/**
|
|
673
|
+
* 获取路由的父路由
|
|
674
|
+
*
|
|
675
|
+
* @param route - 路由对象
|
|
676
|
+
* @return {RouteNormalized | undefined}
|
|
677
|
+
*/
|
|
678
|
+
findParentRoute(route: RouteNormalized): RouteNormalized | undefined;
|
|
679
|
+
/**
|
|
680
|
+
* 根据路由目标创建导航数据
|
|
681
|
+
*
|
|
682
|
+
* @param {RouteTarget} target - 路由目标
|
|
683
|
+
*/
|
|
684
|
+
createRouteLocation(target: RouteTarget): RouteLocation;
|
|
685
|
+
/**
|
|
686
|
+
* 路由跳转的通用方法
|
|
687
|
+
*
|
|
688
|
+
* `push`|`replace`方法最终都会调用此方法
|
|
689
|
+
*
|
|
690
|
+
* @protected
|
|
691
|
+
* @param {RouteTarget} target - 目标
|
|
692
|
+
* @return {Promise<NavigateResult>} - 是否导航成功
|
|
693
|
+
*/
|
|
694
|
+
navigate(target: RouteTarget): Promise<NavigateResult>;
|
|
695
|
+
/* Excluded from this release type: _completeViewRender */
|
|
696
|
+
/**
|
|
697
|
+
* 完成导航
|
|
698
|
+
*
|
|
699
|
+
* 所有子类在完成导航的后续处理过后必须调用该方法!
|
|
700
|
+
*
|
|
701
|
+
* @param {RouteLocation} data - 如果是由`replace`或`push`方法发起的导航则无需传入此参数。
|
|
702
|
+
* @param {_ScrollToOptions} savedPosition - 保存的滚动位置信息,用于恢复滚动位置
|
|
703
|
+
* @protected
|
|
704
|
+
*/
|
|
705
|
+
protected completeNavigation(data?: RouteLocation, savedPosition?: _ScrollToOptions): void;
|
|
706
|
+
/**
|
|
707
|
+
* 更新当前导航数据中的query参数
|
|
708
|
+
*
|
|
709
|
+
* 会同步更新`fullPath`
|
|
710
|
+
*
|
|
711
|
+
* @param {Record<string, string>} query - 新的query参数对象
|
|
712
|
+
* @protected
|
|
713
|
+
*/
|
|
714
|
+
protected updateQuery(query: Record<string, string>): void;
|
|
715
|
+
/**
|
|
716
|
+
* 更新当前导航数据中的hash参数
|
|
717
|
+
*
|
|
718
|
+
* 会同步更新`fullPath`
|
|
719
|
+
*
|
|
720
|
+
* @param {`#${string}` | ''} hash - 新的hash参数,如果为空则表示无hash
|
|
721
|
+
* @protected
|
|
722
|
+
*/
|
|
723
|
+
protected updateHash(hash: `#${string}` | ''): void;
|
|
724
|
+
/**
|
|
725
|
+
* 初始化路由器
|
|
726
|
+
*
|
|
727
|
+
* 子类可重写此方法以完成路由器的初始化
|
|
728
|
+
*
|
|
729
|
+
* @private
|
|
730
|
+
*/
|
|
731
|
+
protected abstract initializeRouter(): void;
|
|
732
|
+
/**
|
|
733
|
+
* 路由匹配
|
|
734
|
+
*
|
|
735
|
+
*
|
|
736
|
+
* @param {string} path - 路径
|
|
737
|
+
*
|
|
738
|
+
* @return {MatchResult} 如果匹配失败则返回undefined
|
|
739
|
+
*/
|
|
740
|
+
protected matchRoute(path: RoutePath): MatchResult;
|
|
741
|
+
/**
|
|
742
|
+
* 创建完整路径
|
|
743
|
+
*
|
|
744
|
+
* @protected
|
|
745
|
+
* @param path - 路径
|
|
746
|
+
* @param query - ?查询参数
|
|
747
|
+
* @param hash - #哈希值
|
|
748
|
+
* @return {string}
|
|
749
|
+
*/
|
|
750
|
+
protected makeFullPath(path: string, query: `?${string}` | '' | Record<string, string>, hash: HashStr): `/${string}`;
|
|
751
|
+
/**
|
|
752
|
+
* 添加历史记录
|
|
753
|
+
*
|
|
754
|
+
* 子类必须实现该方法
|
|
755
|
+
*
|
|
756
|
+
* @param data
|
|
757
|
+
* @protected
|
|
758
|
+
*/
|
|
759
|
+
protected abstract pushHistory(data: RouteLocation): void;
|
|
760
|
+
/**
|
|
761
|
+
* 替换历史记录
|
|
762
|
+
*
|
|
763
|
+
* 子类必须实现该方法
|
|
764
|
+
*
|
|
765
|
+
* @param {RouteLocation} data - 目标路由
|
|
766
|
+
* @protected
|
|
767
|
+
*/
|
|
768
|
+
protected abstract replaceHistory(data: RouteLocation): void;
|
|
769
|
+
/**
|
|
770
|
+
* 判断是否相同的导航请求
|
|
771
|
+
*
|
|
772
|
+
* @param to
|
|
773
|
+
* @param from
|
|
774
|
+
* @protected
|
|
775
|
+
*/
|
|
776
|
+
protected isSameNavigate(to: RouteLocation, from: RouteLocation): boolean;
|
|
777
|
+
/**
|
|
778
|
+
* 触发路由前置守卫
|
|
779
|
+
*
|
|
780
|
+
* @param {DeepReadonly<RouteLocation>} to - 路由目标对象
|
|
781
|
+
* @param {DeepReadonly<RouteLocation>} from - 前路由对象
|
|
782
|
+
* @return {false | RouteTarget} - 返回false表示阻止导航,返回新的路由目标对象则表示导航到新的目标
|
|
783
|
+
*/
|
|
784
|
+
protected onBeforeEach(to: DeepReadonly<RouteLocation>, from: DeepReadonly<RouteLocation>): BeforeEachCallbackResult;
|
|
785
|
+
/**
|
|
786
|
+
* 触发路由后置守卫
|
|
787
|
+
*
|
|
788
|
+
* @param {DeepReadonly<RouteLocation>} to - 路由目标对象
|
|
789
|
+
* @param {DeepReadonly<RouteLocation>} from - 前路由对象
|
|
790
|
+
*/
|
|
791
|
+
protected onAfterEach(to: DeepReadonly<RouteLocation>, from: DeepReadonly<RouteLocation>): void;
|
|
792
|
+
/**
|
|
793
|
+
* 更新路由数据
|
|
794
|
+
*
|
|
795
|
+
* @private
|
|
796
|
+
* @param {RouteLocation} newLocation - 新的路由数据对象
|
|
797
|
+
*/
|
|
798
|
+
private updateRouteLocation;
|
|
799
|
+
/**
|
|
800
|
+
* 判断是否为允许的后缀
|
|
801
|
+
*
|
|
802
|
+
* @param suffix
|
|
803
|
+
* @private
|
|
804
|
+
*/
|
|
805
|
+
private isAllowedSuffix;
|
|
806
|
+
/**
|
|
807
|
+
* 触发滚动行为
|
|
808
|
+
*
|
|
809
|
+
* @param {RouteLocation} to - 目标导航数据对象
|
|
810
|
+
* @param {RouteLocation} from - 前导航数据对象
|
|
811
|
+
* @param {_ScrollToOptions | undefined} savedPosition - 保存的滚动位置
|
|
812
|
+
* @private
|
|
813
|
+
*/
|
|
814
|
+
private onScrollBehavior;
|
|
815
|
+
/**
|
|
816
|
+
* 从源路由表中删除路由
|
|
817
|
+
*
|
|
818
|
+
* @param route
|
|
819
|
+
* @protected
|
|
820
|
+
*/
|
|
821
|
+
private removedFromRoutes;
|
|
822
|
+
/**
|
|
823
|
+
* 删除动态路由映射
|
|
824
|
+
*
|
|
825
|
+
* @param path
|
|
826
|
+
* @protected
|
|
827
|
+
*/
|
|
828
|
+
private removeDynamicRoute;
|
|
829
|
+
/**
|
|
830
|
+
* 初始化路由表
|
|
831
|
+
*
|
|
832
|
+
* @param routes
|
|
833
|
+
*/
|
|
834
|
+
private setupRoutes;
|
|
835
|
+
/**
|
|
836
|
+
* 注册路由
|
|
837
|
+
*
|
|
838
|
+
* @param {Route} route - 路由对象
|
|
839
|
+
* @param {RouteNormalized} group - 路由所在的分组
|
|
840
|
+
* @protected
|
|
841
|
+
*/
|
|
842
|
+
private registerRoute;
|
|
843
|
+
/**
|
|
844
|
+
* 如果路径是严格匹配,则转换为小写
|
|
845
|
+
*
|
|
846
|
+
* @param path
|
|
847
|
+
* @private
|
|
848
|
+
*/
|
|
849
|
+
private strictPath;
|
|
850
|
+
/**
|
|
851
|
+
* 记录路由
|
|
852
|
+
*
|
|
853
|
+
* @param {Route} route - 路由对象
|
|
854
|
+
* @protected
|
|
855
|
+
*/
|
|
856
|
+
private recordRoute;
|
|
857
|
+
/**
|
|
858
|
+
* 添加动态路由
|
|
859
|
+
* @param route
|
|
860
|
+
*/
|
|
861
|
+
private recordDynamicRoute;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
/**
|
|
865
|
+
* # 路由跳转小部件
|
|
866
|
+
*
|
|
867
|
+
* 它只是简单的实现了一个a标签,点击后跳转到目标路由,
|
|
868
|
+
* 如果有更高级的定制需求,往往你可以项目中自行编写一个小部件来实现任何你想要的效果。
|
|
869
|
+
*/
|
|
870
|
+
export declare class RouterLink extends Widget<RouterLinkProps> {
|
|
871
|
+
/**
|
|
872
|
+
* 路由目标
|
|
873
|
+
*
|
|
874
|
+
* 计算属性
|
|
875
|
+
*
|
|
876
|
+
* @protected
|
|
877
|
+
*/
|
|
878
|
+
protected target: Computed<RouteTarget>;
|
|
879
|
+
/**
|
|
880
|
+
* 路由目标对应的`RouteLocation`对象
|
|
881
|
+
*
|
|
882
|
+
* 计算属性
|
|
883
|
+
*
|
|
884
|
+
* @protected
|
|
885
|
+
*/
|
|
886
|
+
protected location: Computed<RouteLocation>;
|
|
887
|
+
/**
|
|
888
|
+
* 激活状态
|
|
889
|
+
*
|
|
890
|
+
* 计算属性
|
|
891
|
+
*
|
|
892
|
+
* @protected
|
|
893
|
+
*/
|
|
894
|
+
protected active: Computed<boolean>;
|
|
895
|
+
protected htmlProps: Computed<WebRuntimeDom.HtmlProperties<HTMLAnchorElement>>;
|
|
896
|
+
constructor(props: RouterLinkProps);
|
|
897
|
+
/**
|
|
898
|
+
* 当前是否处于激活状态
|
|
899
|
+
*/
|
|
900
|
+
get isActive(): boolean;
|
|
901
|
+
get isDisabled(): boolean;
|
|
902
|
+
/**
|
|
903
|
+
* 路由目标地址
|
|
904
|
+
*/
|
|
905
|
+
get href(): string;
|
|
906
|
+
/**
|
|
907
|
+
* 导航到目标路由
|
|
908
|
+
*
|
|
909
|
+
* 该方法用于处理`a`标签的点击事件
|
|
910
|
+
*
|
|
911
|
+
* @param e
|
|
912
|
+
*/
|
|
913
|
+
protected navigate(e: MouseEvent): void;
|
|
914
|
+
protected build(): Element_2;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
export declare interface RouterLinkProps {
|
|
918
|
+
/**
|
|
919
|
+
* 要跳转的目标
|
|
920
|
+
*
|
|
921
|
+
* 可以是路由目标对象,也可以是路由索引
|
|
922
|
+
*/
|
|
923
|
+
to: RouteTarget | RouteIndex;
|
|
924
|
+
/**
|
|
925
|
+
* 子节点插槽
|
|
926
|
+
*/
|
|
927
|
+
children: Element_2 | Element_2[] | string;
|
|
928
|
+
/**
|
|
929
|
+
* a 标签的style属性
|
|
930
|
+
*/
|
|
931
|
+
style?: WebRuntimeDom.HTMLStyleProperties;
|
|
932
|
+
/**
|
|
933
|
+
* a 标签的class属性
|
|
934
|
+
*/
|
|
935
|
+
class?: WebRuntimeDom.HTMLClassProperties;
|
|
936
|
+
/**
|
|
937
|
+
* 是否禁用
|
|
938
|
+
*
|
|
939
|
+
* @default false
|
|
940
|
+
*/
|
|
941
|
+
disabled?: boolean;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
/**
|
|
945
|
+
* 路由器配置
|
|
946
|
+
*/
|
|
947
|
+
export declare interface RouterOptions<T_MODE extends HistoryMode = HistoryMode> {
|
|
948
|
+
/**
|
|
949
|
+
* 根路径
|
|
950
|
+
*
|
|
951
|
+
* 假设你的项目在`/sub-path`目录下运行,那么你需要设置该值为`/sub-path`,它与`vite.base`配置值应保持一致。
|
|
952
|
+
*
|
|
953
|
+
* @default '/'
|
|
954
|
+
*/
|
|
955
|
+
base?: `/${string}`;
|
|
956
|
+
/**
|
|
957
|
+
* 历史记录模式
|
|
958
|
+
*
|
|
959
|
+
* 可选值如下:
|
|
960
|
+
* 1. path模式:使用path值作为路由标识,如:`/page1`
|
|
961
|
+
* 2. hash模式:使用hash值作为路由标识,如:`/#/page1`
|
|
962
|
+
* 3. memory模式:内存模式,用于非浏览器端,或不需要使用浏览器回退和前进功能时使用。
|
|
963
|
+
*
|
|
964
|
+
* @note 使用memory模式需在路由器实例化完成后使用replace替换掉初始的伪路由,另外两种模式是浏览器端使用的,会自动完成这个操作!
|
|
965
|
+
* @default 'path' 默认视为是浏览器端
|
|
966
|
+
*/
|
|
967
|
+
mode?: T_MODE;
|
|
968
|
+
/**
|
|
969
|
+
* 是否严格匹配路由
|
|
970
|
+
*
|
|
971
|
+
* 严格匹配指:区分大小写
|
|
972
|
+
*
|
|
973
|
+
* @default false
|
|
974
|
+
*/
|
|
975
|
+
strict?: boolean;
|
|
976
|
+
/**
|
|
977
|
+
* 路由表
|
|
978
|
+
*
|
|
979
|
+
* @note 注意:路由表传入过后,不应该在外部进行修改,如需修改需使用`Router.removeRoute`或`Router.addRoute`方法。
|
|
980
|
+
*/
|
|
981
|
+
routes: Route[];
|
|
982
|
+
/**
|
|
983
|
+
* 全局路由前置钩子
|
|
984
|
+
*
|
|
985
|
+
* @see BeforeEachCallback
|
|
986
|
+
*/
|
|
987
|
+
beforeEach?: BeforeEachCallback;
|
|
988
|
+
/**
|
|
989
|
+
* 全局路由后置钩子
|
|
990
|
+
*
|
|
991
|
+
* @see AfterEachCallback
|
|
992
|
+
*/
|
|
993
|
+
afterEach?: AfterEachCallback;
|
|
994
|
+
/**
|
|
995
|
+
* 滚动行为
|
|
996
|
+
*
|
|
997
|
+
* 可以传入`ScrollBehavior`或`ScrollBehaviorHandler`函数自定义滚动行为。
|
|
998
|
+
*
|
|
999
|
+
* @default 'smooth'
|
|
1000
|
+
*/
|
|
1001
|
+
scrollBehavior?: _ScrollBehavior | ScrollBehaviorHandler;
|
|
1002
|
+
/**
|
|
1003
|
+
* 支持的后缀名,如:.html、.md等。
|
|
1004
|
+
*
|
|
1005
|
+
* 可选值类型:
|
|
1006
|
+
* 1. 通配符:`*`:支持所有后缀名,如:`/page.html`、`/page.md`等。
|
|
1007
|
+
* 2. 字符串类型:`html`:支持html后缀名
|
|
1008
|
+
* 3. 数组:`['html','md']`:同时支持html和md后缀名,注意不要以`.`开头
|
|
1009
|
+
* 4. false:不做任何处理,硬性匹配。
|
|
1010
|
+
* @default false
|
|
1011
|
+
*/
|
|
1012
|
+
suffix?: '*' | string | string[] | false;
|
|
1013
|
+
/**
|
|
1014
|
+
* 默认path变量匹配模式
|
|
1015
|
+
*
|
|
1016
|
+
* @default '/[\w.]+/'
|
|
1017
|
+
*/
|
|
1018
|
+
pattern?: RegExp;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
/**
|
|
1022
|
+
* # 路由器视图
|
|
1023
|
+
*
|
|
1024
|
+
* 用于渲染路由线路配置的`widget`,可以在子组件中嵌套`RouterView`,但应用内只能存在一个根视图。
|
|
1025
|
+
*
|
|
1026
|
+
* 如需实现页面缓存等功能,可以重写该类的{@link build}方法。
|
|
1027
|
+
*/
|
|
1028
|
+
export declare class RouterView extends Widget<RouteOptions> {
|
|
1029
|
+
#private;
|
|
1030
|
+
constructor(props: RouteOptions);
|
|
1031
|
+
/**
|
|
1032
|
+
* 当前路由器视图所在层级索引
|
|
1033
|
+
*
|
|
1034
|
+
* `index`的值从0开始,它与`RouteLocation.matched`数组下标一一对应
|
|
1035
|
+
*/
|
|
1036
|
+
get index(): number;
|
|
1037
|
+
/**
|
|
1038
|
+
* 是否为最后一个路由视图
|
|
1039
|
+
*/
|
|
1040
|
+
get isLastView(): boolean;
|
|
1041
|
+
/**
|
|
1042
|
+
* 视图名称
|
|
1043
|
+
*
|
|
1044
|
+
* @default 'default'
|
|
1045
|
+
*/
|
|
1046
|
+
get name(): string;
|
|
1047
|
+
get matchedRoute(): RouteNormalized | undefined;
|
|
1048
|
+
/**
|
|
1049
|
+
* 当前路由器视图要显示的虚拟节点
|
|
1050
|
+
*
|
|
1051
|
+
* 注意未匹配时会返回`undefined`,匹配成功时返回的是`VNode<WidgetType>`
|
|
1052
|
+
*
|
|
1053
|
+
* @protected
|
|
1054
|
+
*/
|
|
1055
|
+
protected get currentElement(): VNode | undefined;
|
|
1056
|
+
/**
|
|
1057
|
+
* 当前的路由位置对象
|
|
1058
|
+
*
|
|
1059
|
+
* @protected
|
|
1060
|
+
*/
|
|
1061
|
+
protected get location(): Readonly<Reactive<RouteLocation>>;
|
|
1062
|
+
/**
|
|
1063
|
+
* @inheritDoc
|
|
1064
|
+
*/
|
|
1065
|
+
protected onMounted(): void;
|
|
1066
|
+
/**
|
|
1067
|
+
* @inheritDoc
|
|
1068
|
+
*/
|
|
1069
|
+
protected onUpdated(): void;
|
|
1070
|
+
/**
|
|
1071
|
+
* ## 构建视图
|
|
1072
|
+
*
|
|
1073
|
+
* 可以重写该方法添加自定义的视图元素
|
|
1074
|
+
*
|
|
1075
|
+
* 例如,使用`KeepAlive`组件缓存当前视图元素:
|
|
1076
|
+
* ```tsx
|
|
1077
|
+
* protected build() {
|
|
1078
|
+
* // 不可省略,因为`KeepAlive`不能渲染非组件节点。
|
|
1079
|
+
* if (!this.currentElement) return <></> // 使用空片段节点占位
|
|
1080
|
+
*
|
|
1081
|
+
* // 将当前显示的视图元素(VNode<WidgetType>对象)传递给`KeepAlive`插槽,使用缓存功能。
|
|
1082
|
+
* return <KeepAlive onlyKey={this.matchedRoute?.path}>{this.currentElement}</KeepAlive>
|
|
1083
|
+
* }
|
|
1084
|
+
* ```
|
|
1085
|
+
* @protected
|
|
1086
|
+
*/
|
|
1087
|
+
protected build(): Element_2;
|
|
1088
|
+
/**
|
|
1089
|
+
* 视图渲染完成通知路由器
|
|
1090
|
+
*
|
|
1091
|
+
* @private
|
|
1092
|
+
*/
|
|
1093
|
+
private completeViewRender;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
/**
|
|
1097
|
+
* 路由目标
|
|
1098
|
+
*/
|
|
1099
|
+
export declare interface RouteTarget {
|
|
1100
|
+
/**
|
|
1101
|
+
* 索引,/开头为路径,否则为名称
|
|
1102
|
+
*/
|
|
1103
|
+
index: RouteIndex;
|
|
1104
|
+
/**
|
|
1105
|
+
* hash
|
|
1106
|
+
*/
|
|
1107
|
+
hash?: HashStr;
|
|
1108
|
+
/**
|
|
1109
|
+
* 路由query参数
|
|
1110
|
+
*/
|
|
1111
|
+
query?: Record<string, string>;
|
|
1112
|
+
/**
|
|
1113
|
+
* 路由参数
|
|
1114
|
+
*/
|
|
1115
|
+
params?: Record<string, any>;
|
|
1116
|
+
/**
|
|
1117
|
+
* 是否替换当前路由
|
|
1118
|
+
*/
|
|
1119
|
+
isReplace?: boolean;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
/**
|
|
1123
|
+
* 路由视图小部件
|
|
1124
|
+
*/
|
|
1125
|
+
declare type RouteWidget = WidgetType | LazyLoad<WidgetType>;
|
|
1126
|
+
|
|
1127
|
+
/**
|
|
1128
|
+
* 滚动行为
|
|
1129
|
+
*
|
|
1130
|
+
* 1. auto: 默认值,浏览器会自动决定滚动行为
|
|
1131
|
+
* 2. instant: 立即滚动到目标位置,不考虑动画效果
|
|
1132
|
+
* 3. smooth: 平滑滚动到目标位置,考虑动画效果
|
|
1133
|
+
*/
|
|
1134
|
+
export declare type _ScrollBehavior = 'auto' | 'instant' | 'smooth';
|
|
1135
|
+
|
|
1136
|
+
/**
|
|
1137
|
+
* 滚动行为处理器
|
|
1138
|
+
*
|
|
1139
|
+
* 仅浏览器环境有效。
|
|
1140
|
+
*
|
|
1141
|
+
* @param {RouteLocation} to - 要跳转的目标路由
|
|
1142
|
+
* @param {RouteLocation} from - 从哪个路由跳转过来
|
|
1143
|
+
* @param {_ScrollToOptions|undefined} savedPosition - 保存滚动位置,仅`history`模式前进或后退时有效
|
|
1144
|
+
* @returns {ScrollResult} - 返回滚动结果,由内部程序完成滚动
|
|
1145
|
+
*/
|
|
1146
|
+
export declare type ScrollBehaviorHandler = (to: RouteTarget, from: RouteTarget, savedPosition: _ScrollToOptions | undefined) => ScrollResult | Promise<ScrollResult>;
|
|
1147
|
+
|
|
1148
|
+
/**
|
|
1149
|
+
* 滚动到视图配置
|
|
1150
|
+
*
|
|
1151
|
+
* @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView
|
|
1152
|
+
*/
|
|
1153
|
+
export declare interface _ScrollIntoViewOptions extends ScrollIntoViewOptions {
|
|
1154
|
+
el: Element | `#${string}` | string;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
/**
|
|
1158
|
+
* 滚动结果
|
|
1159
|
+
*
|
|
1160
|
+
* false表示不滚动,否则内部会根据`ScrollTarget`滚动到指定的位置
|
|
1161
|
+
*/
|
|
1162
|
+
declare type ScrollResult = ScrollTarget | false;
|
|
1163
|
+
|
|
1164
|
+
/**
|
|
1165
|
+
* 滚动目标
|
|
1166
|
+
*/
|
|
1167
|
+
export declare type ScrollTarget = _ScrollToOptions | _ScrollIntoViewOptions;
|
|
1168
|
+
|
|
1169
|
+
/**
|
|
1170
|
+
* 滚动配置
|
|
1171
|
+
*
|
|
1172
|
+
* @see https://developer.mozilla.org/zh-CN/docs/Web/API/Window/scrollTo
|
|
1173
|
+
*/
|
|
1174
|
+
export declare interface _ScrollToOptions {
|
|
1175
|
+
/**
|
|
1176
|
+
* 滚动到目标位置的X坐标
|
|
1177
|
+
*/
|
|
1178
|
+
left?: number;
|
|
1179
|
+
/**
|
|
1180
|
+
* 滚动到目标位置的Y坐标
|
|
1181
|
+
*/
|
|
1182
|
+
top?: number;
|
|
1183
|
+
/**
|
|
1184
|
+
* 滚动行为
|
|
1185
|
+
*
|
|
1186
|
+
* @see _ScrollBehavior
|
|
1187
|
+
*/
|
|
1188
|
+
behavior?: _ScrollBehavior;
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
/**
|
|
1192
|
+
* 获取当前`RouteLocation`对象
|
|
1193
|
+
*
|
|
1194
|
+
* 它是`Router.instance.currentRouteLocation`属性的助手函数,优化函数式编程体验。
|
|
1195
|
+
*
|
|
1196
|
+
* 简单示例:
|
|
1197
|
+
* ```jsx
|
|
1198
|
+
* import { useRoute } from 'vitarx-router'
|
|
1199
|
+
*
|
|
1200
|
+
* // 监听路由参数变化示例
|
|
1201
|
+
* export default function App() {
|
|
1202
|
+
* const route = useRoute()
|
|
1203
|
+
* watch(()=>route.params.id, (newId, oldId) => {
|
|
1204
|
+
* console.log(`监听到id参数变化, 旧值:${oldId}, 新值:${newId}`)
|
|
1205
|
+
* })
|
|
1206
|
+
* return <div>当前路由参数ID:{route.params.id}</div>
|
|
1207
|
+
* }
|
|
1208
|
+
* ```
|
|
1209
|
+
*
|
|
1210
|
+
* @return {Readonly<Reactive<RouteLocation>>} - 只读的`RouteLocation`对象
|
|
1211
|
+
*/
|
|
1212
|
+
export declare function useRoute(): Readonly<Reactive<RouteLocation>>;
|
|
1213
|
+
|
|
1214
|
+
/**
|
|
1215
|
+
* 获取路由器实例
|
|
1216
|
+
*
|
|
1217
|
+
* 与使用`Router.instance`静态属性获取是一致的效果。
|
|
1218
|
+
*
|
|
1219
|
+
* @return {Router} - 路由器实例
|
|
1220
|
+
* @throws {Error} - 如果路由器实例未初始化,则抛出异常
|
|
1221
|
+
*/
|
|
1222
|
+
export declare function useRouter<T extends Router>(): T;
|
|
1223
|
+
|
|
1224
|
+
/**
|
|
1225
|
+
* 基于`window.history`实现的路由器
|
|
1226
|
+
*
|
|
1227
|
+
* 支持浏览器前进、后退、跳转等操作
|
|
1228
|
+
*/
|
|
1229
|
+
export declare class WebHistoryRouter extends Router {
|
|
1230
|
+
constructor(options: RouterOptions<'path' | 'hash'>);
|
|
1231
|
+
/**
|
|
1232
|
+
* 当前路由目标
|
|
1233
|
+
*
|
|
1234
|
+
* @returns {RouteTarget} - 包含 index、hash 和 query 的对象
|
|
1235
|
+
*/
|
|
1236
|
+
protected get currentRouteTarget(): MakeRequired<RouteTarget, 'query' | 'hash'>;
|
|
1237
|
+
/**
|
|
1238
|
+
* window.history
|
|
1239
|
+
*
|
|
1240
|
+
* @private
|
|
1241
|
+
*/
|
|
1242
|
+
private get webHistory();
|
|
1243
|
+
/**
|
|
1244
|
+
* @inheritDoc
|
|
1245
|
+
*/
|
|
1246
|
+
go(delta?: number): void;
|
|
1247
|
+
/**
|
|
1248
|
+
* @inheritDoc
|
|
1249
|
+
*/
|
|
1250
|
+
protected initializeRouter(): void;
|
|
1251
|
+
/**
|
|
1252
|
+
* @inheritDoc
|
|
1253
|
+
*/
|
|
1254
|
+
protected pushHistory(data: RouteLocation): void;
|
|
1255
|
+
/**
|
|
1256
|
+
* @inheritDoc
|
|
1257
|
+
*/
|
|
1258
|
+
protected replaceHistory(data: RouteLocation): void;
|
|
1259
|
+
/**
|
|
1260
|
+
* 保存当前页面滚动位置
|
|
1261
|
+
*
|
|
1262
|
+
* @private
|
|
1263
|
+
*/
|
|
1264
|
+
private saveCurrentScrollPosition;
|
|
1265
|
+
/**
|
|
1266
|
+
* 创建历史记录状态
|
|
1267
|
+
*
|
|
1268
|
+
* 用于在浏览器历史记录中存储路由信息,以支持前进、后退等操作。
|
|
1269
|
+
*
|
|
1270
|
+
* @param data - 路由数据
|
|
1271
|
+
* @param hash - 要替换的哈希值
|
|
1272
|
+
* @param query - 要替换的查询参数
|
|
1273
|
+
* @private
|
|
1274
|
+
*/
|
|
1275
|
+
private createState;
|
|
1276
|
+
/**
|
|
1277
|
+
* 处理浏览器历史记录的返回/前进事件
|
|
1278
|
+
*/
|
|
1279
|
+
private onPopState;
|
|
1280
|
+
/**
|
|
1281
|
+
* 确保路径是 hash 格式
|
|
1282
|
+
*
|
|
1283
|
+
* @private
|
|
1284
|
+
*/
|
|
1285
|
+
private ensureHash;
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
export { }
|
|
1289
|
+
|
|
1290
|
+
|
|
1291
|
+
declare global {
|
|
1292
|
+
/**
|
|
1293
|
+
* 此全局类型用于,扩展路由索引类型,完善路由索引提示,提升开发体验。
|
|
1294
|
+
*
|
|
1295
|
+
* @example
|
|
1296
|
+
* ```ts
|
|
1297
|
+
* // 在项目中的全局类型声明文件中写入如下类型即可在使用push,replace方法时提示路由索引
|
|
1298
|
+
* type VitarxRouterRouteIndexTyped = 'home'|'page' // 添加自定义的路由
|
|
1299
|
+
* ```
|
|
1300
|
+
*/
|
|
1301
|
+
type VitarxRouterRouteIndexTyped = string;
|
|
1302
|
+
}
|