懒加载
- 直接使用 import 会将多个较大组件打包在一起,使用懒加载的目的就是为了将其分开。
重定向
useNavigate``Navigate
代码
src\router\index.tsx
import React, { lazy } from 'react'
import { Navigate } from 'react-router-dom'
import type { RouteObject } from 'react-router-dom'
const Discover = lazy(() => import('@/views/discover'))
const Mine = lazy(() => import('@/views/mine'))
const Download = lazy(() => import('@/views/download'))
const Focus = lazy(() => import('@/views/focus'))
const routes: RouteObject[] = [
{ path: '/', element: <Navigate to="/discover" /> },
{
path: '/discover',
element: <Discover />
},
{
path: '/mine',
element: <Mine />
},
{
path: '/download',
element: <Download />
},
{
path: '/focus',
element: <Focus />
}
]
export default routes
优化
Loading
src\App.tsx
import React, { Suspense } from 'react'
import { useRoutes, Link } from 'react-router-dom'
import routes from './router'
function App() {
return (
<>
<div className="nav">
<Link to="/discover">发现音乐</Link>
</div>
<Suspense fallback=""> {useRoutes(routes)}</Suspense>
</>
)
}
export default App
二级路由
Outlet 占位符
src\router\index.tsx
import React, { lazy } from 'react'
import { Navigate } from 'react-router-dom'
import type { RouteObject } from 'react-router-dom'
const Discover = lazy(() => import('@/views/discover'))
const Recommend = lazy(() => import('@/views/discover/c-pages/recommend'))
const Ranking = lazy(() => import('@/views/discover/c-pages/ranking'))
const Songs = lazy(() => import('@/views/discover/c-pages/songs'))
const Djradio = lazy(() => import('@/views/discover/c-pages/djradio'))
const Artist = lazy(() => import('@/views/discover/c-pages/artist'))
const Album = lazy(() => import('@/views/discover/c-pages/album'))
const Mine = lazy(() => import('@/views/mine'))
const Download = lazy(() => import('@/views/download'))
const Focus = lazy(() => import('@/views/focus'))
const routes: RouteObject[] = [
{ path: '/', element: <Navigate to="/discover" /> },
{
path: '/discover',
element: <Discover />,
children: [
{
path: '/discover',
element: <Navigate to="/discover/recommend" />
},
{
path: '/discover/recommend',
element: <Recommend />
},
{
path: '/discover/ranking',
element: <Ranking />
},
{
path: '/discover/songs',
element: <Songs />
},
{
path: '/discover/djradio',
element: <Djradio />
},
{
path: '/discover/artist',
element: <Artist />
},
{
path: '/discover/album',
element: <Album />
}
]
},
{
path: '/mine',
element: <Mine />
},
{
path: '/download',
element: <Download />
},
{
path: '/focus',
element: <Focus />
}
]
export default routes
src\views\discover\index.tsx
import React, { memo, Suspense } from 'react'
import type { FC, ReactNode } from 'react'
import { Link, Outlet } from 'react-router-dom'
interface IProps {
children?: ReactNode
}
const Discover: FC<IProps> = () => {
return (
<>
<div>
<Link to="/discover/recommend">推荐</Link>
<Link to="/discover/ranking">排行榜</Link>
<Link to="/discover/songs">歌单</Link>
<Link to="/discover/djradio">主播电台</Link>
<Link to="/discover/artist">歌手</Link>
<Link to="/discover/album">新碟上架</Link>
</div>
<Suspense fallback="">
<Outlet />
</Suspense>
</>
)
}
export default memo(Discover)