React基础之项目实战

news2025/3/13 23:33:14

规范的项目结构

安装scss

npm install sass -D

安装Ant Design组件库

内置了一些常用的组件

npm install antd --save

路由基础配置

npm i react-router-dom

路由基本入口

import Layout from "../page/Layout";

import Login from "../page/Login";

import { createBrowserRouter } from "react-router-dom";

const router=createBrowserRouter([

    {

        path:"/",

        element:<Layout/>

    },

    {

        path:"/login",

        element:<Login/>

    }

])

export default router

主index.js入口配置

import React from 'react';

import ReactDOM from 'react-dom/client';

import { RouterProvider } from 'react-router-dom';

import router from './router';

const root = ReactDOM.createRoot(document.getElementById('root'));

root.render(

  <React.StrictMode>

    <RouterProvider router={router}/>

  </React.StrictMode>

);

配置@别名路径

安装craco工具包

npm i @craco/craco -D

也就是将替换成@

1.创建craco.config.js配置文件

const path = require('path')

module.exports = {

  // webpack 配置

  webpack: {

    // 配置别名

    alias: {

      // 约定:使用 @ 表示 src 文件所在路径

      '@': path.resolve(__dirname, 'src')

    }

  }

}

2.将package.json进行替换的scripts

  "scripts": {

    "start": "craco start",

    "build": "craco build",

    "test": "craco test",

    "eject": "craco eject"

  },

添加路径提示

1.创建jsconfig.json

{

    "compilerOptions": {

      "baseUrl": "./",

      "paths": {

        "@/*": ["src/*"]

      }

    }

  }

Login开发通过使用antDesion组件

Token持久化

因为Redux是基于浏览器内容的存储方法,刷新时状态会恢复为初始值,比如登录之后Token再刷新页面之后就会丢失

我们可以在获取到token之后,就在本地的localStorage进行存储,在进行token初始化的时候,先判断token在localStorage中有没有,如果没有则为空,如果有那就用localStrage中的

token请求头注入

import axios from 'axios'

import { getToken } from './token'

const request = axios.create({

  baseURL: 'http://geek.itheima.net/v1_0',

  timeout: 5000

})

// 添加请求拦截器

request.interceptors.request.use((config)=> {

  //操作config 注入token数据

  //1.获取tolen

  const token=getToken()

  //2.注入token

  if(token){

    config.headers.Authorization = `Bearer ${token}`

  }

    return config

  }, (error)=> {

    return Promise.reject(error)

})

// 添加响应拦截器

request.interceptors.response.use((response)=> {

    // 2xx 范围内的状态码都会触发该函数。

    // 对响应数据做点什么

    return response.data

  }, (error)=> {

    // 超出 2xx 范围的状态码都会触发该函数。

    // 对响应错误做点什么

    return Promise.reject(error)

})

export { request }

token跳转

1.封装路由组件

//封装高阶组件

//核心逻辑:有token 正常跳转,无token去登录

import { Navigate } from 'react-router-dom'

import { getToken } from '@/utils'

export function AuthRoute  ({ children })  {

    const isToken = getToken()

    if (isToken) {

      return <>{children}</>

    } else {

     return <Navigate to={'/login'} replace/>

    }

  }

 

2.在路由配置中应用

import Layout from "@/page/Layout";

import Login from "@/page/Login";

import { createBrowserRouter } from "react-router-dom";

import { AuthRoute } from "@/components/AuthRouter";

const router=createBrowserRouter([

    {

        path:"/",

        element:<AuthRoute><Layout/></AuthRoute>

    },

    {

        path:"/login",

        element:<Login/>

    }

])

export default router

初始化样式

npm install normalize.css0

并在项目入口index配置

import 'normalize.css'

设置Token失效或错误重新跳转登录页

import axios from 'axios'

import { getToken, removeToken } from '@/utils'

import router from '@/router'

const request = axios.create({

  baseURL: 'http://geek.itheima.net/v1_0',

  timeout: 50000

})

// 添加请求拦截器

