@fukict/router 0.1.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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/dist/Link.d.ts +38 -0
  3. package/dist/Link.d.ts.map +1 -0
  4. package/dist/Link.js +138 -0
  5. package/dist/Link.js.map +1 -0
  6. package/dist/RouteComponent.d.ts +85 -0
  7. package/dist/RouteComponent.d.ts.map +1 -0
  8. package/dist/RouteComponent.js +153 -0
  9. package/dist/RouteComponent.js.map +1 -0
  10. package/dist/Router.d.ts +128 -0
  11. package/dist/Router.d.ts.map +1 -0
  12. package/dist/Router.js +417 -0
  13. package/dist/Router.js.map +1 -0
  14. package/dist/RouterProvider.d.ts +41 -0
  15. package/dist/RouterProvider.d.ts.map +1 -0
  16. package/dist/RouterProvider.js +104 -0
  17. package/dist/RouterProvider.js.map +1 -0
  18. package/dist/RouterView.d.ts +27 -0
  19. package/dist/RouterView.d.ts.map +1 -0
  20. package/dist/RouterView.js +66 -0
  21. package/dist/RouterView.js.map +1 -0
  22. package/dist/history/base.d.ts +45 -0
  23. package/dist/history/base.d.ts.map +1 -0
  24. package/dist/history/base.js +47 -0
  25. package/dist/history/base.js.map +1 -0
  26. package/dist/history/browser.d.ts +17 -0
  27. package/dist/history/browser.d.ts.map +1 -0
  28. package/dist/history/browser.js +76 -0
  29. package/dist/history/browser.js.map +1 -0
  30. package/dist/history/hash.d.ts +14 -0
  31. package/dist/history/hash.d.ts.map +1 -0
  32. package/dist/history/hash.js +51 -0
  33. package/dist/history/hash.js.map +1 -0
  34. package/dist/history/index.d.ts +12 -0
  35. package/dist/history/index.d.ts.map +1 -0
  36. package/dist/history/index.js +16 -0
  37. package/dist/history/index.js.map +1 -0
  38. package/dist/history/types.d.ts +34 -0
  39. package/dist/history/types.d.ts.map +1 -0
  40. package/dist/history/types.js +2 -0
  41. package/dist/history/types.js.map +1 -0
  42. package/dist/index.d.ts +15 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +16 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/matcher.d.ts +59 -0
  47. package/dist/matcher.d.ts.map +1 -0
  48. package/dist/matcher.js +213 -0
  49. package/dist/matcher.js.map +1 -0
  50. package/dist/metadata.d.ts +14 -0
  51. package/dist/metadata.d.ts.map +1 -0
  52. package/dist/metadata.js +14 -0
  53. package/dist/metadata.js.map +1 -0
  54. package/dist/types.d.ts +331 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +54 -0
