React18+Redux+antd 项目实战 JS

news2024/9/20 6:02:04

React18+Redux+antd 项目实战 js

Ant Design插件官网
Axios官网 (可配置请求拦截器和响应拦截器)
JavaScript官网
Echarts官网

一、项目前期准备

1.创建新项目 hotel-manager

npx create-react-app hotel-manager

2.安装依赖

//安装路由
npm i react-router-dom

npm i aixos
//安装组件库
npm i antd

npm i sass

3.删除没必要的文件,最后新建文件夹成这样
在这里插入图片描述
4.修改里面的文件代码
(1)修改index.css

* {
  margin: 0;
  padding: 0;
  list-style: none;
  text-decoration: none;
  outline: none;
}

body {
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
    sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

(2)修改App.js

import { BrowserRouter, Route, Routes } from 'react-router-dom';
// 导入页面组件
import Layout from './views/Layout/Layout';
import Login from './views/Login/Login';

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path='/' element={<Login />} />
        <Route path='/Layout' element={<Layout />} />
      </Routes>
    </BrowserRouter>
  );
}

export default App;

(3)清空App.css
(4)修改index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import 'antd/dist/reset.css'
import App from './App';


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

二、开始项目编写
(1)新建Layout.js

import React, { useState } from 'react';
import {
  MenuFoldOutlined,
  MenuUnfoldOutlined,
  UploadOutlined,
  UserOutlined,
  VideoCameraOutlined,
} from '@ant-design/icons';
import { Button, Layout, Menu, theme } from 'antd';
import './Layout.scss'


const { Header, Sider, Content } = Layout;
export default function () {
  const [collapsed, setCollapsed] = useState(false);
  const {
    token: { colorBgContainer, borderRadiusLG },
  } = theme.useToken();
  return (
    <Layout className='layout'>
      <Sider trigger={null} collapsible collapsed={collapsed}>
        <div className="demo-logo-vertical" />
        <Menu
          theme="dark"
          mode="inline"
          defaultSelectedKeys={['1']}
          items={[
            {
              key: '1',
              icon: <UserOutlined />,
              label: 'nav 1',
            },
            {
              key: '2',
              icon: <VideoCameraOutlined />,
              label: 'nav 2',
            },
            {
              key: '3',
              icon: <UploadOutlined />,
              label: 'nav 3',
            },
          ]}
        />
      </Sider>
      <Layout>
        <Header
          style={{
            padding: 0,
            background: colorBgContainer,
          }}
        >
          <Button
            type="text"
            icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
            onClick={() => setCollapsed(!collapsed)}
            style={{
              fontSize: '16px',
              width: 64,
              height: 64,
            }}
          />
        </Header>
        <Content
          style={{
            margin: '24px 16px',
            padding: 24,
            minHeight: 240,
            background: colorBgContainer,
            borderRadius: borderRadiusLG,
          }}
        >
          Content
        </Content>
      </Layout>
    </Layout>
  )
}

(2)新建Layout.scss

.layout {
  width: 100vw;
  height: 100vh;
}

(3)新建Login.js

import React, { useState } from "react";
import './Login.scss'
import { Button, Form, Input, message } from 'antd';
import MyNotification from "../../components/MyNotification/MyNotification";
import { useNavigate } from "react-router-dom";

export default function Login() {
  //导航
  let navigate = useNavigate()
  // 通知框状态消息提示
  let [notiMsg, setNotiMsg] = useState({ type: '', description: '' })
  // 表单成功提交方法
  const onFinish = (values) => {
    console.log('Success:', values);
    setNotiMsg({ type: 'success', description: message })
    //跳转到首页
    navigate('/layout')
  };
  let [form] = Form.useForm()
  const onReset = () => {
    form.resetFields();
  };
  return (
    <div className="login">
      <div className="content">
        <h2>后台管理系统</h2>
        <Form
          name="basic"
          form={form}
          labelCol={{
            span: 4,
          }}
          wrapperCol={{
            span: 18,
          }}
          style={{
            maxWidth: 600,
          }}
          initialValues={{
            remember: true,
          }}
          onFinish={onFinish}
          autoComplete="off"
        >
          <Form.Item
            label="账号"
            name="username"
            rules={[
              {
                required: true,
                message: '请输入账号!',
              },
            ]}
          >
            <Input />
          </Form.Item>

          <Form.Item
            label="密码"
            name="password"
            rules={[
              {
                required: true,
                message: '请输入密码!',
              },
            ]}
          >
            <Input.Password />
          </Form.Item>

          <Form.Item
            wrapperCol={{
              offset: 4,
              span: 16,
            }}
          >
            <Button type="primary" htmlType="submit">
              登录
            </Button>
            <Button style={{ marginLeft: '10px' }} onClick={onReset}>
              取消
            </Button>
          </Form.Item>
        </Form>
        <MyNotification notiMsg={notiMsg} />
      </div>
    </div>
  )
}

