React基础之项目实战

devtools/2025/3/11 0:24:40/

规范的项目结构

安装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.ppmy.cn/devtools/166141.html

相关文章

【进程和线程】(面试高频考点)

【进程和线程】 前言 在计算机编程领域&#xff0c;并发编程是一项至关重要的技术&#xff0c;而进程和线程正是实现并发编程的核心概念。为了让大家更直观地理解并发编程的作用&#xff0c;我们先来看一个简单的生活例子。 想象一下&#xff0c;现在有一大份美味的饭菜&…

深度学习实战车辆目标跟踪与计数

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…

列表加上总价 自定义只计算某一列

在el-table上加上 将show-summary设置为true就会在表格尾部展示合计行。 使用summary-method并传入一个方法 <el-table:data"assetsDetailInfo.feedFormulaItems":cell-style"columnStyle":header-cell-style"headerStyle"show-summary:su…

vue3中插槽

具名插槽 vue2中会有这样用法&#xff1a; //父组件 <template><child-component><template slot"empty">这是 empty 插槽的内容</template></child-component> </template>slot“empty” 这个写法是 Vue 2 中的具名插槽语法&…

【网络安全工程】任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用&#xff1a;通过路由表进行数据的转发。 2、交换机的作用&#xff1a;通过学习和识别 MAC 地址&#xff0c;依据 M…

MyBatis-Plus 注解大全

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 MyBatis-Plus 注解大全 MyBatis-Plus 是基于 MyBatis 的增强工具&#xff0c;通过注解简化了单表 CRUD 操作和复杂查询的配置。以下是常用注解的分类及详细说…

Java中,BIO、NIO和AIO三种模型的区别和适用场景

在Java中&#xff0c;BIO&#xff08;同步阻塞IO&#xff09;、NIO&#xff08;同步非阻塞IO&#xff09;和AIO&#xff08;异步非阻塞IO&#xff09;是三种核心的I/O模型&#xff0c;它们在处理网络通信时有着不同的设计理念和适用场景。以下从核心特性、适用场景及联系三方面…

32.C++二叉树进阶1(二叉搜索树)

⭐上篇文章&#xff1a;31.C多态4&#xff08;静态多态&#xff0c;动态多态&#xff0c;虚函数表的存储位置&#xff09;-CSDN博客 ⭐本篇代码&#xff1a;c学习/18.二叉树进阶-二叉搜索树 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分…