React(coderwhy)- 09(项目实战 - 1)

news2024/11/16 9:32:57

创建React项目

创建项目的方式:create-react-app
项目配置:
         配置项目的icon
         配置项目的标题
         配置jsconfig.json
新建jsconfig.json文件,在文件中粘贴以下内容
{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "baseUrl": "./",
    "moduleResolution": "node",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "jsx": "preserve",
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  }
}

通过craco配置别名和less文件:
在 create-react-app 中使用 - Ant Design
下载安装
npm install @craco/craco

在craco.config.js中粘贴如下代码:

const path = require('path')
const CracoLessPlugin = require('craco-less');

const resolve = pathname => path.resolve(__dirname, pathname)

module.exports = {
  // less
  plugins: [
    {
      plugin: CracoLessPlugin
    },
  ],
  // webpack
  webpack: {
    alias: {
      "@": resolve("src"),
      "components": resolve("src/components"),
      "utils": resolve("src/utils")
    }
  }
}

目录结构

 

 CSS样式的重置

对默认CSS样式进行重置:
         normalize.css
         reset.css

全家桶 – Router配置 

1. 新建router目录,并创建index.js:

  • 创建路由映射表
  • 做异步及重定向处理
import React from "react";
import { Navigate } from "react-router-dom";

const Home = React.lazy(() => import("@/views/home"))
const Entire = React.lazy(() => import("@/views/entire"))
const Detail = React.lazy(() => import("@/views/detail"))


const routes = [
    {
        path: '/',
        element: <Navigate to="/home" />
    },
    {
        path: '/home',
        element: <Home />
    },
    {
        path: '/entire',
        element: <Entire />
    }, {
        path: '/detail',
        element: <Detail />
    }
]

export default routes

2. 解决lazy 的问题

在入口 index.js 中从 react 引入Suspense 来解决lazy问题

import React, { Suspense } from 'react'
import ReactDOM from 'react-dom/client'
import { HashRouter as Router } from "react-router-dom";

import App from '@/App'
import "normalize.css"
import "@/assets/css/index.less"

// @ => src: webpack
// 问题: react脚手架隐藏webpack
// 解决一: npm run eject
// 解决二: craco => create-react-app config

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

3.在入口组件App.jsx中使用

  • 从react-router-dom中引入 useRoutes
  • 导入写好的路由映射表
  • 调用 useRoutes方法并传入路由映射表
import React, { memo } from 'react'
import { useRoutes } from "react-router-dom";
import routes from "@/router";


const App = memo(() => {
  return (
    <div className='app'>
      <header className='header'>header</header>
      <main className='page'>
        {useRoutes(routes)}
      </main>
      <footer className='footer'>footer</footer>
    </div>
  )
})

export default App

全家桶 – Redux状态管理 

Redux状态管理的选择:
         普通方式:目前项目中依然使用率非常高;
         @reduxjs/toolkit方式:推荐方式, 未来的趋势;

安装:

RTK 默认安装了 redux

npm install @reduxjs/toolkit react-redux

使用RTK创建store

  • 再store目录下的index.js文件引入RTK
  • 使用RTK提供的 configureStore来创建
  • 这里引入 homeReducer 和 entireReducer( 下面有说↓ )
import { configureStore } from "@reduxjs/toolkit";
import homeReducer from "./modules/home";
import entireReducer from "./modules/entire";

const store = configureStore({
    reducer: {
        home:homeReducer,
        entire:entireReducer
    }
})

export default store

再项目入口index.js中使用store

  • 使用react-redux中 提供的Provider组件
  • 引入上面写好的store
  • 再Provider组件上写 store={store}
import React, { Suspense } from 'react'
import ReactDOM from 'react-dom/client'
import { HashRouter as Router } from "react-router-dom";
import { Provider } from "react-redux";
import store from "@/store"

import App from '@/App'
import "normalize.css"
import "@/assets/css/index.less"


// @ => src: webpack
// 问题: react脚手架隐藏webpack
// 解决一: npm run eject
// 解决二: craco => create-react-app config

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <Provider store={store}>
        <Suspense fallback="loading ...">
            <Router>
                <App />
            </Router>
        </Suspense>
    </Provider>

);

reducer的创建:

1. homeReducer ( 使用RTK ):

  • HomeReducer 使用RTK 提供的切片 createSlice 来创建
  • 需要指定 name  initialState(初始值) reducers
  • 导出HomeSlice 下的 reducer
import { createSlice } from "@reduxjs/toolkit";


const homeSlice = createSlice({
    name: "home",
    initialState: {
       
    },
    reducers: {

    }
})

export default homeSlice.reducer

2. entireReducer ( 普通写法 )

目录结构:

在reducer.js中 定义recuder:

const initialState = {
   
}


function reducer(state = initialState, action) {
    switch (action.type) {


        default:
            return state
    }
}