request.interceptors.request.use((config)=> {

  //操作config 注入token数据

  //1.获取tolen

  const token=getToken()

  //2.注入token

  if(token){

    config.headers.Authorization = `Bearer ${token}`

  }

    return config

  }, (error)=> {

    return Promise.reject(error)

})

// 添加响应拦截器

request.interceptors.response.use((response)=> {

    // 2xx 范围内的状态码都会触发该函数。

    // 对响应数据做点什么

    return response.data

  }, (error)=> {

    //添加401 token失效

    if(error.response.status===401){

      removeToken()

      router.navigate('/login')

      window.location.reload()

    }

   

    return Promise.reject(error)

})

export { request }

快速接入Echart基础图标

npm i echarts

import { useEffect, useRef } from 'react'

import * as echarts from 'echarts'

//柱状图

const BarChart=({title})=>{

    const chartRef = useRef(null)

    useEffect(() => {

      var chartDom = document.getElementById('main');

      var myChart = echarts.init(chartDom);

      var option;

     

      option = {

          title:{

              text:title

          },

        xAxis: {

          type: 'category',

          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

        },

        yAxis: {

          type: 'value'

        },

        series: [

          {

            data: [120, 200, 150, 80, 70, 110, 130],

            type: 'bar'

          }

        ]

      };

     

      option && myChart.setOption(option);

    }, [])

    return  <div id='main'style={{ width: '400px', height: '300px' }} />

}

export default BarChart

在其他部分复用

import BarChart from "@/components/BarChart"

const Home = () => {

  return (

    <div>

     <BarChart title='三大框架满意度'/>

    </div >

  )

}

export default Home

富文本编辑器

npm install react-quill

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

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

相关文章

SAP-ABAP:SAP数据库视图的创建图文详解

在SAP ABAP中&#xff0c;数据库视图&#xff08;Database View&#xff09;是通过ABAP字典&#xff08;ABAP Dictionary&#xff09;创建的。数据库视图是基于一个或多个数据库表的虚拟表&#xff0c;它允许你定义一种逻辑视图来访问数据。以下是创建数据库视图的步骤&#xf…

基于深度学习的肺炎X光影像自动诊断系统实现,真实操作案例分享,值得学习!

医疗影像智能化的技术演进 医学影像分析正经历从人工判读到AI辅助诊断的革命性转变。传统放射科医师分析胸部X光片需要8-12年专业训练&#xff0c;而基于深度学习的智能系统可在秒级完成检测。本文将以肺炎X光检测为切入点&#xff0c;详解从数据预处理到模型部署的全流程实现。…

Unity Shader学习总结

1.帧缓冲区和颜色缓冲区区别 用于存储每帧每个像素颜色信息的缓冲区 帧缓冲区包括&#xff1a;颜色缓冲区 深度缓冲区 模板缓冲区 自定义缓冲区 2.ImageEffectShader是什么 后处理用的shader模版 3.computerShader 独立于渲染管线之外&#xff0c;在显卡上运行&#xff0c;大量…

算法精讲 | 树(番外):平衡世界的四大守护者:AVL vs 红黑树 vs B树 vs B+树

&#x1f332; 算法精讲 | 树&#xff08;番外&#xff09;&#xff1a;平衡世界的四大守护者&#xff1a;AVL vs 红黑树 vs B树 vs B树 &#x1f4c5; 2025/03/12 || &#x1f31f; 推荐阅读时间 30分钟 &#x1f680; 开篇&#xff1a;数据结构界的四大天王 想象你是一名图书…

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机&#xff1a;必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add&#xff0c;可能会导致Wait方法提前返回&#xff0c;因为计数器没有正确反映正在运行的goroutine的数量…

在vs中无法用QtDesigner打开ui文件的解决方法

解决方法 右键ui文件&#xff0c;选择打开方式&#xff0c;弹出如下界面。 点击添加&#xff0c;弹出如下界面 点击程序后边的三个点&#xff0c;去电脑查找designer.exe,我的位置为D:\Qt\Qt5.9.9\5.9.9\msvc2015_64\bin\designer.exe。 名称可以自己起一个名字&#xff0c…

图像识别技术与应用-YOLO

