reactjs - React Router:从通用`/:slug`路径中排除字符串
问题描述
我正在尝试根据路由设置以下 UI
/things/
- 显示项目列表(组件 A)/things/new
- 显示项目列表,带有模态表单覆盖(组件 A 和组件 B)/things/:slug
- 显示特定项目(组件 C)
使用此设置:
/things/
将显示组件 A/things/new
将显示组件 A 和组件 B/things/:slug
将仅显示组件 C
这一切都在嵌套路线中 - /things
. 这意味着path
fromuseRouteMatch
返回/things
我已经尝试了几个与 的组合Switch
,并尝试使用和matchPath
区分useRouteMatch
但没有运气。每次尝试都会导致其中一条路径未返回正确的组件。/new
/:slug
例如:
<Switch>
<Route path="/:slug(exclude "new")" exact component={ComponentC} />
<Route path="/" exact component={ComponentA} />
</Switch>
<Route path="/new" component={ComponentB} />
我尝试过的另一个选择是在 slug 上使用正则表达式,以匹配 slug 模式。假设蛞蝓模式是xxx-xxx-xxx-###
,然后我尝试了:
<Route path="/:slug((\w*-)*(\d*))" component={ComponentC) />
但由于某种原因,这与路线不匹配。
我想我可以使用location.pathname
,但这似乎是一个黑客。
是否可以使用此设置将上述路线与标准<Route path="[something]" />
组件进行匹配和渲染?
解决方案
这就是我喜欢 Stack Overflow 的原因。问这个问题通常会让你自己回答。
我正在浏览 React Router 文档以获取有关正则表达式的信息,并发现该Route
path
属性可以接受一组路径。所以我选择了这个:
const { path } = useRouteMatch()
<Route path={[path, `${path}/new`]} exact component={ThingsList} />
<Switch>
<Route path={`${path}/new`} render={() => <NewThing path={path} />} />
<Route path={`${path}/:slug`} render={() => <Thing path={path} />} />
</Switch>
推荐阅读
- ios - 如何在单元测试目标中的测试用例之间删除应用程序?
- powershell - 获取分钟并使用 SendKeys 输出它们
- ios - 将默认数据库路径更改为组路径后,iOS RealmSwift 不会更新模型
- amazon-web-services - 具有多个登录选项的 aws cognito 池
- python-xarray - 为非发散数据更改 xarray 中的默认颜色条
- vhdl - VHDL 中的过程从不返回值
- c++ - 在 MFC 中显示 .NET 图表控件
- javascript - jQuery DrawSVG:滚动绘制完成时调用函数?
- postgresql - 查询将未知值转换为 json
- delphi - Delphi IBX TIBSQL.ExecQuery 是否有奇怪的事务要求(FStreamedActive 因素)?