路径参数
编辑此页面路由中的参数用于捕获 URL 中的动态值。这对于创建更灵活且可以处理不同值的路由非常有用。
<Route path="/users/:id" component={User} />在这个例子中,:id 参数将捕获 URL 中 /users/ 之后的任何值。冒号 : 用于表示参数,而 id 是参数的名称。当 URL 匹配这个路由时,User 组件将被渲染。
共享相同路径匹配的路由将被视为同一路由。如果需要强制重新渲染,你可以将组件包装在带有keyed prop 的 Show 组件中:
<Show when={params.something} keyed> <MyComponent /></Show>访问参数
你可以使用 useParams 获取参数捕获的值。
import { useParams } from "@solidjs/router";
function User() { const params = useParams(); return <div>User ID: {params.id}</div>; {/* Output: User ID: 123 */}}验证参数
每个路径参数都可以使用 MatchFilter 在 Route 组件上进行验证。无需手动检查参数是否存在,您可以使用 MatchFilter 来确保参数格式正确。
import { lazy } from "solid-js";import { render } from "solid-js/web";import { Router, Route } from "@solidjs/router";
const User = import("./pages/User");
const filters = { parent: ["mom", "dad"], // allow enum values id: /^\d+$/, // only allow numbers withHtmlExtension: (v: string) => v.length > 5 && v.endsWith(".html"), // we want an `*.html` extension};
render(() => ( <Router> <Route path="/users/:parent/:id/:withHtmlExtension" component={User} matchFilters={filters} /> </Router>), document.getElementById("app"));在这个例子中,matchFilter prop 根据 filters 对象中定义的指定过滤器验证parent、id 和 withHtmlExtension 参数。如果验证失败,路由将不会匹配,组件不会被渲染。
在这个例子中,这意味着:
/users/mom/123/contact.html会匹配,/users/dad/456/about.html会匹配,/users/aunt/123/contact.html不匹配,因为:parent不是'mom'或'dad',/users/mom/me/contact.html不匹配,因为:id不是数字,/users/dad/123/contact不匹配,因为:withHtmlExtension缺少.html
可选参数
通过在参数名后添加 ? ,可以将参数设置为可选。
<Route path="/users/:id?" component={User} />使用此设置,路由将同时匹配 /users 和 /users/123。但是,需要注意的是, ? 仅使路径的最后一段参数成为可选。因此,超出可选参数的路径将不会被匹配。例如, /users/123/contact 将不会匹配。
通配符路由
通配符路由可用于匹配路径中的任意数量的段。要创建通配符路由,请使用 * 后跟参数名称。
<Route path="/users/*" component={User} />使用星号 * 作为参数将匹配 /users 之后的任意数量的段。这包括 /users 、/users/123 、/users/123/contact 等。
如果你需要暴露路径中的通配符段,你可以给它们命名:
<Route path="/users/*rest" component={User} />在这种情况下,rest 将包含 /users/ 之后的剩余路径。
需要注意的是,通配符路由必须位于路径末尾。如果你在末尾之前放置通配符路由,比如 /users/*rest/:id,将不会匹配任何路由。