1 YOLO-V1 YOLO-V1它是经典的one-stage方法&#xff0c;You Only Look Once&#xff0c;名字就已经说明了一切&#xff01;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;也可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; YOLO-V1诞生与2…

LLM推理和优化(1):基本概念介绍

一、LLM推理的核心过程&#xff1a;自回归生成 LLM&#xff08;如DeepSeek、ChatGPT、LLaMA系列等&#xff09;的推理本质是自回归生成&#xff1a;从初始输入&#xff08;如[CLS]或用户prompt&#xff09;开始&#xff0c;逐token预测下一个词&#xff0c;直到生成结束符&…

Kubernetes教程(七)了解集群、标签、Pod和Deployment

了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace&#xff08;命名空间&#xff09;四、Label&#xff08;标签&#xff09;五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…

【最新】DeepSeek 实用集成工具有那些?

deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意&#xff1a;以下内容来自awesome-deepseek-integration DeepSeek 实用集成&#xff08;awesome-deepseek-integration&#xff09; 将…

Flutter_学习记录_video_player、chewie 播放视频

1. video_player 视频播放 插件地址&#xff1a;https://pub.dev/packages/video_player 添加插件 导入头文件 import package:video_player/video_player.dart;Android配置&#xff08;iOS不用配置&#xff09; 修改这个文件&#xff1a;/android/app/src/main/AndroidMani…

【MySQL】增删改查进阶

目录 一、数据库约束 约束类型 NULL约束&#xff1a;非空约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…

静态时序分析:SDC约束命令set_ideal_latency详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后&#xff0c;理想属性会沿着组合逻辑进行传播&#xff0c;理想网络中的线网和单元…

达梦数据库查看字符集编码

select SF_GET_UNICODE_FLAG(); 返回 0 代表数据库字符集编码为 GB18030 1 代表数据库字符集编码为 UTF-8 2 代表数据库字符集编码为韩文字符集 EUC-KR

Pac-Man(吃豆人) 游戏

目录 前言 1. Pygame游戏开发基础 1.1 Pygame简介 1.2 游戏开发基本概念 1.3 Pygame核心模块介绍 2. 游戏设计与规划 2.1 游戏规则设计 2.2 游戏对象规划 2.3 技术方案选择 3. 创建游戏窗口与初始化 3.1 初始化Pygame环境 3.2 设置游戏窗口 3.3 定义颜色和游戏参数…

【Spring】@PostConstruct详解

在 Java 开发中&#xff0c;尤其是在基于 Spring 框架的项目里&#xff0c;我们常常会遇到需要在对象创建并完成依赖注入后&#xff0c;执行一些初始化操作的场景。PostConstruct注解正是为解决此类问题而诞生的&#xff0c;它为我们提供了一种便捷且优雅的方式来处理对象的初始…

OEM SQL Details and Session Details 5s 或者parallel 才会在sql monitor显示

从企业管理器 13.4 版本更新 10 (RU10) 开始&#xff0c;ASH Analytics 的 SQL 详细信息和会话详细信息深入屏幕已更新为使用 Oracle JET UI。 在 Ash Analytics 中&#xff0c;单击左下角区域中“热门 SQL”中的 SQL ID 即可深入了解 SQL 详细信息。 单击右下角“热门会话”区…

JSAR 基础 1.2.1 基础概念_空间小程序

JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明&#xff0c;官网之前的文档准备废除了&#xff0c;基于xsml的开发将退出历史舞台&#xff0c;three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…

Spring Security的作用

一、概述 Spring Security是一个框架&#xff0c;提供认证&#xff08;authentication&#xff09;、授权&#xff08;authorization&#xff09;和保护&#xff0c;以抵御常见攻击。对 常见漏洞 的保护提供了全面的支持&#xff0c;它对保护命令式和响应式应用程序有一流的支…

数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)

1. 算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 在计算机程序设计中&#xff0c;衡量算法优劣的核心标准是效率。但效率不仅指运行速度&#xff0c;还需要综合以下因素&#xff1a; 时间因素&#xff1a;算法执行所需时间 空间因素&#xff1a;算法运行占用的内存空间…