react入门到实战-day2-7.21
昨天晚上刚学完已经一点了,来不及写笔记,主要是想睡觉哈,所以今天补上,我发现效率还挺高的,今天重新做笔记,加固了昨天的知识点,要不以后都这样子哈,学完第二天再写哈,要是大家有推荐的vue项目练手可不可以分享给我,跪求
React表单控制
受控绑定
概念:使用React组件的状态(useState)控制表单的状态

受控表单:
第一步:声明一个react状态--useState
第二步:通过value属性绑定react状态
第三步:绑定onChange事件,通过事件参数e拿到输入框的最新值,反向修改到react状态中
import {useState} from 'react'
function App(){const [value, setValue] = useState('')return (<input type="text" value={value} onChange={e => setValue(e.target.value)}/>)
}
非受控绑定
概念:通过获取DOM的方式获取表单的输入数据
react 获取dom
第一步:useRef生成ref对象,绑定到dom标签上
第二步:dom可用时(渲染完毕之后dom生成之后才可用),ref.current获取dom
import {useRef} from 'react'
function App(){const inputRef = useRef(null)const onChange = ()=>{console.log(inputRef.current.value)}return (<input type="text" ref={inputRef}onChange={onChange}/>)
}
React组件通信
概念:组件通信就是组件之间的数据传递, 根据组件嵌套关系的不同,有不同的通信手段和方法
父子通信-父传子
实现步骤
-
父组件传递数据 - 在子组件标签上绑定属性
-
子组件接收数据 - 子组件通过props参数接收数据
-
props:对象里面包含了父组件的传递过来的所有数据
function Son(props){return <div>{ props.v }</div>
}function App(){const name = 'this is app name'return (<div><Son v={name}/></div>)
}
props说明
props可以传递任意的合法数据,比如数字、字符串、布尔值、数组、对象、函数、JSX
props是只读对象子组件只能读取props中的数据,不能直接进行修改, 父组件的数据只能由父组件修改

父传子 - 特殊的prop children
当我们把内容嵌套在组件的标签内部时,组件会自动在名为children的prop属性中接收该内容


父子通信-子传父
核心思路:在子组件中调用父组件中的函数并传递参数
首先给子组件标签传递一个父组件中的函数,传过去之后子组件接收,在子组件通过某些事件调用起来,同时把自己的数据当作实参,传给父组件,父组件中的函数写一个形参接收
function Son({ onGetMsg }){const sonMsg = 'this is son msg'return (<div>{/* 在子组件中执行父组件传递过来的函数 */}<button onClick={()=>onGetMsg(sonMsg)}>send</button></div>)
}function App(){
//加一个状态数据
const {value,setSa}=useState('')const getMsg = (msg)=>{console.log(msg)setSa(msg)}return (<div>{/* 传递父组件中的函数到子组件 */}<Son onGetMsg={ getMsg }/>{msg}</div>)
}
兄弟组件通信
实现思路: 借助 状态提升 机制,通过共同的父组件进行兄弟之间的数据传递
-
A组件先通过子传父的方式把数据传递给父组件App
-
App拿到数据之后通过父传子的方式再传递给B组件
// A->App
import { useState } from "react"function A({ i }) {const n = 'this A'return (<div>this is A compnent,<button onClick={() => i(n)}>123</button></div>)
}function B() {return (<div>this is B compnent,</div>)
}function App() {const [name, setAa] = useStateconst getAname = (name) => {setAa(name)console.log(name);}return (<div>this is App<A i={getAname}></A></div>)
}export default App
// A->App App->B
import { useState } from "react"function A({ i }) {const n = 'this A'return (<div>this is A compnent,<button onClick={() => i(n)}>123</button></div>)
}// 解构出来的x
function B({ x }) {return (<div>this is B compnent,{x}</div>)
}function App() {// 要想把a的数据传给B,则app要准备一个数据用来接受a传过来的数据,
//并且希望b可以动态的显示这个数据,则需要状态变量const [name, setAa] = useState('')const getAname = (name) => {console.log(name);setAa(name)}return (<div>this is App<A i={getAname}></A><B x={name}></B></div>)
}export default App
跨层组件通信
实现步骤:
-
使用
createContext方法创建一个上下文对象Ctx -
在顶层组件(App)中通过
Ctx.Provider组件提供数据 -
在底层组件(B)中通过
useContext钩子函数获取消费数据
//App->A->Bimport { createContext, useContext } from "react"// 1. createContext方法创建一个上下文对象
const Asdf = createContext()function A() {return (<div>this is A compnent,<B></B></div>)
}function B() {
// 3. 在底层组件 通过useContext钩子函数使用数据const qwe = useContext(Asdf)return (<div>this is B compnent,{qwe}</div>)
}function App() {const qwe = 'this App'return (<div>{/* 2. 在顶层组件 通过Provider组件提供数据 */}<Asdf.Provider value={qwe}>this is App<A></A></Asdf.Provider></div>)
}export default App
React副作用管理-useEffect
概念理解
useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作(副作用), 比如发送AJAX请求,更改DOM等等