export default reducer

 在index.js中引入并导出:

  • 这里导出的是reducer,所以可以在store目录下的index.js中可以
import reducer from "./reducer";

export default reducer

网络请求 - axios 

目录结构:

  • axios二次封装这里采用 class 类的写法
  • config.js中定义了 axios 的配置常量 ( 可往下看 )
  • 定义 get 和 post请求方法
  • 这里我加入了 进度条 ( 可不加 )

在request目录下的index.js中写如下代码:

import axios from "axios";
import { BASE_URL, TIMEOUT } from "./config";
import NProgress from "nprogress";


class HYrequest {
    constructor(baseURL, timeout) {
        this.instance = axios.create({
            baseURL,
            timeout
        })
        this.instance.interceptors.request.use(config => {
            NProgress.start()
            return config
        })
        this.instance.interceptors.response.use(res => {
            NProgress.done()
            return res.data
        }, err => {
            console.log(err);
            return Promise.reject(err)
        })

    }
    request(config) {
        return this.instance.request(config)
    }

    get(config){
        return this.request({...config,method:'get'})
    }

    post(config){
        return this.request({...config,method:'post'})
    }
}

export default new HYrequest(BASE_URL, TIMEOUT)

 在config.js中写以下代码:

export const BASE_URL = "http://codercba.com:1888/airbnb/api"
export const TIMEOUT = 10000

在外层index.js中引入 并导出:

import HYrequest from "./request/index";
export default HYrequest


在Home组件中尝试请求数据:

  • 注意: 这里可忽略,只是尝试请求数据,之后使用 redux 管理
import React, { memo, useEffect, useState } from 'react'
import hyRequest from "@/services";

const home = memo(() => {

  const [highScore, setHighScore] = useState({})

  useEffect(() => {
    hyRequest.get({ url: "/home/highscore" }).then(res => {
      setHighScore(res)
      console.log(res);

    })
  }, [])
  return (
    <div>
      <h2>{highScore.title}</h2>
      <h4>{highScore.subtitle}</h4>
      <ul>
        {highScore.list?.map(item => {
          return <li key={item.id}>{item.name}</li>
        })}
      </ul>

    </div>
  )
})

export default home

 

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

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

相关文章

【数据结构趣味多】循环队列

目录 函数介绍及模拟实现 Front()函数 Rear()函数 enQueue()函数 deQueue()函数 isEmpty()函数 isFull()函数 循环队列模拟题 定义&#xff1a;把队列的头尾相连接的的顺序存储结构称为循环队列&#xff1b;循环队列的是由顺序表实现的。 为什么要使用循环队列&#…

Android MVVM之SavedStateHandle数据保存之详解与使用。

一、介绍 SavedStateHandle从名字可以看出&#xff0c;是保存状态的。这个类常和MVVM中的ViewModel搭配使用&#xff0c;对页面生命周期的数据状态的缓存与恢复做一个容器。这个容易相对onSaveInstanceState(Bundle)要更强一点&#xff0c;保存的数据类型也比较丰富&#xff0c…

算法刷题打卡第60天:回文链表

回文链表 难度&#xff1a;简单 给定一个链表的 头节点 head &#xff0c;请判断其是否为回文链表。 如果一个链表是回文&#xff0c;那么链表节点序列从前往后看和从后往前看是相同的。 示例 1&#xff1a; 输入: head [1,2,3,3,2,1] 输出: true示例 2&#xff1a; 输入:…

文本摘要,基于Pytorch和Hugging Face Transformers构建示例,有源码

​ 文本摘要的常见问题和解决方法概述&#xff0c;以及使用Hugging Face Transformers库构建基于新浪微博数据集的文本摘要示例。 作 者丨程旭源 学习笔记 1 前言简介 文本摘要旨在将文本或文本集合转换为包含关键信息的简短文本。主流方法有两种类型&#xff0c;抽取式和生…

Nodejs模块的封装(数据库Mysql)

文章目录项目结构本次演示需要使用的第三方包为1.app.js相关配置2.router下的user.js相关配置3.db/index.js文件相关操作4.router_handler下的user.js相关操作项目结构 后面的项目相关文件的创建步骤按照我写的博客从上往下一步一步来 本次演示需要使用的第三方包为 "cor…

【操作系统实验/Golang】实验4:虚拟内存页面置换算法

目录 1 实验问题描述 2 测试数据 3 流程图 4 实验结果 4 实验代码 1 实验问题描述 设计程序模拟先进先出FIFO&#xff0c;最佳置换OPT和最近最久未使用LRU页面置换算法的工作过程。 假设内存中分配给每个进程的最小物理块数为m&#xff0c;在进程运行过程中要访问的页面个…

【Leetcode面试常见题目题解】1. 两数相加

题目描述 本文是leetcode第2题的题解&#xff0c;题目描述摘自leetcode。如下 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个…

海外服务器提供商选择中存在哪些风险?

