新建react项目,react-router-dom配置路由,引入antd

提示:reactrouter6.4+版本,与reactrouter5.0的版本用法有区别,互不兼容需注意


前言

需求:新建react项目,react-router-dom配置路由,引入antd

一、创建项目

1、创建与安装

npx create-react-app my-react-app
cd my-react-app

项目结构
在这里插入图片描述

npm install react-router-dom
npm install antd –save

在这里插入图片描述
2、修改文件
app.js

import './App.css';
function App() {
   
  return (
    <div>
      my react app
    </div>
  );
}
export default App;

app.css

.App {
   
  text-align: center;
}

3、启动预览

npm start

在这里插入图片描述

二、新建文件并引入react-router-dom、antd

1、新建文件

head.js、home.js、my.js、order.js、pay.js内容基本一致,贴一个例子,其余修改对应值即可

import React from 'react';

class Pay extends React.Component {
   
  render() {
   
    return <div>Pay</div>;
  }
}
export default Pay;

在这里插入图片描述
main.js

import React from 'react';
import {
    Outlet } from "react-router-dom";
class Main extends React.Component {
   
  render() {
   
    return <div><Outlet /></div>;
  }
}
export default Main;

side.js

import React from 'react';
import Routes from '../routes';
import {
    Menu } from 'antd';
import {
    useNavigate } from "react-router-dom";
let menus = [];
Routes.forEach((item,index)=>{
   
  let obj = {
   
    key:index,
    label:item.label,
  }
  if(item.children){
    
    item.children.forEach((citem,i)=>{
   
      citem.key=index+'-'+i;
    });
    obj.children = item.children
   }
  menus.push(obj);
});
export default function Side() {
   
  const navigate = useNavigate();
  function goPath(e){
   
    let keys = e.key.split('-');
    let route,cRoute;
    route = Routes[keys[0]];
    if(route.children){
   
      cRoute = route.children[keys[1]];
    }
    let path = route.path + (cRoute?'/'+cRoute.path:'');
    navigate(path);
  }
  return <div>
    <Menu
      defaultSelectedKeys={
   ['0']}
      defaultOpenKeys={
   ['1']}
      mode="inline"
      theme="dark"
      items={
   menus}
      onClick={
   goPath}
    />
  </div>;
}

routes/index.js

import Home from '../components/home';
import My from '../components/my';
import Order from '../components/order';
import Pay from '../components/pay';
import Main from '../components/main';

const Routes = [
  {
   
    path: "/",
    label:'首页',
    element: <Home/>,
  },
  {
   
    path: "main",
    label:'业务',
    element: <Main/>,
    children:[
      {
   
        path: "order",
        label:'订单',
        element: <Order/>,
      },
      {
   
        path: "pay",
        label:'支付信息',
        element: <Pay/>,
      },
    ]
  },
  {
   
    path: "my",
    label:'我的',
    element: <My/>,
  },
];
export default Routes;

2、新建后文件结构
在这里插入图片描述

三、配置路由跳转

1、修改App.js和App.css文件
App.js

import {
    BrowserRouter ,Route,Routes} from "react-router-dom";
import './App.css';
import routes from './routes';
import Head from './components/head';
import Side from './components/side';
function renderRoute(){
   
  let arr = [];
  routes.forEach((item,i)=>{
   
    if(item.children){
   
      item.children.forEach((citem,ci)=>{
   
        arr.push(<Route key={
   i+'-'+ci} path={
   item.path+'/'+citem.path} element={
   citem.element}></Route>);
      })
    }else{
   
      arr.push(<Route key={
   i} path={
   item.path} element={
   item.element}></Route>);
    }
  })
  return arr;
}

function App() {
   
  return (
    <div className="App">
      <BrowserRouter>
      <div className='app_head'><Head/></div>
        <div className='app_side'><Side/></div> 
        <div className='app_main'>
          <Routes>
            {
    renderRoute() }
          </Routes>
        </div> 
      </BrowserRouter>
    </div>
  );
}
export default App;

App.css

.App {
   
  text-align: center;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}
.app_head{
   
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 64px;
  background-color: #dbeff3;
}
.app_side{
   
  position: absolute;
  top: 64px;
  left: 0;
  bottom: 0;
  width: 320px;
  background-color: #707472;
}
.app_main{
   
  position: absolute;
  top: 64px;
  left: 320px;
  bottom: 0;
  right: 0;
  background-color: #fff;
}

四、效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、遇到的问题

在这里插入图片描述

useNavigate必须在router component里使用,side.js里调用的useNavigate,所以side
componet必须在BrowserRouter里

app.js错误写法

import {
    BrowserRouter ,Route,Routes} from "react-router-dom";
