官网地址:react-router

1.安装的版本,antd版本4.24.1

2.项目目录结构

3.入口文件index.js配置,react18版本发生了一些变化,改为以下写法

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './app';

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

4.Routes组件替换了v5版的Switch组件

router.js

import React, { lazy } from 'react';

const Goods = lazy(() =>
    import( /* webpackChunkName: "Goods"*/ 'pages/goods')
);
const List = lazy(() =>
    import( /* webpackChunkName: "List"*/ 'pages/list')
);
const router = [
    {
        path: '/home/goods',
        component: Goods,
        name: '关于'
    },
    {
        path: '/home/list',
        component: List,
        name: '列表页'
    },
]

export default router;

app.js

import { ConfigProvider } from 'antd';
import zh_CN from 'antd/lib/locale-provider/zh_CN';
import routerConfig from 'routerConfig';
import Login from 'pages/login';
import Home from 'pages/home';

import './App.less';

export default function App() {
    const HomeIndex = routerConfig[0]?.component;

    return (
        <ConfigProvider locale={zh_CN}>
            <HashRouter>
                {/* react-router-dom v6 使用“Routes”代替“Switch”  */}
                <Suspense fallback={<div>loading</div>}>
                    <Routes>
                        <Route path="/"  element={<Login/>}/>
                        <Route path="/home"  element={<Home/>}>
                            {/* 二级路由 */}
                            <Route index element={<HomeIndex/>}/>
                            {
                                routerConfig.map(item=>{
                                    return (
                                        <Route path={item.path}  key={item.path} element={<item.component/>} />
                                    )
                                })
                            }
                        </Route>
                        <Route path="*"  element={<Login/>}/>
                    </Routes>
                </Suspense>
            </HashRouter>
       </ConfigProvider>
    );
}

5.跳转方式用useNavigate方法或者使用NavLink和Link

useNavigate方法使用,只能在函数组件中使用

import React from 'react';
import {  useNavigate } from "react-router-dom";

const Home = (props) => {
    const navigate = useNavigate();
    const navClick = () => {
        //路由跳转
        navigate('/home');
        //history 的replace模式
        // navigate('/home',{ replace: true })
    };
    return(
        <div onOnclick={navClick}>页面跳转</div>
    )
}    

NavLink的使用

<NavLink to='/home'>首页</NavLink>

6.antd配置home页

Outlet把二级路由的页面内容显示到这里,相当于vue的router-view 
import React, { useState, Suspense, useEffect } from 'react';
import { UserOutlined, VideoCameraOutlined } from '@ant-design/icons';
import { Layout, Menu } from 'antd';
import { Routes, Route, useNavigate, Outlet, NavLink } from "react-router-dom";
import routerConfig from 'routerConfig';

import About from '../goods';
import List from '../list';

import './index.less';

const { Header, Sider, Content } = Layout;

const Home = (props) => {
    const [collapsed, setCollapsed] = useState(false);  

    const navigate = useNavigate();
    const navClick = (e) => {
        //路由跳转
        navigate(e.key)
    };
    
    return( 
    <Layout className='home-main'>
        <Sider trigger={null} collapsible collapsed={collapsed}>
            <div className="title"> 框架构建demo </div>
            <Menu
                className='menu'
                theme="dark"
                mode="inline"
                defaultSelectedKeys={['/home/goods']}
                onClick={navClick}
                items={[
                    {
                        key: '/home/goods',
                        icon: <UserOutlined />,
                        label: "商品"
                    },
                    {
                        key: '/home/list',
                        icon: <VideoCameraOutlined />,
                        label: "列表"
                    }
                ]}
            />
        </Sider>
        <Layout className="site-layout">
            <Header className="site-layout-background" style={{ padding: 0 }}></Header>
            <Content
                className="site-layout-background"
                style={{
                    margin: '24px 16px',
                    padding: 24,
                    minHeight: 280,
                }}
            >
                <Suspense fallback={<div>loading</div>}>
                    {/* Outlet相当于vue的router-view */}
                    <Outlet/>
                </Suspense>
            </Content>
        </Layout>
    </Layout>
    )
};

export default Home;

到这里基本配置就完成了。

原文地址:http://www.cnblogs.com/zimengxiyu/p/16886331.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性