开展海外业务时&#xff0c;毫无疑问&#xff0c;选择一个高质量的海外服务器提供商可以省去不少麻烦。但是&#xff0c;同时有一些海外服务商需要避开。毕竟一个服务器不靠谱&#xff0c;这跟提供商有很大的原因。下面主要是关于低于标准的海外服务器提供商的一些潜在风险。 1…

ES6中字符串和数组新增的方法

ES6中字符串和数组新增的方法一、字符串中新增的方法1、模板字符串 (表达式、函数的调用、变量)2、repeat(次数)函数 : 将目标字符串重复N次&#xff0c;返回一个新的字符串&#xff0c;不影响目标字符串3、includes()函数 :判断字符串中是否含有指定的子字符串&#xff0c;返回…

mysql 8 新旧密码可以同时生效

在MySQL8.0以前版本&#xff0c;给MySQL更改密码&#xff0c;明确写到开发规范中&#xff0c;拒绝更在线更改更密码&#xff0c;因为在8.0以前操作非常麻烦且不太完美。 MySQL 8.0之前的处理方法&#xff1a; 1. 创建一个同样权限的帐号通过 show grants for ‘user_name’1…

通用vue编辑按钮和新建按钮事件逻辑

一、编辑按钮对话框 1.首先先创建一个文件夹page-model&#xff0c;在里面使用elemengt-plus提供的对话框组件el-dialog。 2.在page-model里面去使用之前封装好的form表单&#xff0c;就是之前封装好的搜索组件的hy-form 3.在form组件里面加一个插槽&#xff0c;对应 page-m…

微信小程序:会议OA项目-首页

目录 一、flex布局 Flex布局简介 什么是flex布局&#xff1f; flex属性 flex的属性 二、轮播图组件及mockjs的使用 三、会议OA小程序首页布局 一、flex布局 Flex布局简介 布局的传统解决方案&#xff0c;基于盒状模型&#xff0c;依赖 display属性 position属性 float…

CompletableFuture详解

CompletableFuture详解 概要 RunnableThread虽然提供了多线程的能力但是没有返回值。CallableThread的方法提供多线程和返回值的能力但是在获取返回值的时候会阻塞主线程。 上述的情况只适合不关心返回值&#xff0c;只要提交的Task执行了就可以。另外的就是能够容忍等待。 C…

Java并发容器

一、并发容器总结1、大部分在 java.util.concurrent 包中。ConcurrentHashMap: 线程安全的HashMapCopyOnWriteArrayList: 线程安全的List&#xff0c;在读多写少的场合性能非常好&#xff0c;远远好于Vector.ConcurrentLinkedQueue: 高效的并发队列&#xff0c;使用链表实现。可…

[ 数据结构 ] 平衡二叉树(AVL)--------左旋、右旋、双旋

0 引出 数列{1,2,3,4,5,6}&#xff0c;要求创建一颗二叉排序树(BST), 并分析问题所在 回顾:二叉搜索树 左子树全部为空&#xff0c;从形式上看&#xff0c;更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥 BST的优势&#xff0c;因为每次还需要…

第四十二章 动态规划——数字三角形模型

第四十二章 动态规划——数字三角形模型一、数字三角形模型1、什么是数字三角形模型二、例题1、AcWing 1015. 摘花生&#xff08;1&#xff09;问题&#xff08;2&#xff09;思路状态表示状态转移循环设计初末状态&#xff08;3&#xff09;代码2、AcWing 1018. 最低通行费&am…

第二章:感知机

文章目录2.1感知机模型2.2感知机策略2.3梯度下降法2.4感知机-原始算法形式2.5感知机-原始算法实例2.6感知机-对偶形式2.7感知机-对偶形式实例2.8感知机算法收敛性证明如下&#xff1a;2.1感知机模型 2.2感知机策略 损失函数非负&#xff0c;策略是选择使其最小的模型参数 2.3梯…

【Linux工具】-gcc/g++

gcc/g一&#xff0c;简介二&#xff0c;代码的翻译过程1&#xff0c;预处理2&#xff0c;编译3&#xff0c;汇编4&#xff0c;链接&#xff08;1&#xff09;静态库&#xff08;2&#xff09;动态库&#xff08;3&#xff09;动静态库比较三&#xff0c;常见选项一&#xff0c;…

模板(C++)

模板&#xff08;C&#xff09;泛型编程函数模板概念格式原理实例化匹配原则类模板定义格式实例化泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int tmp left;left right;right tmp; }void Swap(double& left, doub…

【Spring6源码・IOC】BeanDefinition的加载

哎呀&#xff0c;又是午夜时分&#xff0c;又是一个失眠的夜晚&#xff0c;和去年一样&#xff0c;记得去年今日&#xff0c;也是睡不着觉&#xff0c;就注册了csdn的账号&#xff0c;开始写东西&#xff0c;csdn真是深夜最好的安魂剂。 Spring都发布了6.0&#xff0c;这不赶紧…