import './App.css';
import routes from './routes';
import Head from './components/head';
import Side from './components/side';
function renderRoute(){
   
  let arr = [];
  routes.forEach((item,i)=>{
   
    if(item.children){
   
      item.children.forEach((citem,ci)=>{
   
        arr.push(<Route key={
   i+'-'+ci} path={
   item.path+'/'+citem.path} element={
   citem.element}></Route>);
      })
    }else{
   
      arr.push(<Route key={
   i} path={
   item.path} element={
   item.element}></Route>);
    }
  })
  return arr;
}

function App() {
   
  return (
    <div className="App">
     
      <div className='app_head'><Head/></div>
        <div className='app_side'><Side/></div> 
        <BrowserRouter>
          <div className='app_main'>
            <Routes>
              {
    renderRoute() }
            </Routes>
          </div> 
        </BrowserRouter>
    </div>
  );
}
export default App;

在这里插入图片描述在这里插入图片描述

useNavigate应该放在一个react function component里

side.js错误写法

import React from 'react';
import Routes from '../routes';
import { Menu } from 'antd';
import { useNavigate } from "react-router-dom";
let menus = [];
Routes.forEach((item,index)=>{
  let obj = {
    key:index,
    label:item.label,
  }
  if(item.children){ 
    item.children.forEach((citem,i)=>{
      citem.key=index+'-'+i;
    });
    obj.children = item.children
   }
  menus.push(obj);
});
const navigate = useNavigate();
class Side extends React.Component {
  render() {
    function goPath(e){
      let keys = e.key.split('-');
      let route,cRoute;
      route = Routes[keys[0]];
      if(route.children){
        cRoute = route.children[keys[1]];
      }
      let path = route.path + (cRoute?'/'+cRoute.path:'');
      navigate(path);
    }
    return <div>
      <Menu
        defaultSelectedKeys={['0']}
        defaultOpenKeys={['1']}
        mode="inline"
        theme="dark"
        items={menus}
        onClick={goPath}
      />
    </div>;
  }
}
export default Side;

在这里插入图片描述

useNavigate应该放在一个react function component里,而不是一个class component里

side.js错误写法

import React from 'react';
import Routes from '../routes';
import {
    Menu } from 'antd';
import {
    useNavigate } from "react-router-dom";
let menus = [];
Routes.forEach((item,index)=>{
   
  let obj = {
   
    key:index,
    label:item.label,
  }
  if(item.children){
    
    item.children.forEach((citem,i)=>{
   
      citem.key=index+'-'+i;
    });
    obj.children = item.children
   }
  menus.push(obj);
});
class Side extends React.Component {
   
  render() {
   
    const navigate = useNavigate();
    function goPath(e){
   
      let keys = e.key.split('-');
      let route,cRoute;
      route = Routes[keys[0]];
      if(route.children){
   
        cRoute = route.children[keys[1]];
      }
      let path = route.path + (cRoute?'/'+cRoute.path:'');
      navigate(path);
    }
    return <div>
      <Menu
        defaultSelectedKeys={
   ['0']}
        defaultOpenKeys={
   ['1']}
        mode="inline"
        theme="dark"
        items={
   menus}
        onClick={
   goPath}
      />
    </div>;
  }
}
export default Side;

六、参考文档

react中文官网
reactrouter官网
antd官网

总结

踩坑路漫漫长@~@

相关推荐

  1. 使用 React Router Dom 实现导航

    2024-01-27 09:22:02       24 阅读
  2. react ts react-router 6配置

    2024-01-27 09:22:02       10 阅读
  3. Reactreact-router-dom导航的跳转及传参

    2024-01-27 09:22:02       45 阅读
  4. React Router 详解

    2024-01-27 09:22:02       6 阅读
  5. 使用 react-router-dom v6.22 的 useRoutes

    2024-01-27 09:22:02       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-27 09:22:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-27 09:22:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-27 09:22:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-27 09:22:02       20 阅读

热门阅读

  1. 如何在 Ubuntu 20.04 上安装 MySQL

    2024-01-27 09:22:02       27 阅读
  2. 【硅谷甄选】commitlint

    2024-01-27 09:22:02       30 阅读
  3. [go] 访问者模式

    2024-01-27 09:22:02       41 阅读
  4. Python面试题

    2024-01-27 09:22:02       31 阅读
  5. PHP AES加解密示例

    2024-01-27 09:22:02       34 阅读
  6. 适用于烟机变频风机的32位单片机

    2024-01-27 09:22:02       30 阅读
  7. 数据结构--树

    2024-01-27 09:22:02       28 阅读
  8. 音频筑基:窄带、宽带、超宽带、全带一次说透

    2024-01-27 09:22:02       48 阅读
  9. Vue禁止指定vue页面缩放适配移动端

    2024-01-27 09:22:02       44 阅读
  10. Centos 虚拟机安装

    2024-01-27 09:22:02       37 阅读
  11. 使用Tensorflow2.x复现uxnet3D

    2024-01-27 09:22:02       27 阅读
  12. CentOS 7 下安装 Docker 及配置阿里云加速服务

    2024-01-27 09:22:02       31 阅读