使用多重Routes
这种方式是采用嵌套Routes的方式使用的。在react-routerV6的版本中。需要像下面这样写。
<Route
path="detail/*"
element={
<Suspense fallback={<h1>loading......</h1>}>
<Detail />
</Suspense>
}
/>
然后我们在Detail
组件中就可以继续使用Routes
进行嵌套。注意:detail/*
的书写方式。
然后就在Detai
组件中继续嵌套。
<Routes>
{/* index的优先级要高一点 */}
<Route index element={<h1>我是detail默认的内容</h1>} />
{/* index写入多个的话,只会有第一个生效 */}
<Route path=":id" element={<A ref={h1Ref} />} />
<Route
path="/"
element={
<h1>我是detail的根路径,这里的/是相对于detail父路径匹配的内容</h1>
}
/>
</Routes>
这样的话,就实现了detail
中的路由嵌套了。
这种方式就是需要写多个Routes
,但是路由的层级关系的话,在每个组件很清楚。
注意:
- 嵌套的
Routes
的根路径是相对于外层的Routes
来的。也就是说,Detail
组件内的Route
路径总是相对于/detail
来进行路由的分发的。使用Outlet进行子路由的占位
<Route
path="edit"
element={
<Suspense fallback={<h1>loading......</h1>}>
<Edit />
</Suspense>
}
>
<Route
index
element={<main>我是没有子路由匹配的时候时候展示的默认页面</main>}
/>
<Route
path=":editId"
element={
<Suspense fallback={<h1>loading......</h1>}>
<EditItem />
</Suspense>
}
/>
</Route>
这是App
组件中的edit
路由,里面有子路由,edit/:editId
。
我们直接像这样写的话,不会渲染editItem
组件,除非我们在edit组件内,添加Outlet
组件,表示editItem
子路由占据的位置。<div>
<div>edit page</div>
<Link to="132">
<h2>editItem</h2>
</Link>
<input
type="text"
value={searchParams.get('filter') || ''}
onChange={e => {
const filter = e.target.value
if (filter) {
setSearchParams({ filter })
} else {
setSearchParams({})
}
}}
/>
<button type="button" onClick={handleNavigateDetail}>
我跳转去detail页面
</button>
{/* Outlet的主要作用是ui的一个展示。 */}
<Outlet />
</div>