(4)新建Login.scss

.login {
  width: 100vw;
  height: 100vh;
  background-color: rgb(141, 160, 202);
  display: flex;
  justify-content: center;
  align-items: center;

  .content {
    width: 500px;
    height: 230px;
    border: 1px solid white;
    padding-top: 20px;

    h2 {
      text-align: center;
    }
  }
}

三、运行项目

npm run start

学习react,需要对js特别会,听说js会的人就不会觉得react难。继续学习js。。。vue框架对js的要求不是很高,因为里面有一些自定义的语法,怪不得我学的还算顺畅,呜呜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cassandra数据库与Cql实战笔记

文章目录 启动数据库查看数据库节点启动成功状态 关闭数据库使用cqlsh工具常见命令查看集群信息 数据定义命令数据操作命令操作健空间创建Keyspace连接健空间删除健空间创建表主键表修改添加列删除列删除表清空表 添加数据数据过期时间 查询数据更新数据更新简单数据更新set类型…

Docker:基础概念、架构与网络模式详解

1.Docker的基本概念 1.1.什么是docker Docker是一个用于开发,交付和运行应用程序的开放平台.docker使您能够将应用程序域基础框架分开,以便你可以快速开发交付软件.使用docker,你可以管理你的基础架构以管理应用程序相同的方式.通过利用docker用于交付,测试和部署代码的方法,你…

「字符串匹配算法 2/3」有限自动机匹配字符串算法

有限自动机匹配字符串算法需要一定的数论知识&#xff0c;而且也不是很好玩。 本文不会展开说其数学属性&#xff0c;因为要说清楚这点需要读者有一定的离散数学基础&#xff0c;不然就得先解释清楚一些概念。所以如果你不懂自动机、状态机等概念&#xff0c;对集合、关系等概…

【Datawhale AI 夏令营】讯飞“基于术语词典干预的机器翻译挑战赛”

背景 机器翻译具有悠长的发展历史&#xff0c;目前主流的机器翻译方法为神经网络翻译&#xff0c;如LSTM和transformer。在特定领域或行业中&#xff0c;由于机器翻译难以保证术语的一致性&#xff0c;导致翻译效果还不够理想。对于术语名词、人名地名等机器翻译不准确的结果&…

PyTorch复现PointNet++——模型训练+模型测试

本博文主要实现对PointNet源码进行调试&#xff0c;训练可视化测试。 一、下载源码和数据集 论文&#xff1a;PointNet: Deep Hierarchical Feature Learning on Point Sets in a Metric Space GitHub源码&#xff1a;Pointnet2_pytorch 数据集包括三种&#xff1a;分类、零部…

修改留言板

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>备忘录</title><!-- <link rel"…

[Spring] Spring Web MVC基础理论

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

如何从 PDF 中删除背景

您是否曾经收到过充满分散注意力背景的扫描 PDF 文档&#xff1f;也许是带有繁忙水印的旧收据或背景光线不均匀的扫描文档。虽然这些背景可能看起来没什么大不了的&#xff0c;但它们会使您的工作空间变得混乱&#xff0c;并使您难以专注于重要信息。轻松删除这些不需要的元素并…

嵌入式基础 硬件接口汇总

在此收集整理嵌入式通信中常见的接口协议&#xff0c;它们具有一定的通用性&#xff0c;在今后的开发中会反复遇到。 包括但不限于以下类别&#xff08;逐步完善中…&#xff09;&#xff1a; GPIOUARTSPII2CUSBEthernetNAND Flash类SDRAM类&#xff08;ram-like&#xff09;LC…

