react18+router6+Antd 项目搭建1

news/2024/7/15 18:30:31 标签: javascript, 前端, react.js
javascript">npm i -g create-react-app
// 初始化项目
npx create-react-app 项目名称
// 引入antdesign, sass, react-router-dom, axios等需要的依赖
yarn add ... 
// 默认指令启动项目
yarn start 
// 有些没用的目录可以删掉, 再自行添加一些其他的目录结构

大概目录结构

javascript">// index.js 入口

import React from 'react';
import ReactDOM from 'react-dom/client';
import 'antd/dist/antd.min.css'
// 后导入全局样式文件,防止样式覆盖
import './index.scss';
import App from './App';
// 性能指标相关的,可以先去掉
import reportWebVitals from './reportWebVitals';
// 内部实现是用了 history 这个库和 React Context 来实现的,所以当你的用户前进后退时,history 这个库会记住用户的历史记录,这样需要跳转时可以直接操作
import { BrowserRouter as Router } from 'react-router-dom'

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <Router>
    <App />
  </Router>
);

// 这样控制台可以打印出相关性能数据,小瞄一眼
reportWebVitals(console.log);
javascript">// App.js 

import { useRoutes } from "react-router-dom";
import { routers } from "./routers/router";

function App() {
  // 返回与当前位置匹配的路由元素,参数: 创建的路由对象
  return useRoutes(routers);
}

export default App;

javascript">// router/index.js 管理路由组件

import AppLayout from '../views/layout/index';
import Menu11 from '../views/menu1/menu1-1'
import Menu22 from '../views/menu1/menu2-2'
import Login from '../views/login'
import Home from '../views/home'

export const routers = [
  {
    path: '/',
    element: <AppLayout />,
    // 路由嵌套,子路由的元素需使用<Outlet />
    children: [
      {
        index: true,
        element: (<Home />)
      }, 
      {
        path: '/Menu11',
        element: (<Menu11 />)
      }, 
      {
        path: '/Menu22',
        element: (<Menu22 />)
      }
    ]
  },
  {
    path: '/login',
    element: (<Login />)
  }

]
javascript">// layout.js 组件

import { Breadcrumb, Layout, Menu } from "antd";
import { MailOutlined, RedditOutlined } from "@ant-design/icons";
import React, { useState } from "react";
import { Outlet, useNavigate, } from "react-router-dom";
// 根目录 @ 要配置
import "@/styles/index.scss";

const { Header, Content, Sider, Footer } = Layout;

function getItem(label, key, icon, children, type) {
  return {
    key,
    icon,
    children,
    label,
    type,
  };
}

const items1 = ["1", "2", "3"].map((key) => ({
  key,
  label: `nav ${key}`,
}));

// key值和router中定义相同
const items = [
  getItem("Menu One", "Menu1", <MailOutlined />, 
  	[getItem("Menu1", "/Menu11"), getItem("Menu2", "/Menu22")]
  ),
];

const rootSubmenuKeys = ["Menu1"];

const App = () => {
  const [openKeys, setOpenKeys] = useState(["Menu1"]);

  const onOpenChange = (keys) => {
    const latestOpenKey = keys.find((key) => openKeys.indexOf(key) === -1);

    if (rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
      setOpenKeys(keys);
    } else {
      setOpenKeys(latestOpenKey ? [latestOpenKey] : []);
    }
  };

  const Navigate = useNavigate();

  const toPage = (e) => {
    Navigate(e.key);
  };

  return (
    <Layout style={{ height: "100%" }}>
      <Header className="header">
        <RedditOutlined style={{ fontSize: "66px" }} />
        <Menu
          theme="light"
          mode="horizontal"
          defaultSelectedKeys={["2"]}
          items={items1}
          style={{ flex: "1" }}
        />
      </Header>
      <Layout>
        <Sider width={200} className="site-layout-background">
          <Menu
            mode="inline"
            openKeys={openKeys}
            onOpenChange={onOpenChange}
            style={{ height: "100%", borderRight: 0 }}
            items={items}
            onClick={toPage}
          />
        </Sider>
        <Layout
          style={{
            padding: "0 24px",
          }}
        >
          <Breadcrumb
            style={{
              margin: "16px 0",
            }}
          >
            <Breadcrumb.Item>Home</Breadcrumb.Item>
            <Breadcrumb.Item>List</Breadcrumb.Item>
            <Breadcrumb.Item>App</Breadcrumb.Item>
          </Breadcrumb>
          <Content
            className="site-layout-background"
            style={{
              padding: 24,
              margin: 0,
              minHeight: 280,
            }}
          >
            {/* 这里注意!之前没有写<Outlet /> 在路由上浪费了好多时间 */}
            <Outlet />
          </Content>
        </Layout>
      </Layout>
      <Footer
        style={{
          textAlign: "center",
        }}
      >
        react_demo ©2022 Created by Arbor
      </Footer>
    </Layout>
  );
};