package/dist/Router.js ADDED
@@ -0,0 +1,417 @@
1
+ import { createHistory } from './history';
2
+ import { RouteMatcher } from './matcher';
3
+ /**
4
+ * Router 类
5
+ */
6
+ export class Router {
7
+ /**
8
+ * 全局单例
9
+ */
10
+ static instance = null;
11
+ /**
12
+ * History 管理器
13
+ */
14
+ history;
15
+ /**
16
+ * 路由匹配器
17
+ */
18
+ matcher;
19
+ /**
20
+ * 当前路由
21
+ */
22
+ currentRoute;
23
+ /**
24
+ * 路由变化监听器列表
25
+ */
26
+ listeners = new Set();
27
+ /**
28
+ * 全局前置守卫
29
+ */
30
+ beforeEachGuards = [];
31
+ /**
32
+ * 全局后置钩子
33
+ */
34
+ afterEachHooks = [];
35
+ /**
36
+ * 路由深度(用于嵌套路由)
37
+ */
38
+ depth;
39
+ /**
40
+ * 配置选项
41
+ */
42
+ options;
43
+ /**
44
+ * 构造函数
45
+ * @param options 路由配置选项
46
+ * @param depth 路由深度(用于嵌套路由,内部使用)
47
+ */
48
+ constructor(options, depth = 0) {
49
+ this.options = options;
50
+ this.depth = depth;
51
+ // 使用传入的 history 或创建新的 history 管理器
52
+ this.history =
53
+ options.history || createHistory(options.mode || 'hash', options.base);
54
+ // 创建路由匹配器
55
+ this.matcher = new RouteMatcher(options.routes);
56
+ // 初始化当前路由
57
+ const initialPath = this.history.getCurrentPath();
58
+ const initialRoute = this.createRoute(initialPath);
59
+ // 检查初始路由是否需要重定向
60
+ if (initialRoute.meta.__redirect__) {
61
+ const redirectPath = initialRoute.meta.__redirect__;
62
+ // 使用 replace 避免产生历史记录
63
+ this.history.replace(redirectPath);
64
+ // 重新创建路由对象
65
+ this.currentRoute = this.createRoute(redirectPath);
66
+ }
67
+ else {
68
+ this.currentRoute = initialRoute;
69
+ }
70
+ // 注册全局守卫
71
+ if (options.beforeEach) {
72
+ this.beforeEachGuards.push(options.beforeEach);
73
+ }
74
+ if (options.afterEach) {
75
+ this.afterEachHooks.push(options.afterEach);
76
+ }
77
+ // 设置全局单例(仅顶层 Router)
78
+ if (depth === 0) {
79
+ Router.instance = this;
80
+ }
81
+ }
82
+ /**
83
+ * 获取全局 Router 实例
84
+ */
85
+ static getInstance() {
86
+ return Router.instance;
87
+ }
88
+ /**
89
+ * 获取当前深度匹配的路由配置
90
+ */
91
+ get matched() {
92
+ return this.currentRoute.matched[this.depth] || null;
93
+ }
94
+ /**
95
+ * 创建子路由(depth + 1)
96
+ */
97
+ createChild() {
98
+ const childRouter = new Router(this.options, this.depth + 1);
99
+ // 子路由共享父路由的 currentRoute
100
+ childRouter.currentRoute = this.currentRoute;
101
+ return childRouter;
102
+ }
103
+ /**
104
+ * 清理资源
105
+ */
106
+ destroy() {
107
+ this.listeners.clear();
108
+ // 清除全局单例
109
+ if (Router.instance === this) {
110
+ Router.instance = null;
111
+ }
112
+ }
113
+ /**
114
+ * 导航到指定路径(由 RouterProvider 调用)
115
+ * 包含守卫逻辑
116
+ */
117
+ async navigate(path) {
118
+ const to = this.createRoute(path);
119
+ const from = this.currentRoute;
120
+ // 检查是否需要重定向
121
+ if (to.meta.__redirect__) {
122
+ const redirectPath = to.meta.__redirect__;
123
+ // 使用 replace 避免产生历史记录
124
+ this.history.replace(redirectPath);
125
+ return;
126
+ }
127
+ // 执行导航守卫
128
+ let shouldNavigate = true;
129
+ let redirectPath = null;
130
+ for (const guard of this.beforeEachGuards) {
131
+ await new Promise(resolve => {
132
+ guard(to, from, (path) => {
133
+ if (path === false) {
134
+ shouldNavigate = false;
135
+ }
136
+ else if (typeof path === 'string') {
137
+ shouldNavigate = false;
138
+ redirectPath = path;
139
+ }
140
+ resolve();
141
+ });
142
+ });
143
+ if (!shouldNavigate) {
144
+ break;
145
+ }
146
+ }
147
+ // 检查路由级守卫
148
+ if (shouldNavigate && to.matched.length > 0) {
149
+ const routeConfig = to.matched[to.matched.length - 1];
150
+ if (routeConfig.beforeEnter) {
151
+ await new Promise(resolve => {
152
+ routeConfig.beforeEnter(to, from, (path) => {
153
+ if (path === false) {
154
+ shouldNavigate = false;
155
+ }
156
+ else if (typeof path === 'string') {
157
+ shouldNavigate = false;
158
+ redirectPath = path;
159
+ }
160
+ resolve();
161
+ });
162
+ });
163
+ }
164
+ }
165
+ // 处理重定向
166
+ if (redirectPath) {
167
+ this.push(redirectPath);
168
+ return;
169
+ }
170
+ // 如果不允许导航,恢复原路径
171
+ if (!shouldNavigate) {
172
+ // 恢复 history
173
+ this.history.replace(from.path);
174
+ return;
175
+ }
176
+ // 更新当前路由
177
+ this.currentRoute = to;
178
+ // 通知监听器
179
+ this.notify();
180
+ // 执行后置钩子
181
+ for (const hook of this.afterEachHooks) {
182
+ hook(to, from);
183
+ }
184
+ }
185
+ /**
186
+ * 更新路由状态(由 history 监听器调用)
187
+ * 不修改 history,只更新内部状态和执行守卫
188
+ */
189
+ async updateRoute(path) {
190
+ const to = this.createRoute(path);
191
+ const from = this.currentRoute;
192
+ // 检查是否需要重定向
193
+ if (to.meta.__redirect__) {
194
+ const redirectPath = to.meta.__redirect__;
195
+ // 重定向需要修改 history
196
+ this.replace(redirectPath);
197
+ return;
198
+ }
199
+ // 执行导航守卫
200
+ let shouldNavigate = true;
201
+ let redirectPath = null;
202
+ for (const guard of this.beforeEachGuards) {
203
+ await new Promise(resolve => {
204
+ guard(to, from, (path) => {
205
+ if (path === false) {
206
+ shouldNavigate = false;
207
+ }
208
+ else if (typeof path === 'string') {
209
+ shouldNavigate = false;
210
+ redirectPath = path;
211
+ }
212
+ resolve();
213
+ });
214
+ });
215
+ if (!shouldNavigate) {
216
+ break;
217
+ }
218
+ }
219
+ // 检查路由级守卫
220
+ if (shouldNavigate && to.matched.length > 0) {
221
+ const routeConfig = to.matched[to.matched.length - 1];
222
+ if (routeConfig.beforeEnter) {
223
+ await new Promise(resolve => {
224
+ routeConfig.beforeEnter(to, from, (path) => {
225
+ if (path === false) {
226
+ shouldNavigate = false;
227
+ }
228
+ else if (typeof path === 'string') {
229
+ shouldNavigate = false;
230
+ redirectPath = path;
231
+ }
232
+ resolve();
233
+ });
234
+ });
235
+ }
236
+ }
237
+ // 处理重定向(守卫返回的重定向)
238
+ if (redirectPath) {
239
+ this.replace(redirectPath);
240
+ return;
241
+ }
242
+ // 如果不允许导航,恢复原路径
243
+ if (!shouldNavigate) {
244
+ // 恢复 history
245
+ this.history.replace(from.path);
246
+ return;
247
+ }
248
+ // 更新当前路由
249
+ this.currentRoute = to;
250
+ // 通知监听器
251
+ this.notify();
252
+ // 执行后置钩子
253
+ for (const hook of this.afterEachHooks) {
254
+ hook(to, from);
255
+ }
256
+ }
257
+ /**
258
+ * 创建路由对象
259
+ */
260
+ createRoute(fullPath) {
261
+ // 分离路径、查询参数和 hash
262
+ const { path, query, hash } = this.parseLocation(fullPath);
263
+ // 匹配路由
264
+ const matches = this.matcher.match(path);
265
+ if (matches && matches.length > 0) {
266
+ // 使用最后一个匹配(叶子路由)的配置和参数
267
+ const leafMatch = matches[matches.length - 1];
268
+ // 处理 redirect(强制跳转,改变 URL)
269
+ if (leafMatch.config.redirect) {
270
+ return {
271
+ path,
272
+ query,
273
+ hash,
274
+ params: leafMatch.params,
275
+ meta: {
276
+ ...leafMatch.config.meta,
277
+ __redirect__: leafMatch.config.redirect,
278
+ },
279
+ matched: matches.map(m => m.config),
280
+ };
281
+ }
282
+ // 构建 matched 数组
283
+ const matchedConfigs = matches.map(m => m.config);
284
+ return {
285
+ path,
286
+ query,
287
+ hash,
288
+ params: leafMatch.params,
289
+ meta: leafMatch.config.meta || {},
290
+ matched: matchedConfigs,
291
+ };
292
+ }
293
+ // 未匹配到路由
294
+ return {
295
+ path,
296
+ query,
297
+ hash,
298
+ params: {},
299
+ meta: {},
300
+ matched: [],
301
+ };
302
+ }
303
+ /**
304
+ * 解析 Location 字符串
305
+ */
306
+ parseLocation(fullPath) {
307
+ const query = {};
308
+ let path = fullPath;
309
+ let hash = '';
310
+ // 提取 hash
311
+ const hashIndex = path.indexOf('#');
312
+ if (hashIndex !== -1) {
313
+ hash = path.slice(hashIndex);
314
+ path = path.slice(0, hashIndex);
315
+ }
316
+ // 提取查询参数
317
+ const queryIndex = path.indexOf('?');
318
+ if (queryIndex !== -1) {
319
+ const queryString = path.slice(queryIndex + 1);
320
+ path = path.slice(0, queryIndex);
321
+ // 解析查询参数
322
+ const params = new URLSearchParams(queryString);
323
+ params.forEach((value, key) => {
324
+ query[key] = value;
325
+ });
326
+ }
327
+ return { path, query, hash };
328
+ }
329
+ /**
330
+ * 构建完整路径
331
+ */
332
+ buildPath(location) {
333
+ if (typeof location === 'string') {
334
+ return location;
335
+ }
336
+ let path = location.path || this.currentRoute.path;
337
+ // 合并查询参数
338
+ const query = location.query || this.currentRoute.query;
339
+ const queryString = this.stringifyQuery(query);
340
+ if (queryString) {
341
+ path += '?' + queryString;
342
+ }
343
+ // 添加 hash
344
+ const hash = location.hash || this.currentRoute.hash;
345
+ if (hash) {
346
+ path += hash;
347
+ }
348
+ return path;
349
+ }
350
+ /**
351
+ * 序列化查询参数
352
+ */
353
+ stringifyQuery(query) {
354
+ const params = new URLSearchParams();
355
+ for (const [key, value] of Object.entries(query)) {
356
+ params.append(key, value);
357
+ }
358
+ return params.toString();
359
+ }
360
+ /**
361
+ * 导航到指定路径(添加历史记录)
362
+ */
363
+ push(location) {
364
+ const path = this.buildPath(location);
365
+ this.history.push(path);
366
+ }
367
+ /**
368
+ * 替换当前路由(不添加历史记录)
369
+ */
370
+ replace(location) {
371
+ const path = this.buildPath(location);
372
+ this.history.replace(path);
373
+ }
374
+ /**
375
+ * 返回上一页
376
+ */
377
+ back() {
378
+ this.history.back();
379
+ }
380
+ /**
381
+ * 前进到下一页
382
+ */
383
+ forward() {
384
+ this.history.forward();
385
+ }
386
+ /**
387
+ * 注册前置守卫
388
+ */
389
+ beforeEach(guard) {
390
+ this.beforeEachGuards.push(guard);
391
+ }
392
+ /**
393
+ * 注册后置钩子
394
+ */
395
+ afterEach(hook) {
396
+ this.afterEachHooks.push(hook);
397
+ }
398
+ /**
399
+ * 订阅路由变化
400
+ */
401
+ subscribe(listener) {
402
+ this.listeners.add(listener);
403
+ // 返回取消订阅函数
404
+ return () => {
405
+ this.listeners.delete(listener);
406
+ };
407
+ }
408
+ /**
409
+ * 通知监听器
410
+ */
411
+ notify() {
412
+ for (const listener of this.listeners) {
413
+ listener();
414
+ }
415
+ }
416
+ }
417
+ //# sourceMappingURL=Router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.js","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { Fukict, type VNode } from '@fukict/basic';
2
+ import type { RouterProviderProps } from './types';
3
+ /**
4
+ * RouterProvider 组件
5
+ *
6
+ * 顶层路由组件,负责:
7
+ * 1. 创建 Router 实例
8
+ * 2. 创建 History 实例并监听 URL 变化
9
+ * 3. URL 变化时:
10
+ * - 调用 router.updateRoute() 更新 Router 内部状态
11
+ * - 调用 this.update() 触发自己重新渲染
12
+ * 4. 通过 props 传递 router 给子组件,依赖框架的 diff 机制
13
+ */
14
+ export declare class RouterProvider extends Fukict<RouterProviderProps> {
15
+ /**
16
+ * Router 实例
17
+ */
18
+ private router;
19
+ /**
20
+ * History 实例
21
+ */
22
+ private history;
23
+ /**
24
+ * 取消 history 监听函数
25
+ */
26
+ private unlisten;
27
+ constructor(props: RouterProviderProps);
28
+ /**
29
+ * 组件挂载时
30
+ */
31
+ mounted(): void;
32
+ /**
33
+ * 组件卸载前
34
+ */
35
+ beforeUnmount(): void;
36
+ /**
37
+ * 渲染方法
38
+ */
39
+ render(): VNode;
40
+ }
41
+ //# sourceMappingURL=RouterProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouterProvider.d.ts","sourceRoot":"","sources":["../src/RouterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAa,MAAM,eAAe,CAAC;AAK9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,qBAAa,cAAe,SAAQ,MAAM,CAAC,mBAAmB,CAAC;IAC7D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAuB;IAErC;;OAEG;IACH,OAAO,CAAC,OAAO,CAAyB;IAExC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,KAAK,EAAE,mBAAmB;IAgBtC;;OAEG;IACH,OAAO,IAAI,IAAI;IAef;;OAEG;IACH,aAAa,IAAI,IAAI;IAiBrB;;OAEG;IACH,MAAM,IAAI,KAAK;CAwBhB"}
@@ -0,0 +1,104 @@
1
+ import { Fukict, VNodeType } from '@fukict/basic';
2
+ import { Router } from './Router';
3
+ import { RouterView } from './RouterView';
4
+ import { createHistory } from './history';
5
+ /**
6
+ * RouterProvider 组件
7
+ *
8
+ * 顶层路由组件,负责:
9
+ * 1. 创建 Router 实例
10
+ * 2. 创建 History 实例并监听 URL 变化
11
+ * 3. URL 变化时:
12
+ * - 调用 router.updateRoute() 更新 Router 内部状态
13
+ * - 调用 this.update() 触发自己重新渲染
14
+ * 4. 通过 props 传递 router 给子组件,依赖框架的 diff 机制
15
+ */
16
+ export class RouterProvider extends Fukict {
17
+ /**
18
+ * Router 实例
19
+ */
20
+ router = null;
21
+ /**
22
+ * History 实例
23
+ */
24
+ history = null;
25
+ /**
26
+ * 取消 history 监听函数
27
+ */
28
+ unlisten = null;
29
+ constructor(props) {
30
+ super(props);
31
+ // 创建 History 实例
32
+ this.history = createHistory(this.props.mode || 'hash', this.props.base);
33
+ // 创建 Router 实例,传入 history
34
+ this.router = new Router({
35
+ routes: this.props.routes,
36
+ mode: this.props.mode || 'hash',
37
+ base: this.props.base,
38
+ beforeEach: this.props.beforeEach,
39
+ afterEach: this.props.afterEach,
40
+ history: this.history, // 传入 history 实例
41
+ });
42
+ }
43
+ /**
44
+ * 组件挂载时
45
+ */
46
+ mounted() {
47
+ if (!this.history)
48
+ return;
49
+ // 监听 history 变化
50
+ this.unlisten = this.history.listen((path) => {
51
+ if (!this.router)
52
+ return;
53
+ // 调用 updateRoute 更新路由状态(不会再修改 history)
54
+ void this.router.updateRoute(path).then(() => {
55
+ // 路由更新完成后,触发重新渲染
56
+ this.update();
57
+ });
58
+ });
59
+ }
60
+ /**
61
+ * 组件卸载前
62
+ */
63
+ beforeUnmount() {
64
+ // 取消 history 监听
65
+ if (this.unlisten) {
66
+ this.unlisten();
67
+ this.unlisten = null;
68
+ }
69
+ // 销毁 Router 实例
70
+ if (this.router) {
71
+ this.router.destroy();
72
+ this.router = null;
73
+ }
74
+ // 清空 History 实例
75
+ this.history = null;
76
+ }
77
+ /**
78
+ * 渲染方法
79
+ */
80
+ render() {
81
+ if (!this.router) {
82
+ // Router 未初始化,渲染空 div
83
+ return {
84
+ type: 'element',
85
+ __type__: VNodeType.Element,
86
+ props: {
87
+ class: 'router-provider',
88
+ },
89
+ children: [],
90
+ };
91
+ }
92
+ // 依赖框架的 diff 机制,router 作为 props 传递给 RouterView
93
+ return {
94
+ type: RouterView,
95
+ __type__: VNodeType.ClassComponent,
96
+ props: {
97
+ router: this.router,
98
+ fallback: this.props.fallback,
99
+ },
100
+ children: [],
101
+ };
102
+ }
103
+ }
104
+ //# sourceMappingURL=RouterProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouterProvider.js","sourceRoot":"","sources":["../src/RouterProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Fukict, type VNode } from '@fukict/basic';
2
+ import type { RouterViewProps } from './types';
3
+ /**
4
+ * RouterView 组件
5
+ *
6
+ * 负责渲染当前匹配的路由组件
7
+ * 完全依赖框架的 diff 机制,通过 RouterProvider 的 update 触发更新
8
+ */
9
+ export declare class RouterView extends Fukict<RouterViewProps> {
10
+ /**
11
+ * 子路由实例(如果有嵌套路由)
12
+ */
13
+ private childRouter;
14
+ /**
15
+ * 组件卸载前
16
+ */
17
+ beforeUnmount(): void;
18
+ /**
19
+ * 获取子路由(如果有嵌套路由)
20
+ */
21
+ private getRouterForChild;
22
+ /**
23
+ * 渲染方法
24
+ */
25
+ render(): VNode;
26
+ }
27
+ //# sourceMappingURL=RouterView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouterView.d.ts","sourceRoot":"","sources":["../src/RouterView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAgB,MAAM,eAAe,CAAC;AAGjE,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,SAAS,CAAC;AAE5D;;;;;GAKG;AACH,qBAAa,UAAW,SAAQ,MAAM,CAAC,eAAe,CAAC;IACrD;;OAEG;IACH,OAAO,CAAC,WAAW,CAAuB;IAE1C;;OAEG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,MAAM,IAAI,KAAK;CA6BhB"}
@@ -0,0 +1,66 @@
1
+ import { Fukict, VNodeType, h } from '@fukict/basic';
2
+ /**
3
+ * RouterView 组件
4
+ *
5
+ * 负责渲染当前匹配的路由组件
6
+ * 完全依赖框架的 diff 机制,通过 RouterProvider 的 update 触发更新
7
+ */
8
+ export class RouterView extends Fukict {
9
+ /**
10
+ * 子路由实例(如果有嵌套路由)
11
+ */
12
+ childRouter = null;
13
+ /**
14
+ * 组件卸载前
15
+ */
16
+ beforeUnmount() {
17
+ // 清理子路由
18
+ this.childRouter = null;
19
+ }
20
+ /**
21
+ * 获取子路由(如果有嵌套路由)
22
+ */
23
+ getRouterForChild(matched) {
24
+ if (matched.children && matched.children.length > 0) {
25
+ // 有嵌套路由,创建子路由
26
+ if (!this.childRouter) {
27
+ this.childRouter = this.props.router.createChild();
28
+ }
29
+ // 每次都更新 childRouter 的 currentRoute,确保始终引用最新的父路由状态
30
+ this.childRouter.currentRoute = this.props.router.currentRoute;
31
+ return this.childRouter;
32
+ }
33
+ // 无嵌套路由,返回当前 router
34
+ return this.props.router;
35
+ }
36
+ /**
37
+ * 渲染方法
38
+ */
39
+ render() {
40
+ const matched = this.props.router.matched;
41
+ // 没有匹配的路由,渲染 fallback
42
+ if (!matched || !matched.component) {
43
+ return this.props.fallback || h('div', { class: 'router-view' }, []);
44
+ }
45
+ const RouteComp = matched.component;
46
+ const childRouter = this.getRouterForChild(matched);
47
+ return {
48
+ type: 'div',
49
+ __type__: VNodeType.Element,
50
+ props: {
51
+ class: 'router-view',
52
+ },
53
+ children: [
54
+ {
55
+ type: RouteComp,
56
+ __type__: VNodeType.ClassComponent,
57
+ props: {
58
+ router: childRouter,
59
+ },
60
+ children: [],
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ }
66
+ //# sourceMappingURL=RouterView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouterView.js","sourceRoot":"","sources":["../src/RouterView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,SAAS,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAKjE;;;;;GAKG;AACH,MAAM,OAAO,UAAW,SAAQ,MAAuB;IACrD;;OAEG;IACK,WAAW,GAAkB,IAAI,CAAC;IAE1C;;OAEG;IACH,aAAa;QACX,QAAQ;QACR,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,OAAoB;QAC5C,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,cAAc;YACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACrD,CAAC;YACD,kDAAkD;YAClD,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;YAC/D,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,oBAAoB;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QAE1C,sBAAsB;QACtB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAEpD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,SAAS,CAAC,OAAO;YAC3B,KAAK,EAAE;gBACL,KAAK,EAAE,aAAa;aACrB;YACD,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,SAAS;oBACf,QAAQ,EAAE,SAAS,CAAC,cAAc;oBAClC,KAAK,EAAE;wBACL,MAAM,EAAE,WAAW;qBACpB;oBACD,QAAQ,EAAE,EAAE;iBACb;aACF;SACF,CAAC;IACJ,CAAC;CACF"}