机器学习——随机森林(学习笔记)

目录 一、基础认识 1. 集成算法介绍 2. 集成算法种类 二、sklearn中的随机森林 1. ensemble.RandomForestClassifier &#xff08;随机森林分类&#xff09; &#xff08;1&#xff09;基本参数 &#xff08;2&#xff09;基本属性 &#xff08;3&#xff09;基本接口 …

【Linux】centos7安装PHP7.4报错:libzip版本过低

问题描述 configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0) were not met: checking for libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0... no configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzi…

DAMA学习笔记(五)-数据存储和操作

1.引言 数据存储与操作包括对存储数据的设计、实施和支持&#xff0c;最大化实现数据资源的价值&#xff0c;贯穿于数据创建/获取到处置的整个生命周期。 数据存储与操作包含两个子活动&#xff08;图6-1&#xff09;。 图6-1 语境关系图&#xff1a;数据存储与操作 (1) 数据库…

分布式系统—Ceph块存储系统(RBD接口)

目录 一、服务端操作 1 创建一个名为 rbd-xy101 的专门用于 RBD 的存储池 2 将存储池转换为 RBD 模式 3 初始化存储池 4 创建镜像 5 管理镜像 6.Linux客户端使用 在管理节点创建并授权一个用户可访问指定的 RBD 存储池 ​编辑修改RBD镜像特性&#xff0c;CentOS7默认情…

英特尔CPU研发团队繁忙的一天

早晨&#xff1a;准备与启动 7:00 AM - 起床与准备 研发团队的工程师们早早起床&#xff0c;快速洗漱并享用健康的早餐。部分工程师会进行晨间锻炼&#xff0c;保持头脑清醒和身体活力。 8:00 AM - 到达办公室 工程师们来到位于硅谷的英特尔总部&#xff0c;进入研发中心。…

Open-TeleVision——通过VR沉浸式感受人形机器人视野的远程操作

前言 7.3日&#xff0c;我司大模型机器人(具身智能)线下营群里的一学员发了《Open-TeleVision: Teleoperation with Immersive Active Visual Feedback》这篇论文的链接&#xff0c;我当时快速看了一遍&#xff0c;还是有价值的一个工作(其有受mobile aloha工作的启发)&#x…

MT6816磁编码IC在工控机器人中的应用

在现代工业自动化领域&#xff0c;高精度的位置检测和控制技术对于机器人系统的稳定运行至关重要。MT6816磁编码IC作为一款先进的磁传感器解决方案&#xff0c;以其卓越的性能和稳定性&#xff0c;在工控机器人中得到了广泛的应用。本文将详细探讨MT6816磁编码IC在工控机器人中…

git常用命令及git分支

git常用命令及git分支 git常用命令设置用户签名初始化本地库查看本地库状态将文件添加到暂存区提交到本地库查看历史记录版本穿梭 git分支什么是分支分支的好处分支的操作查看分支创建分支切换分支删除分支合并分支合并冲突 git常用命令 设置用户签名 //设置用户签名 git con…

Golang:数据科学领域中的高性能并发编程新星

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 并发性能的卓越表现📝 系统级工具的便捷性📝 语言设计的简洁性📝 强类型系统的严格性📝 版本兼容性的稳定性📝 内置工具的全面性⚓️ 相关链接 ⚓️📖 介绍 📖 在数据科学和机器学习的广阔天地…

音视频开发—使用FFmpeg从纯H264码流中提取图片 C语言实现

文章目录 1.H264码流文件解码流程关键流程详细解码流程详细步骤解析 2.JPEG编码流程详细编码流程详细步骤解析 3.完整示例代码4.效果展示 从纯H.264码流中提取图片的过程包括解码和JPEG编码两个主要步骤&#xff0c;以下是详细阐述 1.H264码流文件解码流程 关键流程 查找编解…

微信小程序---分包加载

一、分包加载 1. 什么是分包加载 什么是分包加载 ❓ 小程序的代码通常是由许多页面、组件以及资源等组成&#xff0c;随着小程序功能的增加&#xff0c;代码量也会逐渐增加&#xff0c;体积过大就会导致用户打开速度变慢&#xff0c;影响用户的使用体验。 分包加载是一种小…