React学习笔记(4.0)

news2024/10/1 13:54:35

json-server实现数据Mock

1.项目中安装json-server

npm i -D json-server

2.准备一个json文件

3.添加启动命令【package.json中配置】

"server":"json-server ./server/data.json --port 8888"

该命令中,路径就是自己创建的json文件路径,端口也可以自定义,不要写默认其他服务的保留端口即可。

4.进行接口访问

 

 React使用redux

React使用redux,官方要求安装两个插件--Redux Toolkit 和react-redux

命令如下:

npm i @reduxjs/toolkit react-redux

在项目中,一般都放在store文件夹中,对应的模块放入modules文件夹里,对应的目录结构如下

index.tsx文件内容

import {configureStore} from "@reduxjs/toolkit"
import counterReducer from "./modules/counterStore"
import channelReducer from "./modules/channelStore"
import foodsReducer from "./modules/takeaway"
const store=configureStore({
    reducer: {
        counter:counterReducer,
        channel:channelReducer,
        foods:foodsReducer
    },
    
})


export default store

 然后再对应的modules文件夹里书写具体配置内容

以counterStore举例

//第一步:调用@reduxjs/tookit的createSlice方法
import {createSlice} from '@reduxjs/tookit'

const counterStore=createSlice({
//给仓库起的名字
    name: 'counter',
//就是状态,类似与vux和pinia的State
    initialState: {
        count2:0
    },
//同步方法的书写都在这里
    //编写修改数据的方法 同步方法,支持直接修改
    reducers: {
        increment(state:any) {
            return state.count2 + 1;
        },
        decrement(state:any) {
            return state.count2 - 1;
        },
        addToNum(state:any,action:any){
            state.count=action.payload
        }
    }
})

//结构出来actionCreater函数
const { increment,decrement,addToNum}=counterStore.actions
//获取reducer
const reducer=counterStore.reducer

//导出对应的方法
export{ increment,decrement,addToNum}
//已默认导出的方式导出

export default reducer;

这里只有同步的代码,如果有异步的代码,需要借助dispatch()方法,

带有异步方法的channelStore

import {createSlice} from "@reduxjs/toolkit"

const channelStore=createSlice({
    name: "channel",
    //数据状态State
    initialState: {
        channelList: []
    },
    reducers: {
        //同步修改方法
        setChannels(state:any, action:any) {
            state.channelList = action.payload
        }
    }
})

//结构出actionCreater函数
const {setChannels}=channelStore.actions
//异步请求部分
const fetchChannelList=()=>{
    return async(dispatch:any)=>{
       const res=await axios.get('http://localhost:8080')
       dispatch(setChannels(res.data.data.channels))


    }
}

export {fetchChannelList}

const reducer=channelStore.reducer

export default reducer

此时还需要再主文件中进行注册,才能使用

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.tsx'
import {Provider} from 'react-redux'
import store from './store/index.tsx'
// import './index.css'

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <Provider store={store}>

    <App />
    </Provider>
  </StrictMode>,
)

来到组件中使用

import {useSelector,useDispatch} from 'react-redux'
//导入actionCreater
import {increment,decrement,addToNum} from './store/modules/counterStore'
import {fetchChannelList} from './store/modules/channelStore'

const App = () => {

  const {count2}=useSelector((state:any)=>state.counter)
  const {channelList}=useSelector((state:any)=>state.channel)
  const dispatch=useDispatch()
  //使用useEffect触发异步请求执行
  useEffect(()=>{
    dispatch(fetchChannelList())
  },[dispatch])
  let list=['1','2','3'];

  // for(let i=0;i<list.length;i++){
  //   list[i]=<li>{list[i]}</li>
  // }

  const myClass = ['box1', 'box2']

  const myClass2 = classNames({
    box1:true,
    box2:true,
    [style.box5]:true
  })

//useState实现一个计数器按钮
  const [count,setCount] = React.useState(0)
  const handleClick4=()=>{
    setCount(count+1)
    console.log('click',count);
  }
  const [form ,setForm]=useState({
    name:'mez',
    age:18
  })
  const handleClick5=()=>{
    setForm({
      ...form,
      name:'jack'
    })
  }
  // 1.声明一个React状态
  const [value,setValue]=useState('')
  //2.核心绑定流程
  //①通过value属性绑定React状态
  //②绑定onChange事件,通过事件参数e拿到输入框最新的值,反向修改到React状态
// const setValue=()=>{

// }

//dom生成之后才可用--useRef

const inputRef=useRef<HTMLInputElement>(null)
const showDom=()=>{
  console.log(inputRef.current);
  console.log(inputRef.current?.value);
  
}
//获取foodsList渲染数据列表
//useSelector
  return (
    <>
    <div>
      <div className={myClass.join(' ')}>App</div>
      <div style={{color:"purple",fontWeight:900}}>App2</div>
      <div className={myClass2}> hello world!</div>
      <button onClick={handleClick}>click me</button>
      <button onClick={handleClick2(123)}>click me2</button>
      <button onClick={(e)=>handleClick3(456,e)}>click me3</button>
      <input type="text" onChange={(e)=>handleChange(e,'jack')} placeholder='请输入内容' />
      {list.map((item,index) => <li key={index}>{item}</li>)}
      <Button></Button>
      <button onClick={handleClick4}>加一</button>
      <button onClick={handleClick5}>修改对象</button>
      <div>{count}--{form.name}</div>
      <div className={classNames('box3',{box2:1===1})}>我是使用classnames的文本</div>
      {/* <input type="text" 
      value={value}
      onChange={(e)=>setValue(e.target.value)}
      ref={inputRef}/> */}
      <input type="text" 
      value={value}
      onChange={(e)=>setValue(e.target.value)}
      ref={inputRef}/>
      <button onClick={showDom}>获取dom</button>
    </div>
    <div>{count2}</div>
    <button onClick={()=>dispatch(decrement())}>-</button>
    <button onClick={()=>dispatch(increment())}>+</button>
    <button onClick={()=>dispatch(addToNum(10))}>add to 10</button>
    <ul>
      {channelList.map((item:any)=><li key={item.id}>{item.name}</li>)}
    </ul>
    
    </>
  )
}

