使用多重Routes
这种方式是采用嵌套Routes的方式使用的。在react-routerV6的版本中。需要像下面这样写。
<Routepath="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} />} /><Routepath="/"element={<h1>我是detail的根路径,这里的/是相对于detail父路径匹配的内容</h1>}/></Routes>
这样的话,就实现了detail中的路由嵌套了。
这种方式就是需要写多个Routes,但是路由的层级关系的话,在每个组件很清楚。
注意:
- 嵌套的
Routes的根路径是相对于外层的Routes来的。也就是说,Detail组件内的Route路径总是相对于/detail来进行路由的分发的。使用Outlet进行子路由的占位
<Routepath="edit"element={<Suspense fallback={<h1>loading......</h1>}><Edit /></Suspense>}><Routeindexelement={<main>我是没有子路由匹配的时候时候展示的默认页面</main>}/><Routepath=":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><inputtype="text"value={searchParams.get('filter') || ''}onChange={e => {const filter = e.target.valueif (filter) {setSearchParams({ filter })} else {setSearchParams({})}}}/><button type="button" onClick={handleNavigateDetail}>我跳转去detail页面</button>{/* Outlet的主要作用是ui的一个展示。 */}<Outlet /></div>