export default App;

运行界面

关于webpack配置问题

脚手架创建的react项目初始化是没有webpack.config.js等相关配置文件的,默认都是隐藏的
初始package.json文件,配置的命令都是 “react-scripts *” 来执行的

javascript">// 这个命令就是提供出来 生成一个config目录,相关的配置文件都在内
// yarn eject 是不可逆操作
"eject": "react-scripts eject",

第一步主要是想设置一个根路径,没有用 eject 重写配置可以使用 craco 来覆盖

javascript">// 安装craco相关依赖
yarn add @craco/craco craco-less @babel/plugin-proposal-decorators babel-plugin-import

// package.json 

"scripts": {
  "start": "set PORT=5000 && craco start",
  "build": "craco build",
  "test": "craco test"
},
javascript">// craco.config.js

const path = require("path")
// 定义函数resolve, 将自定义的路径和js的根路径拼接起来
const resolve = (dir) => path.resolve(__dirname, dir);

module.exports = {
    webpack:{
        alias:{
          "@": resolve("src")
        }
    },
}

http://www.niftyadmin.cn/n/958019.html

相关文章

IDEA Maven pom.xml 变灰 出现删除线

【问题】IDEA Maven pom.xml 变灰 出现删除线 项目中的pom.xml文件被设置在maven忽略清单中 解决方案 如图 将变灰出现删除线的文件 取消选中

使用git merge --squash,让commit变得优雅不想在合并分支时体现你多次commit合并一条显示

情景模拟 我们有三个分支&#xff0c;master&#xff0c;develop以及feature特性分支&#xff0c;假定我们开发时使用的是feature分支&#xff0c;我们来这里查看提交记录 当然&#xff0c;使用IDEA内置的 Version Control&#xff08;默认快捷键 alt 9&#xff09; 也能看到…

Git的smart Checkout跟force checkout的区别

在使用git进行代码版本管理的时候,当我们切换分支的时候,常常会遇到这样的问题: 这是因为在develop分支修改了代码,但是没有commit,所以在切换到其他分支的时候回弹出这个窗口.那么我们改怎么做呢? smart checkout就会把冲突的这部分内容带到目的分支&#xff08;如果你没有…

idea 提交git常见操作 git 常用操作实例大全

本文介绍使用IDEA控制Git操作 关联本地Git客户端 首先要根据系统环境安装Git客户端 然后使用File --> Settings --> Version Control --> Git配置客户端安装目录 创建本地仓库 根据项目要求创建自己的项目 然后使用VCS --> Import into Version Control --&g…

未能加载文件或程序集“Microsoft.Office.Interop.Word”或它的某一个依赖项。拒

vs调试代码都饿时报这个错误... --> 管理员权限运行 visual studio 试试.

Vue3中文文档 - vuejs

[Vue3中文文档 - vuejs](https://vue3js.cn/docs/zh/guide/introduction.html#%E8%B5%B7%E6%AD%A5)

据说vite还是有坑,不行,那就还用vue-cli吧,命令vue create gua12,记一下,可能过一个星期不看,又忘了

ivyoneivyonedeMacBook-Pro ~ % mkdir hami92 ivyoneivyonedeMacBook-Pro ~ % cd hami92 ivyoneivyonedeMacBook-Pro hami92 % vue create gua12Vue CLI v4.5.11 ? Please pick a preset: Default (Vue 3 Preview) ([Vue 3] babel, eslint)Vue CLI v4.5.11 ✨ Creating proje…

idea添加导航栏工具-前进、后退、更新、提交(idea添加前后上下箭头快捷键、更新、提交)

1、添加更新和提交 2、添加前进后退 聪明的你&#xff0c;可以自己添加下试试 在相应的位置继续添加快捷方式就行了 前两步和上边的图一图二一致 ———————————————— 版权声明&#xff1a;本文为CSDN博主「子书少卿」的原创文章&#xff0c;遵循CC 4.0 BY-SA…