Skip to content

$route

Description

Type-safe route builder.

With the route builder you can define and use search and path parameters with typing and validation.

You can also consume functions created with the API builder ($api) to securely exchange data with the server.

When you create a route in development mode, metadata will be automatically generated and you will have strong typing to access routes and their parameters in the Link component, the routePath function, and the RequestUrl class.

Import

import { $route } from "dreamkit";

Definition

declare const $route: {
params: (value: object) => typeof $route;
path: (value: string | ((params: object) => string)) => typeof $route;
preload: (
value: (data: { intent: string; params: object }) => any,
) => typeof $route;
create: (
component: (utils: {
params: object;
setParams: (value: object) => void;
}) => any,
) => typeof $route;
};

Examples

Path param

import { $route, Link, s } from "dreamkit";
export const homeRoute = $route.path("/").create(() => (
<>
<Link href="/user/:id" params={{ id: 1 }}>
user 1
</Link>
<br />
<Link href="/user/:id" params={{ id: 2 }}>
user 2
</Link>
</>
));
export const userRoute = $route
.params({ id: s.number() })
.path((params) => `/user/${params.id}`)
.create(({ params }) => <>id: {params.id}</>);

Optional path params

import { $route, Link, s } from "dreamkit";
export const homeRoute = $route.path("/").create(() => (
<>
<Link href="/section">link without params</Link>
<br />
<Link href="/section" params={{ name: "test" }}>
link with params
</Link>
</>
));
export const sectionRoute = $route
.path("/section")
.params({ name: s.string().optional() })
.create(({ params }) => <>name: {params.name}</>);

Synced search params

import { Input, $route, s } from "dreamkit";
export default $route
.path("/")
.params(
s
.object({
name: s.string(),
country: s.object({
code: s.string(),
}),
})
.deepPartial(),
)
.create(({ params, setParams }) => {
return (
<>
<i>Look at the address bar of your browser.</i>
<p>
<Input
placeholder="name"
value={params.name ?? ""}
onChange={(name) =>
setParams({ ...params, name: name || undefined })
}
/>
</p>
<p>
<Input
placeholder="country code"
value={params.country?.code ?? ""}
onChange={(code) =>
setParams({
...params,
country: { ...params.country, code: code || undefined },
})
}
/>
</p>
</>
);
});