Solid Router 简化了 Solid 应用程序中的路由,帮助开发人员通过使用 JSX 或 props 传递的对象定义路由来管理导航和渲染。
1. 安装路由
默认情况下不包含此包。
2. 设置 <Router>
组件
通过渲染 Router 组件来启动您的应用程序。该组件将匹配 URL 以显示所需的页面。
3. 提供根级布局
根布局不会在页面更改时更新,是放顶级导航和 Context Providers 的理想位置。
4. 添加路由
每个路由都使用 Route
组件添加到 Router
中。在这里,您指定一个路径和一个在用户导航到该路径后要渲染的组件。
5. 创建 CatchAll 路由(404 页面)
catchall 路由可用于在路由器的任何嵌套级别都找不到的页面。使用 *
将检索路径的其余部分。您还可以选择添加参数名称。
6. 创建路由链接
<A>
组件提供应用程序路由的导航。或者,您可以使用原生锚标记。但是, <A>
组件提供了附加功能,包括 CSS 属性、inactiveClass
和 activeClass
。
lazy
函数延迟组件的加载,直到导航到该组件。
如果事先不知道路径,则可以将路径的一部分视为灵活参数。
冒号表示 id
可以是任何字符串,只要 URL 符合该模式,<User>
组件就会显示。
然后,您可以使用 useParams 从路由组件中访问该 id。
关于动画/过渡的注意事项:
共享相同路径的路由将被视为相同路由。如果您想强制重新渲染,可以将组件包装在带 keyed
的 <Show>
组件中:
如果您需要访问组件内的动态路由参数,则可以使用 useParams。使用 useParams
访问参数后,就可以在您的组件中使用它们:
useParams
对于其他 Solid 原语(例如 createResource 和 createSignal )特别有用,它们可以根据路由参数创建动态行为。
在这个示例中,每次 id
参数更改时,都会调用 fetchUser
函数来获取新的用户数据。
每个路径参数都可以使用 MatchFilter
进行验证。MatchFilter
不是简单的检查参数是否存在,而是允许更复杂的路由描述:
在这个例子中,matchFilters
属性提供了一种根据 filters
中定义的 parent
、id
和 withHtmlExtension
校验参数的方式。如果验证失败,路由将不匹配。
在这个例子中:
/users/mom/123/contact.html
会匹配,
/users/dad/123/about.html
会匹配,
/users/aunt/123/contact.html
不会匹配,因为 :parent
不是 'mom' 或 'dad',
/users/mom/me/contact.html
不会匹配,因为 :id
不是一个数字,
/users/dad/123/contact
不会匹配,因为:withHtmlExtension
缺失了 .html
.
可以通过在参数名称末尾添加问号将参数指定为可选:
要匹配给定路径中的任何后代路由,您可以使用通配符标记 (*
)。这可用于表示该路径段中的任何值。
要将通配符部分作为参数公开给组件,您可以将其命名为:
通配符标记必须是路径的最后部分; foo/*any/bar
不会创建任何路由。
Routes
组件还支持使用数组定义多个路径。这可以避免在两个或多个匹配路径之间切换时重新渲染路线:
仅叶 <Route>
节点(最里面的 <Route>
组件)被赋予路由:
以下两个路由定义都匹配相同的 URL /users/:id
并渲染相同的组件:
如果你想让父路由有自己的路由,你必须单独指定它:
您还可以通过使用传递给路由组件的 props.children 结合嵌套一起使用。
路由的配置仍然相同,但是现在它们的组件将出现在声明 props.children
的父组件内。
路由也可以无限嵌套。以下示例将仅渲染路由 /layer1/layer2
,该路由将嵌套在 3 个 div 中。
通过预加载函数,数据获取与路由加载并行开始,因此可以尽快使用。预加载函数通过在加载路线后调用或在链接悬停时立即调用来实现。
作为唯一的参数,预加载函数传递一个用于访问路由信息的对象:
然后将预加载函数传递到 <Route>
定义中:
您可以导出与专用[route].data.js
或 [route].data.ts
文件中的路由相对应的预加载函数和数据包装器。此模式提供了一种无需加载任何其他内容即可导入数据函数的方法。
preloadUser
接收一个包含 params
、location
和 intent
的对象。
请注意,虽然最佳实践是将这些文件编写为 [id].data.js
,但您仍然可以编写 route.data.js
。
当在除“预加载”之外的任何时间调用时,预加载函数的值都会传递给页面组件。这意味着您可以初始化页面,或使用数据 API。
[id].jsx
包含渲染的组件。当您将函数包装在 createAsync
中时,一旦预期的 Promise resolve,它将产生一个 signal 。
要了解有关路由 Solid 应用程序的更多信息,请访问 Solid Router 文档。