export default App

汇总

 

使用CRA初始化项目环境

npx create-react-app projectName

 运行项目:npm run start【不同的构建工具使用的命令也有所不同,具体可以看到package.json对应的脚本启动命令】

 

 常用的目录结构及其作用

 

 使用gitee管理项目

1.在gitee上初始化一个空项目仓库

按照它的提示进行仓库初始化

  

2.把远程仓库与本地仓库关联

这时候会有一个认证,需要验证你的gitee用户名和密码,输入正确就可以,要是输入错误下一次还是走这个错误的认证,需要在本机去删除那个认证标识,具体方法可以度娘。【最好还是一次成功,这样省去麻烦】 

3.提交代码到远程仓库

然后我们将自己创建的文件copy到这个初始化的文件夹中就行,默认刚才哪些代码就生成了一个MD文件,其他啥都没有

下面就是git命令了

git add .

 git commit -m "内容"

 git push -u origin "master"  提交到master分支

来到gitee页面

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

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

相关文章

【C++】BitSet和Bloom_Filter

前言&#xff1a; 在计算机图形学中&#xff0c;位图&#xff08;Bitmap&#xff09;也称为光栅图&#xff0c;是由像素点组成的图像表示方式。在 C 编程中&#xff0c;位图可以通过特定的函数和数据结构来进行处理和操作。 BitMap 位图&#xff08;BitMap&#xff09;是一种数…

uniapp中uni.request的统一封装 (ts版)

文章目录 前言一、我们为什么要去封装&#xff1f;二、具体实现1.创建一个请求封装文件&#xff1a;2.封装 uni.request&#xff1a;3.如何去使用&#xff1f; 总结 前言 在uniapp中如何去更简洁高效的发送我们的请求&#xff0c;下面就介绍了uni.request()二次封装。 一、我们…

超强大的 Nginx 可视化管理工具

今天给大家介绍一款 Nginx 可视化管理界面&#xff0c;非常好用&#xff0c;小白也能立马上手。 nginx-proxy-manager 是一个反向代理管理系统&#xff0c;它基于 NGINX&#xff0c;具有漂亮干净的 Web UI。还可以获得受信任的 SSL 证书&#xff0c;并通过单独的配置、自定义和…

【计算机视觉】ch1-Introduction

相机模型与成像 1. 世界坐标系 (World Coordinate System) 世界坐标系是指物体在真实世界中的位置和方向的表示方式。在计算机视觉和图像处理领域&#xff0c;世界坐标系通常是一个全局坐标系统&#xff0c;描述了摄像机拍摄到的物体在实际三维空间中的位置。它是所有其他坐标…

【嵌入式开发】可编程4k蓝牙摄像头点击器

今天讲解的是一款可编程摄像头蓝牙点击器&#xff0c;支持离线文字识别 外观如下 B站有使用视频 链接: B站使用 下面是具体使用步骤&#xff08;主要根据B站视频使用流程总结&#xff09;&#xff0c;文末附源码 全是干货 执行main代码 代码运行后&#xff0c;检查摄像头…

【电机-概述及分类】

文章目录 第1章1-1 电机的定义1-2 电机的构成要素1-3 电机的分类1-3-1 直流电机1-3-1-1 永磁励磁型直流电机1-3-1-2 电磁铁励磁型直流电机 第1章 重新认识电机的体系 电机包括许多种类。换个角度来看&#xff0c;并没有完美的电机&#xff0c;某种电机具有所谓A的优点&#xf…

docker 搭建minimalist-web-notepad