说明:
-
参数1是一个函数,可以把它叫做副作用函数,在函数内部可以放置要执行的操作
-
参数2是一个数组(可选参),在数组里放置依赖项,不同依赖项会影响第一个参数函数的执行,当是一个空数组的时候,副作用函数只会在组件渲染完毕之后执行一次
import { useEffect, useState } from 'react'const URL = 'http://geek.itheima.net/v1_0/channels'function App() {// 之后才创建一个状态const [list, setSt] = useState([])useEffect(() => {async function getL() {const res = await fetch(URL)const i = await res.json()console.log(i);setSt(i.data.channels)}getL()}, [])return (<div>this is app<ul>{list.map(item => <li key={item.id}>{item.name}</li>)}</ul></div>)
}export default App
useEffect依赖说明
useEffect副作用函数的执行时机存在多种情况,根据传入依赖项的不同,会有不同的执行表现
| 依赖项 | 副作用功函数的执行时机 |
|---|---|
| 没有依赖项 | 组件初始渲染 + 组件更新时执行 |
| 空数组依赖 | 只在初始渲染时执行一次 |
| 添加特定依赖项 | 组件初始渲染 + 依赖项变化时执行 |
import { useEffect, useState } from 'react'function App() {const [count, setCount] = useState(0)//useEffect(() => {// console.log('fu');//})// useEffect(() => {// console.log('fu');// }, [])useEffect(() => {console.log('fu');}, [count])return (<div>this is app<button onClick={() => setCount(count + 1)}>++{count}</button></div>)
}export default App
清除副作用
概念:在useEffect中编写的由渲染本身引起的对接组件外部的操作,社区也经常把它叫做副作用操作,比如在useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器再清理掉,这个过程就是清理副作用
说明:清除副作用的函数最常见的执行时机是在组件卸载时自动执行
import { useEffect, useState } from "react"function Son () {// 1. 渲染时开启一个定时器useEffect(() => {const timer = setInterval(() => {console.log('定时器执行中...')}, 1000)return () => {// 清除副作用(组件卸载时)clearInterval(timer)}}, [])return <div>this is son</div>
}function App () {// 通过条件渲染模拟组件卸载const [show, setShow] = useState(true)return (<div>{show && <Son />}<button onClick={() => setShow(false)}>卸载Son组件</button></div>)
}export default App
自定义Hook实现
概念:自定义Hook是以 use打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用
import { useEffect, useState } from 'react'function App() {const [show, setShow] = useState(true)const v = () => setShow(!show)return (<div>{show && <div>显示与隐藏</div>}<button onClick={v} >asd</button></div>)
}export default App
封装自定义hook通用思路
1. 声明一个以use打头的函数
2. 在函数体内封装可复用的逻辑(只要是可复用的逻辑)
3. 把组件中用到的状态或者回调return出去(以对象或者数组)
4. 在哪个组件中要用到这个逻辑,就执行这个函数,解构出来状态和回调进行使用
import { useEffect, useState } from 'react'// 封装自定义Hook// 问题: 布尔切换的逻辑 当前组件耦合在一起的 不方便复用// 解决思路: 自定义hookfunction useToggle() {// 可复用的逻辑代码const [show, setShow] = useState(true)const v = () => setShow(!show)// 哪些状态和回调函数需要在其他组件中使用 returnreturn { show, v }}function App() {const { show, v } = useToggle()return (<div>{show && <div>显示与隐藏</div>}<button onClick={v} >asd</button></div>)
}export default App
React Hooks使用规则
-
只能在组件中或者其他自定义Hook函数中调用
-
只能在组件的顶层调用,不能嵌套在if、for、其它的函数中

