Skip to content
This repository was archived by the owner on Jul 6, 2025. It is now read-only.

Commit 3ef69ff

Browse files
committed
feat(framework/vue): Add useRouter() composition api
1 parent 65b8148 commit 3ef69ff

File tree

3 files changed

+41
-44
lines changed

3 files changed

+41
-44
lines changed

framework/vue/context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ export type RouterContextProps = {
66
ssrHeadCollection?: string[];
77
};
88

9-
export const RouterContext = {
9+
export const RouterContext = ref({
1010
url: new URL("http://localhost/"),
1111
params: {},
12-
};
12+
});
1313

1414
export type HttpMethod = "get" | "post" | "put" | "patch" | "delete";
1515

framework/vue/mod.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export { useData } from "./data.ts";
2-
export { App, createApp, createSSRApp } from "./router.ts";
2+
export { App, createSSRApp, useRouter } from "./router.ts";
33
export { Link } from "./link.ts";
44
export { Head } from "./head.ts";

framework/vue/router.ts

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, createApp, createSSRApp, defineComponent } from "vue";
1+
import { Component, createSSRApp as VueCreateSSRApp, defineComponent, h } from "vue";
22
import type { SSRContext } from "../../server/renderer.ts";
33
import { RouterContext } from "./context.ts";
44
import { RouteModule } from "../core/route.ts";
@@ -19,32 +19,25 @@ type RootProps = {
1919
ssrContext?: SSRContext;
2020
};
2121

22-
export const App = defineComponent({
23-
name: "App",
24-
props: {
25-
ssrContext: {
26-
type: String,
27-
default: "",
28-
},
29-
},
30-
render() {
31-
return this.$slots.default ? this.$slots.default() : [];
32-
},
33-
});
34-
35-
const createSSRApp_ = (_app: Component, props?: RootProps) => {
22+
const createApp = (props?: RootProps) => {
23+
return createRouter(props);
24+
};
25+
26+
const createRouter = (props?: RootProps) => {
3627
const { ssrContext } = props || {};
3728
const modules = ssrContext?.routeModules || loadSSRModulesFromTag();
3829

3930
if (modules.length === 0) {
40-
return createSSRApp(Err, { status: 404, message: "page not found" });
31+
return VueCreateSSRApp(Err, { status: 404, message: "page not found" });
4132
}
4233

4334
const url = ssrContext?.url || new URL(window.location?.href);
4435
const dataUrl = url.pathname + url.search;
4536
const params: Record<string, string> = {};
4637
const dataCache = new Map<string, RouteData>();
4738

39+
RouterContext.value = { url, params };
40+
4841
modules.forEach((module) => {
4942
const { params: _params, data, dataCacheTtl } = module;
5043
Object.assign(params, _params);
@@ -55,34 +48,43 @@ const createSSRApp_ = (_app: Component, props?: RootProps) => {
5548
});
5649
});
5750

58-
let routeComponent = undefined;
59-
6051
const defaultRouteModules = modules[0];
6152
const { defaultExport } = defaultRouteModules;
6253

6354
if (defaultExport) {
64-
routeComponent = defaultExport as Component;
55+
const router = defineComponent({
56+
name: "Router",
57+
render() {
58+
return h(defaultExport as Component);
59+
},
60+
});
6561

66-
if (routeComponent) {
67-
const router = createApp(routeComponent);
62+
const app = VueCreateSSRApp(router);
6863

69-
router.provide("modules", modules);
70-
router.provide("dataCache", dataCache);
71-
router.provide("ssrContext", ssrContext);
72-
router.provide("ssrHeadCollection", ssrContext?.headCollection);
73-
router.provide("dataUrl", dataUrl);
64+
app.provide("modules", modules);
65+
app.provide("dataCache", dataCache);
66+
app.provide("ssrContext", ssrContext);
67+
app.provide("ssrHeadCollection", ssrContext?.headCollection);
68+
app.provide("dataUrl", dataUrl);
7469

75-
// registe aleph/vue component
76-
router.component("Link", Link);
77-
router.component("Head", Head);
70+
// registe aleph/vue component
71+
app.component("Link", Link);
72+
app.component("Head", Head);
7873

79-
return router;
80-
}
74+
return app;
8175
}
8276

83-
const ssrApp = createSSRApp(Err);
77+
const errApp = VueCreateSSRApp(Err);
8478

85-
return ssrApp;
79+
return errApp;
80+
};
81+
82+
const createSSRApp = (createSSRAppApi: (props?: RootProps) => Component, props?: RootProps) => {
83+
if (createSSRAppApi === undefined) {
84+
throw new Error("[aleph/vue] createSSRApp without `App` component");
85+
}
86+
87+
return createSSRAppApi(props);
8688
};
8789

8890
function getRouteModules(): Record<string, { defaultExport?: unknown; withData?: boolean }> {
@@ -126,13 +128,8 @@ function loadSSRModulesFromTag(): RouteModule[] {
126128
return [];
127129
}
128130

129-
const createApp_ = (app: Component) => {
130-
return createApp(app);
131-
};
132-
133-
export const useRouter = () => {
134-
const { url, params } = RouterContext;
135-
return { url, params };
131+
const useRouter = () => {
132+
return RouterContext;
136133
};
137134

138-
export { createApp_ as createApp, createSSRApp_ as createSSRApp };
135+
export { createApp as App, createSSRApp, useRouter };

0 commit comments

Comments
 (0)