亲测可用 服务器 ubuntu sudo mkdir -p /root/docker/note# 切换到rootsu -chmod -R 755 /root/docker/notedocker pull carlosa/minimalist-web-notepad# 容器端口80 映射到 服务器7001端口&#xff0c;记得开防火墙 docker run -d --name notepad --restart always -p 7001…

u盘格式化后数据能恢复吗?2024年Top4恢复神器来帮忙

在这个电脑和手机满天飞的时代&#xff0c;U盘是我们用来存东西和传文件的得力助手&#xff0c;特别重要。但是&#xff0c;有时候U盘可能会不小心被格式化了&#xff0c;里面的重要文件就不见了。那么&#xff0c;U盘格式化后的数据还能恢复吗&#xff1f;当然可以。今天会告诉…

揭秘一下平时我们下载的python库跑到哪里了呢???

&#xff08;阅读之前&#xff0c;祝福大家国庆假期快乐&#xff0c;以及真诚的祝福我们的祖国越来越强大&#xff09;在那天的课上&#xff0c;老师问了我们这样一个问题&#xff1a;你们知道你们平时pip install下载库&#xff0c;下载好了&#xff0c;你们的库是下载到哪里了…

智邦国际ERP系统存在SQL注入漏洞

漏洞描述 智邦国际ERP系统是一款全面的企业资源规划工具&#xff0c;其主要目标是协助组织实现业务流程自动化和提升效率。此系统具备多种功能模块&#xff0c;包括但不限于财务管理、采办管理、销售操作、库存控制和生产过程管理&#xff0c;都能够满足企业多元化的业务需求。…

Ubuntu Server 20.04 64bit定时备份MySQL8.0.36数据库数据

一、编写sh脚本 常见备份命令介绍 我选用的是mysqldump命令&#xff0c;命令使用简介 [root]> mysqldump -helpUsage: mysqldump [OPTIONS] database_name [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all…

朝天椒USB Server为赛力斯集团解决网银U盾难题

近期&#xff0c;赛力斯集团的财务部门引进了朝天椒USB Server&#xff0c;用几台USB服务器解决了集团困扰多年的银行U盾管理难题。 一、背景 赛力斯集团是一家以新能源汽车为核心业务的科技制造企业&#xff0c;A股上市公司&#xff0c;中国企业500强。赛力斯集团作为一家大型…

基于JAVA+SpringBoot+Vue的电商平台的设计与实现

基于JAVASpringBootVue的电商平台的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345…

如何利用 StarRocks 加速 Iceberg 数据湖的查询效率

数据湖作为一种存储各种类型数据的集中式存储系统&#xff0c;以其灵活性、可扩展性和低成本的优势受到越来越多企业的青睐。然而&#xff0c;数据湖虽然降低了数据存储成本&#xff0c;但在数据分析尤其是实时数据分析场景下&#xff0c;其性能仍存在一定瓶颈。 本文将探讨如何…

Linux shell编程学习笔记84:tee命令——显示保存两不误

0 引言 在前面的学习笔记中&#xff0c;我们经常使用echo命令和输出重定向来生成脚本文件或演示文件&#xff0c;其实Linux提供了一个可以从标准输入读取数据&#xff0c;并输出成文件的命令——tee。 1 tee命令 的帮助信息、功能、命令格式、选项和参数说明 1.1 tee命令 的…

攻防世界---->crazy

做题笔记&#xff1a; 草&#xff0c;不要怀疑自己。 下载 查壳。 64ida打开。 先运行一下程序&#xff1a; 先解决第一个问题 ——是不是输入的长度为32。 tips&#xff1a;这题加载了混淆函数等 ida 反正我跳不过去&#xff0c;pwndbg我用的不是很熟悉。 不过没关系 直接跑…

数据库基础03

文章目录 一、DCL语句1.1 管理用户1.2 权限控制 二、函数2.1 字符串函数2.2 数值函数2.3 日期函数3.4 流程函数 三、约束3.1 概述3.2 约束演示3.3 外键约束3.3.1 外键的基本语法3.3.2 删除/更新行为 一、DCL语句 DCL英文全称是Data Control Language(数据控制语言)&#xff0c;…

Wooey:将 Python 脚本转化为 Web 应用的简易解决方案

Wooey 是一个开源的 Python 项目&#xff0c;旨在帮助开发者快速将 Python 脚本转化为用户友好的 Web 应用程序。通过 Wooey&#xff0c;开发者无需编写复杂的前端代码即可轻松为 Python 脚本创建基于网页的图形用户界面&#xff08;GUI&#xff09;。这使得 Wooey 成为处理数据…

小阿轩yx-案例:项目发布基础

小阿轩yx-案例&#xff1a;项目发布基础 前言 随着软件开发需求及复杂度的不断提高&#xff0c;团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作&#xff0c;工具集…

【Python报错已解决】 Running setup.py install for wxPython did not run successfully.

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…