(三) 博客前端項(xiàng)目實(shí)戰(zhàn)- react-router

路由管理

1. 集成 react-router

$ npm install react-router-dom@6

2. 路由配置

思路: 創(chuàng)建路由對象->渲染路由->引入掛載路由

  • 路由懶加載
const Test = React.lazy(() => import('你的組件'));
<Suspense fallback="loading...">
  <Test />
</Suspense>
  • 創(chuàng)建路由對象
// 聲明對象類型
export interface routeType {
  path: string
  // 非必傳
  element?: any
  // 非必傳
  children?: Array<routeType>
  // 允許加入任意值
  // 在實(shí)參中新增了sex屬性,interface中并沒有定義,此時(shí)不會報(bào)錯(cuò)
  [propname: string]: any;
  // 非必傳
  meta?: {
    title?: string
  }
  // 非必傳
  redirect?: string
}

const routes: Array<routeType> = [
  {
    path: '/',
    element: () => import('../App'),
    children: [
      {
        path: '/',
        redirect: '/home',
      },
      {
        path: '/home',
        element: () => import('@/pages/home'),
        meta: {
          title: "首頁",
        }
      },
      {
        path: '/about',
        element: () => import('@/pages/about'),
        meta: {
          title: "關(guān)于",
        }
      },
      {
        path: '/about/:id',
        element: () => import('@/pages/about'),
        meta: {
          title: "關(guān)于",
        }
      },
      {
        path: '*',
        element: () => import('@/pages/error/404'),
        meta: {
          title: '404'
        }
      }
    ]
  },
]

export default routes;

  • 渲染路由
import React from 'react';
import { useRoutes, Navigate } from 'react-router-dom';
import _ from 'lodash'; // js工具庫
import routes, { routeType } from './routers';

export default function Routes() {
  const element = useRoutes(renderRoutes(routes));
  return element;
}

function renderRoutes(routes: Array<routeType>) {
  return _.map(routes, (item: routeType) => {
    let res: routeType = { ...item };
    if (!item?.path) return;

    // element
    if (item?.element) {
      const Component = React.lazy(item.element);
      res.element = (<React.Suspense fallback={'...'}>
          <Component />
      </React.Suspense>);
    }

    // children
    if (item?.children) {
      res.children = renderRoutes(item.children);
    }

    // 重定向
    if (item?.redirect) {
      res.element = (
        <Navigate to={item.redirect} replace />
      )
    }

    return res;
  })
}


  • 引入掛載路由
import React from 'react'
import ReactDOM from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import Routes from '@/router/index'

ReactDOM.createRoot(document.getElementById('root')!).render(
 <React.StrictMode>
   <BrowserRouter>
     <Routes/>
   </BrowserRouter>
 </React.StrictMode>
)

參考文章vite 搭建 react18 項(xiàng)目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容