React基础之项目实战

规范的项目结构

安装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.rhkb.cn/news/32327.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第44天:WEB攻防-PHP应用SQL盲注布尔回显延时判断报错处理增删改查方式

时间轴&#xff1a; 44天知识点总结&#xff1a; 1.mysql的增删改查功能 2.根据源码sql语句的三种sql注入&#xff1a;布尔盲注&#xff08;必须要有回显&#xff09; 延时判断&#xff08;都可以&#xff09; 报错回显&#xff08;必须要有报错处理机制&#xff09; 3.两个cms…

【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…

Vue3 深度解析:构建现代Web应用的全新范式

Vue3 深度解析&#xff1a;构建现代Web应用的全新范式 mindmaproot(Vue3核心革新)性能优化Proxy响应式编译优化体积缩减Composition APIsetup语法逻辑复用TypeScript支持新特性TeleportSuspense片段支持工程化Vite集成自定义渲染器服务端渲染一、Vue3 架构革新&#xff1a;从O…

推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet

引言 随着大型语言模型&#xff08;LLMs&#xff09;在技术领域的应用日益广泛&#xff0c;评估这些模型在特定技术任务上的能力变得越来越重要。本研究聚焦于四款领先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解与分析方面的能力&#xff0c;…

cesium安装与配置(visual studio版)

文章目录 一、下载Cesium二、解压Cesium三、VS打开网站四、参考文献 如有错误&#xff0c;请指正&#xff01;&#xff01;&#xff01; 一、下载Cesium 登录官网&#xff0c;下载Cesium。 点击箭头所指&#xff0c;下载Cesium 二、解压Cesium 解压Cesium压缩包得到以下文件…

Netty基础—3.基础网络协议二

大纲 1.网络基础的相关问题总结 2.七层模型和四层模型 3.物理层(网线 光缆 01电信号) 4.数据链路层(以太网协议 网卡mac地址) 5.网络层(IP协议 子网划分 路由器) 6.传输层(TCP和UDP协议 Socket 端口) 7.应用层(HTTP协议 SMTP协议) 8.浏览器请求一个域名会发生什…

Linux:Ubuntu server 24.02 上搭建 ollama + dify

一、安装Ubuntu 具体的安装过程可以参见此链接&#xff1a;链接&#xff1a;Ubuntu Server 20.04详细安装教程&#xff0c;这里主要记录一下过程中遇到的问题。 安装时subnet如何填写 在Ubuntu中subnet填写255.255.255.0是错误的&#xff0c;其格式为 xx.xx.xx.xx/yy &#…

算法练习——双指针算法(更新中)

一、介绍双指针算法 双指针&#xff08;或称为双索引&#xff09;算法是一种高效的算法技巧&#xff0c;常用于处理数组或链表等线性数据结构。它通过使用两个指针来遍历数据&#xff0c;从而减少时间复杂度&#xff0c;避免使用嵌套循环。双指针算法在解决诸如查找、排序、去重…

stm32week6

stm32学习 三.通信 5.硬件读取I2C 硬件读取I2C的代码(main.c与软件读取相同)&#xff1a; #include "stm32f10x.h" // Device header #include "MPU6050_Reg.h"#define MPU6050_ADDRESS 0xD0 //MPU6050的I2C从机地址/*** 函 数&…

qt+opengl 播放yuv视频

一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

文本对抗样本系列的论文阅读笔记(整理合订)

文本对抗样本系列的论文阅读笔记 以前调研文本对抗样本时的论文笔记梳理&#xff0c;论文都很经典&#xff0c;有现成的框架&#xff08;TextAttack&#xff09;可以直接用&#xff0c;论文中部分内容直接是截取自论文&#xff0c;所以存在中英混合笔记的情况。 BERT-Attack …

相对与绝对路径的关系

首先&#xff0c;我们一起来了解相对路径和绝对路径的概念&#xff1a; 相对路径&#xff1a;相对于当前工作目录的路径&#xff0c;不以 / 开头&#xff0c;以一个 ""、./、../、。例如&#xff1a;nginx、./nginx 或 ../nginx绝对路径&#xff1a;从根目录 / 开始…

java项目之基于ssm的在线学习系统(源码+文档)

项目简介 在线学习系统实现了以下功能&#xff1a; 该系统可以实现论坛管理&#xff0c;通知信息管理&#xff0c;学生管理&#xff0c;回答管理&#xff0c;教师管理&#xff0c;教案管理&#xff0c;公告信息管理&#xff0c;作业管理等功能。 &#x1f495;&#x1f495;作…

位运算刷题+总结

文章目录 判定字符是否唯一题解代码 丢失的数字题解代码 两整数之和题解代码 只出现一次的数字 II题解代码 消失的两个数字题解代码 总结 判定字符是否唯一 题目链接 题解 1. 哈希表&#xff0c;创建26个空间大小的哈希表 2. 位图&#xff0c;小写字符只有26个&#xff0c;…

Qt表格美化笔记

介绍 表格是一种常见的数据管理界面形式&#xff0c;在大批量的数据交互情形下使用的比较多 表格 可以通过样式表设置线条以及边框的颜色 QTableWidget { gridline-color : rgb(55, 60, 62); border: 1px solid rgb(62,112,181);}表头 如果表头和第一行的分割线显示&#…

【Godot4.2】Vector2向量插值的应用

求线段的等分点 extends Node2Dvar pos:Vector2 var split_num:int var p1 Vector2(200,200) var p2 Vector2(100,100)func _input(event: InputEvent) -> void:if event is InputEventMouseButton:if event.button_index MOUSE_BUTTON_WHEEL_DOWN:split_num clamp(spl…

Git使用(二)--如何配置 GitHub 远程仓库及本地 Git 环境

在日常的开发过程中&#xff0c;使用版本控制工具 Git 是一个非常重要的技能&#xff0c;特别是对于管理和协作开发。通过 GitHub&#xff0c;我们可以轻松地进行代码版本管理和共享。这篇博客将带您一步步学习如何配置 Git 环境并将本地仓库与 GitHub 远程仓库连接起来。 一、…

【算法工具】HDL: 基于摘要统计数据的高维连锁不平衡分析软件

## 前言 在基因组研究中&#xff0c;连锁不平衡(Linkage Disequilibrium, LD)分析是理解遗传变异之间关联的关键步骤。然而&#xff0c;当面对高维数据时&#xff0c;传统分析方法往往面临巨大计算挑战。今天为大家介绍一款强大的工具——HDL (High-Dimensional Linkage diseq…

MongoDB副本集部署完整教程

一般而言&#xff0c;副本集主要成员有三个&#xff1a;主节点&#xff0c;副本节点&#xff0c;仲裁节点 按照官方推荐方案&#xff0c;我们搭建一个三成员的副本集&#xff0c;这个副本集由一个主结点和两个副本结点组成。 这里采用三台虚拟机进行部署&#xff1a;node1(主节…

springcloud gateway通过数据库获取路由信息

在 Spring Cloud Gateway 中结合 MyBatis 动态从数据库加载路由配置&#xff0c;可以实现灵活的路由管理。以下是详细实现步骤&#xff1a; 1. 数据库表设计 创建路由配置表 gateway_route&#xff1a; CREATE TABLE gateway_route (id varchar(50) NOT NULL COMMENT 路由唯一…