我有一个App
组件呈现以下路线:
<Route path="/items/:id" component={ItemDetail} />
<Route path="/items" component={AllItems} />
在我的AllItems
组件中,我呈现所有项目的列表以及创建新项目或更新现有项目的选项。执行这些操作之一将打开一个弹出窗口。为此,我在AllItems
中绘制以下路线:
<Route path="/items/add" component={AddItemModal} />
<Route path="/items/edit" component={EditItemModal} />
注意:这些模态实际上链接到这些路线很重要,我无法更改。我也无法在AllItems
之外渲染这些路线,因为我需要将soms道具传递给模态。
当我走到/items/1
之类的路线时:ItemDetail
呈现(按预期)。
当我转到/items/add
时:ItemDetail
使用add
作为:id
进行渲染。
我需要它来按照AddItemModal
的定义在此处渲染AllItems
。
我尝试过的事情:
exact
添加到/items/:id
路由,也尝试将其添加到/items/add
和/items/edit
。这些解决方案均无效。只能渲染ItemDetail
,也可以只渲染模态。/items
之前定义/items/:id
,以期给嵌套路由以更高的优先级。 ItemDetail
在这种情况下从不呈现。是否有解决方案,所以我可以将items/add
和items/edit
的优先级高于items/:id
答案 0 :(得分:2)
尝试将路线嵌套在/items
<Route
path="/items"
render={() => (
<>
<Route path="" component={AllItems} exact />
<Route path="/add" component={AddItemModal} />
<Route path="/edit" component={EditItemModal} />
<Route path="/:id" component={ItemDetail} />
</>
)}
/>
答案 1 :(得分:0)
如果您想对ItemDetail
和AllItems
拥有独立的意见,但同时拥有/items/add
和/items/:id/edit
(对URL稍加自由,您需要和ID来正确编辑项目吗?)作为AllItems
上的模态,因此路线的结构将如下所示:
AllItemsView
(/项目)
AddItemModal
(/项目/新)EditItemModal
(/ items /:id / edit)ItemDetailView
(/ items /:id)您需要对Tnc Andrei的响应进行一些调整:
<Route
path="/items"
render={({ match: {url, isExact}, location: {pathname} }) => {
let pathnameArray = pathname.split("/")
let lastChunk = pathnameArray[pathnameArray.length - 1]
if (isExact || lastChunk === "new" || lastChunk === "edit") {
return (
<>
<Route path={`${url}/`} component={CompetitionsView} />
<Switch>
<Route path={`${url}/new`} component={CompetitionFormModal} />
<Route path={`${url}/:competitionId/edit`} component={CompetitionFormModal} />
</Switch>
</>
)
}
return (
<>
<Route path={`${url}/:competitionId`} component={CompetitionView} />
</>
)
}}
/>