react 项目模板搭建(2)—— 加入 react-router-dom v6 路由

本文详细介绍 React Router v6 的安装配置与使用方法,包括路由组件遍历渲染、路由嵌套、路由跳转等核心功能,并展示了如何在实际项目中进行路由管理。

一、安装路由
npm install react-router-dom@6

结构目录
请添加图片描述

App.tsx

import React from 'react';
import { BrowserRouter } from 'react-router-dom'
// import logo from './logo.svg';
import './App.css';
import Layout from './layout'

function App() {
  return (
    <div className="App">
      <BrowserRouter>
        <React.Suspense fallback={<>正在加载……</>}>
          <Layout />
        </React.Suspense>
      </BrowserRouter>
    </div>
  );
}

export default App;

router / index.tsx
路由组件遍历渲染

import { Route } from 'react-router-dom'
import { routes, IRoute } from './routes'


export const RouteData = (data: any[]) => {
    return data.map((item: IRoute, index: number) => {
        return (
            <Route 
            	key={item?.key ? item?.key : index} 
            	path={item?.path} 
            	element={item?.element} 
            	caseSensitive={item?.caseSensitive}
            >
            {/* {item?.children ? RouteData(item?.children) : null} */}
                {item?.children && item?.children?.map((child: any) => {
                    return <Route
                        key={child?.key ? item?.key : item?.path}
                        path={child?.path}
                        element={child?.element}
                        caseSensitive={item?.caseSensitive}
                    />
                })}
            </Route>
        )
    })
}

export const routeRender = RouteData(routes)

router / routes.tsx
路由接口与路由数据

import React from 'react'
const Home = React.lazy(() => import('src/pages/home'))
const Childrenpages = React.lazy(() => import('src/pages/childrenpages'))
const Graph = React.lazy(() => import('src/pages/graph'))

export interface IRoute {
    caseSensitive?: boolean;
    children?: Array<IRoute>
    element?: React.ReactNode | null;
    index?: false;
    path: string;
    key?: any;
    title?: string;
    [name: string]: any;
}

export const routes: Array<IRoute> = [
    {
        path: '/',
        element: <Home />,
        children: [
            {
                path: 'childrenpages',
                element: <Childrenpages />
            }
        ]
    },
    {
        path: 'graph',
        element: <Graph />,
    },
    {
        path: 'childrenpages321',
        element: <Childrenpages />,
    }
]

layout / index.tsx
在布局文件中引入路由

import React from 'react';
import { Routes, Outlet } from 'react-router-dom'
import { routeRender } from '../router'
// import { routes } from '../router/routes'

class Layout extends React.Component {
    render(): React.ReactNode {
        console.log(routeRender);
        return (
            <div id='layout'>
                <Routes>
                    {/* {RouteData(routes)} */}
                    {routeRender}
                </Routes>
                <Outlet />
            </div>
        )
    }
}

export default Layout

使用路由的文件

home / index.tsx

import React from 'react'
import { useNavigate, Outlet } from 'react-router-dom'



const Home: React.FC = (props) => {
    const navigate = useNavigate();
    const gorouter = () => {
        navigate(`/graph?id=${id}`, {state: {id: 'ide', name: '名字', list: [{cid: '123'}]}})
    }

    return (
        <div id='home' onClick={gorouter}>123 <Outlet /></div>
    )
}

export default Home

这里出现了路由嵌套,按照react-router-dom的介绍,需要在父级使用<Outlet />为子路由占位,才会在跳转子路由时渲染
使用useNavigate做路由跳转,使用绝对路由进行跳转,相对路由会进行url拼接跳转

import React from 'react'
import { useNavigate, useParams, useSearchParams,useLocation } from 'react-router-dom'

const Graph: React.FC = (props) => {
    let param = useParams()
    console.log('useParams',param);
    const [searchParams, setSearchParams] = useSearchParams();
    console.log('useSearchParams', searchParams);
    console.log('useSearchParams', searchParams.get('id'));  // 获取url中的参数
    console.log('useLocation', useLocation());  // 获取路由对象中的参数
    const navigate = useNavigate();
    const gorouter = () => {
        navigate('/home/childrenpages',{replace: true})  // replace 重定向
    }
    return(
        <div onClick={gorouter}>Graph</div>
    )
}

export default Graph

useLocation() 获取的路由值

console.log('useLocation', useLocation());
{
	hash: "",
	key: "vtpp9hg6",
	pathname: "/graph",
	search: "?id=ide",
	state: {
		id: "ide"
		list: [
			{cid: "123"}
			],
		name: "名字",
	}
}

后续再详细更新……

参考:
React-Router v6 新版本路由封装
react-router-dom v6 使用
React-Router v6 新特性解读及迁移指南
react-router-dom v6 版本使用内容详解
react-router-dom V6 路由传值及功能介绍

React Router是一个用于建立SPA应用程序的库,它提供了一种将应用程序状态与URL同步的方式。React Router v6React Router的最新版本,它引入了一些新的概念和语法。 下面是使用React Router v6搭建路由的步骤: 1. 安装React Router v6 使用npm或者yarn安装React Router v6: ``` npm install react-router-dom@next ``` 2. 创建路由 在应用程序的入口文件中,使用BrowserRouter创建一个路由: ```jsx import { BrowserRouter } from 'react-router-dom'; ReactDOM.render( <BrowserRouter> <App /> </BrowserRouter>, document.getElementById('root') ); ``` 3. 定义路由 使用Route组件定义路由。Route组件的path属性指定URL的路径,component属性指定该路径对应的组件: ```jsx import { Route } from 'react-router-dom'; function App() { return ( <div> <Route path="/" component={Home} /> <Route path="/about" component={About} /> </div> ); } ``` 在上面的例子中,当URL路径为“/”时,渲染Home组件;当URL路径为“/about”时,渲染About组件。 4. 处理404页面 使用Route组件的exact属性确保路由匹配完全相等的路径。这样可以避免在匹配“/”路径时同时匹配到所有其他路径。 使用Route组件的path属性指定“*”路径,即匹配所有路径的路径。将这个Route组件放在所有其他Route组件的下面,就可以为未匹配到任何路径的URL显示404页面: ```jsx import { Route, Routes } from 'react-router-dom'; function App() { return ( <div> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="*" element={<NotFound />} /> </Routes> </div> ); } ``` 在上面的例子中,当URL路径为任何未匹配到的路径时,渲染NotFound组件。 5. 嵌套路由 使用Routes组件嵌套Route组件,可以创建嵌套路由。在嵌套路由中,父级Route组件的path属性包含所有子级Route组件的path属性的前缀。 ```jsx import { Route, Routes } from 'react-router-dom'; function App() { return ( <div> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />}> <Route path="team" element={<Team />} /> <Route path="history" element={<History />} /> </Route> <Route path="*" element={<NotFound />} /> </Routes> </div> ); } ``` 在上面的例子中,当URL路径为“/about/team”时,渲染Team组件;当URL路径为“/about/history”时,渲染History组件。 React Router v6引入了一些新的语法,例如使用Routes组件代替Router组件,使用element属性代替component属性等。这些语法的目的是让React Router更加简洁易用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值