相关文章:
react入门到实战-day2-7.21
昨天晚上刚学完已经一点了,来不及写笔记,主要是想睡觉哈,所以今天补上,我发现效率还挺高的,今天重新做笔记,加固了昨天的知识点,要不以后都这样子哈,学完第二天再写哈,要…...
Springboot集成Elasticsearch High Level REST Client实现增删改查实战
获取源码🚩 需要完整代码资料,请一键三连后评论区留下邮箱,安排发送!!!🤖 什么是High Level REST Client? Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch…...
2023河南萌新联赛第(二)场 南阳理工学院
A. 国际旅行Ⅰ 题目: 思路: 因为题意上每个国家可以相互到达,所以只需要排序,输出第k小的值就可以了。 AC代码: #include<bits/stdc.h> #define int long long #define IOS ios::sync_with_stdio(0);cin.tie…...
使用Docker Compose给自己上传的JAR打包成镜像并自动启动容器
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过编写一个docker-compose.yml文件,可以简化Docker容器的管理。本文将介绍如何使用Docker Compose将一个上传的JAR文件打包成Docker镜像,并在容器中自动启动该应用程序。 一、准备工作…...
NET8部署Kestrel服务HTTPS深入解读TLS协议之Certificate证书
Certificate证书 Certificate称为数字证书。数字证书是一种证明身份的电子凭证,它包含一个公钥和一些身份信息,用于验证数字签名和加密通信。数字证书在网络通信、电子签名、认证授权等场景中都有广泛应用。其特征如下: 由权威机构颁发&…...
DML数据库的数据类型
DML 用于改变数据表中的数据的操作语言。 包括INSERT(将数据插入到数据表中),UPDATE(更新表中已经存在的数据),DELETE(删除表中已经存在的数据) INSERT 用法 INSERT INTO 表名(字段1&#x…...
@RequestParam和@PathVariable 处理 HTTP 请求参数的注解
RequestParam 请求参数 可解析前端get请求路径后以问号拼接的参数,查询参数是 URL 后面的问号 (?) 后跟的一系列键值对,RequestParam 可以设置参数是否是必需的(使用 required 属性) GetMapping("/users") public String getUsers(RequestPar…...
《代码大全》读书笔记-第Ⅰ部分 奠定基础
0.欢迎来到软件构建世界 什么是软件构件: 对于非正式及项目,会觉得罗列出来的这些活动太过于繁复。但是这些对于正式项目都是很有必要的(大部分人都没经历过,比如说我)。一般一些小公司主要也就是需求分析、编码、开发人员自测、集成测试这几…...
杰发科技Bootloader(1)—— Keil配置地址
IAP方式 BootLoader方式 UDSBoot方式 AC7801的地址分配 用户空间的的地址从8000000开始分配,大小是64页,即128K。 RAM地址从20000000开始 基于UDSboot调试-Boot 烧录Boot之后,ATClinkTool无法连接 用keil查看内存,地址到8005388…...
338. 比特位计数
338. 比特位计数 题目链接:338. 比特位计数 代码如下: class Solution { public:vector<int> countBits(int n) {vector<int> res(n 1, 0);for (int i 1; i < n; i){if (i % 2 1) { res[i] res[i - 1] 1; }else { res[i] res[i …...
flask后端+vue前端——后端怎么发文件给前端?
首先,前端axios请求的responseType要设置为blob const service axios.create({baseURL: http://127.0.0.1/api,timeout: 5000});//向后端发送数据,后端根据这个数据data生成文件返回send_coordinate(data){return service.post(/,data,{responseType: …...
计算机毕业设计django+hadoop+scrapy租房可视化 租房推荐系统 租房大屏可视化 租房爬虫 spark 58同城租房爬虫 房源推荐系统
python scrapy bootstrap jquery css javascript html 租房信息数据展示 租房地址数量分布 租房类型统计 租房价格统计分析 租房面积分析 房屋朝向分析 房屋户型平均价格统计分析 房屋楼层统计分析 房屋楼层与价格统计分析 房屋地址与价格统计分析 房屋相关信息词云展示 租房…...
【Tomcat】Mac M3 Pro安装Tomcat7
文章目录 下载配置环境变量修改权限启动和关闭 下载 官网:https://tomcat.apache.org/ cd ~/Library tar -zxvf /Users/用户名/Downloads/apache-tomcat-7.0.99.tar.gz mv apache-tomcat-7.0.99 ~/Library/tomcat配置环境变量 vi ~/.bash_profileexport TOMCAT…...
Spring Boot(八十二):SpringBoot通过rsa实现API加密
项目中使用RSA加密方式对API接口返回的数据加密,让API数据更加安全。别人无法对提供的数据进行破解。Spring Boot接口加密,可以对返回值、参数值通过注解的方式自动加解密 。 下面开始代码演示 1 接口加密 1.1 新建一个springboot项目 1.2 添加依赖 <dependency>&l…...
巴黎奥运启幕 PLM系统助力中国制造闪耀全球
2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外,还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相,成为赛场上另一道亮丽的风景线。 在新时代的浪潮中,中国制造业坚…...
基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令
本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …...
【JavaScript】01数组原型对象的最后一个元素、计数器
题目一:数组原型对象的最后一个元素 请你编写一段代码实现一个数组方法,使任何数组都可以调用 array.last() 方法,这个方法将返回数组最后一个元素。如果数组中没有元素,则返回 -1 。 你可以假设数组是 JSON.parse 的输出结果。…...
解决R语言找不到系统库导致的报错
1、基本需知 1.1、系统库 系统库(System library)是一组预先编写和编译好的软件模块集合,用于支持操作系统的基本功能和提供一些常见的服务。这些库通常由操作系统或第三方开发者提供,并且在系统安装过程中被预装或者用户可以额…...
Java高并发理论基础
并发级别 由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把并发的级别分为 阻塞、无饥饿、无障碍、无锁、无等待 几种。 阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执…...
Spring事件机制
文章目录 一、Spring事件二、实现Spring事件1、自定义事件2、事件监听器2.1 实现ApplicationListener接口2.2 EventListener2.3 TransactionalEventListener 3、事件发布4、异步使用 三、EventBus1、事件模式2、EventBus三要素3、同步事件3.1 定义事件类3.2 定义事件监听3.3 测…...
嵌入式软件工程师面试技术要点解析
嵌入式软件工程师面试技术要点解析1. 通信接口技术1.1 RS-485通信特性RS-485标准采用差分信号传输,物理层上支持全双工通信,但在实际应用中通常配置为半双工模式。这种设计选择主要基于以下工程考虑:半双工模式下只需一对双绞线,显…...
百度网盘提取码智能获取工具:提升资源访问效率的技术方案
百度网盘提取码智能获取工具:提升资源访问效率的技术方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 核心价值:重新定义资源访问效率 🚀 在信息快速流转的今天,获取网络资源…...
清华学位论文高效排版:thuthesis模板全场景应用指南
清华学位论文高效排版:thuthesis模板全场景应用指南 【免费下载链接】thuthesis LaTeX Thesis Template for Tsinghua University 项目地址: https://gitcode.com/gh_mirrors/th/thuthesis 在学术写作中,格式规范与内容质量同等重要。thuthesis作…...
Markdown Viewer浏览器扩展完全指南:从安装到高级配置
Markdown Viewer浏览器扩展完全指南:从安装到高级配置 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer Markdown Viewer是一款功能丰富的浏览器扩展,专为提…...
2026年主流接口测试平台慢因分析与选型参考
2026年主流接口测试平台慢因分析与选型参考 核心观点摘要 2026年接口测试响应慢核心诱因可归为三类:工具本身并发调度能力不足、协议适配不全导致额外转码开销、缺少AI智能链路优化能力,多数企业接口测试效率低与工具选型不当直接相关。本次盘点覆盖当前…...
别再乱用.pem和.key了!用ASN.1 Editor手把手拆解RSA私钥的PKCS#8格式(附OpenSSL 3.1验证)
从文件后缀到密钥本质:用ASN.1 Editor透视RSA私钥的PKCS#8结构 当你在终端输入openssl genpkey -algorithm RSA生成密钥对时,是否曾好奇过.pem文件里那些看似随机的字符究竟隐藏着什么秘密?面对invalid key format的错误提示,又是…...
实战数据可视化:基于快马平台构建小龙虾销售趋势分析看板
实战数据可视化:基于快马平台构建小龙虾销售趋势分析看板 最近帮朋友的小龙虾连锁店做数据分析,发现传统Excel报表根本满足不了实时决策的需求。老板们需要一眼就能看懂销售趋势、口味偏好和地区差异,于是我尝试用InsCode(快马)平台快速搭建…...
OpenClaw 小龙虾Windows10 专属一键部署教程|10 分钟搞定本地 AI 数字员工
适配系统:Windows10 64 位(纯小白友好版) 核心优势:免命令行、免环境配置、解压即装,内置所有运行依赖,全程可视化操作,新手也能一次成功部署 2026 爆火的开源 AI 智能体! 本文专属…...
AI赋能安装流程:快马智能诊断工具,自动解决软件安装兼容性问题
在开发软件的过程中,安装环节往往是第一个拦路虎。特别是当遇到系统环境复杂、依赖库版本冲突、权限配置等问题时,传统的安装方式常常让人头疼不已。最近我在尝试开发一个智能安装问题诊断工具时,发现InsCode(快马)平台的AI辅助功能特别实用&…...
Matlab 2024b 新变化:手把手教你搞定TI C2000代码生成环境(含CCS避坑指南)
Matlab 2024b与TI C2000代码生成环境配置全指南:从版本差异到实战避坑 如果你是一位长期使用Matlab进行TI C2000系列芯片开发的嵌入式工程师,升级到2024b版本后可能会发现:熟悉的配置界面不见了,命令行里输入的命令也不一样了。这…...
