React初学分享 事件绑定 组价通信 useState useEffect

React初学

  • React介绍
  • 快速搭建React项目
  • JSX
    • JSX的本质
    • 优势:
    • JSX中使用JS表达式
    • JSX中的列表渲染
    • JSX实现简单条件渲染
    • JSX实现复杂条件渲染
  • React中的事件绑定
    • React基础事件绑定
    • 传递自定义参数
    • 同时传递事件对象和自定义参数
  • React中的组件
  • useState
    • 修改状态的规则
      • 状态不可变
    • 修改对象状态
  • 受控表单绑定
  • React中获取DOM元素
  • 组件通信
    • 理解组件通信
    • 父传子
      • props说明
      • 特殊的prop children
    • 子传父
    • 使用状态提升实现兄弟组件通信
    • 使用Context机制跨层级组件通信
  • useEffect
    • useEffect依赖项参数说明
    • useEffect --- 清除副作用
  • 自定义Hook实现
    • 封装自定义hook通用思路
  • React Hooks使用规则

React介绍

  • React是一个用于构建Web和原生交互界面的库

快速搭建React项目

  • create-react-app是一个快速创建React开发环境的工具,底层由Webpack构建,封装了配置细节,开箱即用
  • 执行命令:npx create-react-app name

JSX

  • JSX是JavaScript和XML的缩写,表示在JS代码中编写HTML模版结构,它是React编写UI模版的方式

JSX的本质

  • JSX并不是标准的JS语法,它是JS语法的扩展,浏览器本身不能识别,需要通过解析工具做解析之后才能在浏览器中运行

优势:

  1. HTML的声明式模版写法
  2. JS的可编程能力

JSX中使用JS表达式

  • 在JSX中可以使用大括号语法{}识别JavaScript中的表达式,比如常见的变量、函数调用、方法调用等等

注意:if语句、Switch语句、变量声明属于语句,不是表达式,不能出现在{}中

JSX中的列表渲染

  • 语法:在JSX中可以使用原生JS中的map方法遍历渲染列表
//项目的根组件
const list = [{id:1001,name:"vue"},{id:1002,name:"react"},{id:1003,name:"angular"}
]function App() {return (<div className="App">this is app{/* 渲染列表 */}<ul>{/* key的作用:React框架内部使用 提升更新性能 */}{list.map((item)=><li key={item.id}>{item.name}</li>)}</ul></div>);
}

JSX实现简单条件渲染

  • 语法:在React中,可以通过逻辑运算符&&或者三元表达式(?:)实现基础的条件渲染
const isLogin = falsefunction App() {return (<div className="App">{/* 逻辑与 */}{isLogin && <span>this is span  </span>}{/* 三元运算 */}{isLogin ? <span>miraculous</span> : <span>loading...</span>}</div>);
}

JSX实现复杂条件渲染

  • 自定义函数+if判断语句
//项目的根组件
const articleType = 3 //0||1||3//根据不同的类型返回不同的JSX模版
const getArticleForm = ()=>{if(articleType === 0){return <div>我是无图模式</div>}else if(articleType === 1){return <div>我是单图模式</div>}else{return <div>我是三图模式</div>}
}function App() {return (<div className="App">{/* 复杂的条件渲染 */}{/* 调用函数来实现 */}{getArticleForm()}</div>);
}

React中的事件绑定

React基础事件绑定

  • 语法:on + 事件名称 = {事件处理程序},整体上遵循驼峰命名法
function App() {//点击按钮后处理函数const handleClick = ()=>{console.log("点上了按钮");}return (<div className="App"><button onClick={handleClick}>click me</button></div>);
}

传递自定义参数

  • 事件绑定的位置改造成箭头函数的写法,在执行相关回调函数传递实参

注意:不能直接写函数调用,这里事件绑定需要一个函数引用

function App() {//点击按钮后处理函数const handleClick = (name)=>{console.log("点上了按钮",name);}return (<div className="App"><button onClick={()=>handleClick('miraculous')}>click me</button></div>);
}

同时传递事件对象和自定义参数

  • 在事件绑定的位置传递事件实参e和自定义参数,执行函数中声明形参,注意顺序对应
function App() {//点击按钮后处理函数const handleClick = (name,e)=>{console.log("点上了按钮",name,e);}return (<div className="App"><button onClick={(e)=>handleClick('miraculous',e)}>click me</button></div>);
}

React中的组件

  • 定义:在React中,一个组件就是首字母大写的函数,内部存放了组件的逻辑和视图UI,渲染组件只需要把组件当成标签渲染即可
//自定义组件
const Button = ()=>{return <button>click me</button>
}function App() {return (<div className="App">{/* 自闭和 */}<Button />{/* 成对标签 */}<Button></Button></div>);
}

useState

  • useState是一个React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果
  • 本质:和普通js变量不同的是,状态变量一旦发生变化,组件的视图UI也会跟着变化(数据驱动视图)
    const [count,setCount] = useState(0)
  1. useState是一个函数,返回值是一个数组
  2. 数组的第一个参数是状态变量,第二个参数是Set函数用来修改状态变量
  3. useState的参数将作为count的参数值
 //使用useState完成一个计数器
import { useState } from "react";
//useState实现一个计数器
function App() {const [count,setCount] = useState(0)//点击事件回调const handleClick = ()=>{setCount(count+1)}return (<div className="App"><button onClick={handleClick}>{count}</button></div>);
}

修改状态的规则

状态不可变

  • 在React中,状态被认为是只读的,我们应该始终替换它而不是修改它,直接修改状态不能引发视图更新

修改对象状态

  • 规则:对于对象类型的状态变量,应该始终传给set方法一个全新的对象来进行修改
  1. 错误写法:直接修改
const [form,setForm] = useState({name:"yaoyao"})
//修改form中的name
form.name = "miraculous"
  1. 正确写法:setForm传入一个全新的对象
const [form,setForm] = useState({name:"yaoyao"})
setForm({...form,name:"miraculous"
})

受控表单绑定

  • 使用React组件的状态(useState)控制表单的状态
  1. 准备一个React状态值
    const [value,setValue] = useState('')
  2. 通过value属性绑定状态,通过onChange属性绑定状态同步的函数
    <input type="text" value={value} onChange={(e)=>{setValue(e.target.value)}}>

React中获取DOM元素

  • 在React组件中获取/操作DOM元素,需要使用useRef钩子函数,分为两步:
  1. 使用useRef创建ref对象,并与JSX绑定
    const inputRef = useRef(null)
    <input type="text" ref={inputRef}></input>
  2. 在DOM可用时,通过inputRef.current拿到DOM对象
    const showDOM = ()=>{ console.log(inputRef); }

注意:渲染完毕之后,DOM生成之后才能进行使用

组件通信

理解组件通信

  • 组件通信就是组件之间的数据传递,根据组件嵌套关系的不同,有不同的通信方法

父传子

实现步骤:

  1. 父组件传递数据:在子组件标签上绑定属性
  2. 子组件接收数据:子组件通过props参数接收数据
//定义一个子组件
const Son = (props)=>{return <div>this is son {props.content}</div>
}function App() {//向子组件传递的参数const content = "this is father"return (<div className="App"><Son content={content} /></div>);
}

props说明

  1. props可传递任意的数据:数字、字符串、布尔值、数组、对象、函数、JSX
  2. props是只读对象:子组件只能读取props中的数据,不能直接进行修改,父组件的数据只能由父组件修改

特殊的prop children

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

子传父

  • 核心思路:在子组件中调用父组件中的函数并传递参数
//定义一个子组件
const Son = ({onGetSonMsg})=>{const msg = "this is son msg"return <div>this is son <button onClick={()=>onGetSonMsg(msg)}>send msg</button></div>
}function App() {const getMsg = (msg)=>{console.log(msg);}return (<div className="App"><Son onGetSonMsg={getMsg}></Son></div>);
}

使用状态提升实现兄弟组件通信

  • 实现思路:借助状态提升机制,通过父组件进行兄弟组件之间的数据传递

使用Context机制跨层级组件通信

实现步骤:

  1. 使用createContext方法创建一个上下文对象Ctx
  2. 在顶层组件(App)中通过Ctx.Provider组件提供数据
  3. 在底层组件中通过useContext钩子函数来获取消费数据
//1. 使用createContext创建一个上下文对象
const MsgContext = createContext()
//2. 在顶层组件中通过MsgContext.provider组件提供数据//定义一个子组件
const A = ()=>{return (<div>this is A component<B/></div>)
}
const B = ()=>{const msg = useContext(MsgContext)return (<div>this is B component {msg}</div>)
}function App() {const getMsg = (msg)=>{console.log(msg);}const msg = "this is app msg"return (<div className="App"><MsgContext.Provider value={msg}>this is app<A /></MsgContext.Provider></div>);
} 

useEffect

  • useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送AJAX请求等

useEffect依赖项参数说明

  • useEffect副作用函数的执行时机存在多种情况,根据传入依赖项的不同,会有不同的执行表现
    在这里插入图片描述
function App() {const [count,setCount] = useState(0)useEffect(()=>{console.log("副组件触发了");})const handleCount = ()=>{setCount(count+1)}return (<div className="App">this is app<button onClick={handleCount}>count:{count}</button></div>);
}

useEffect — 清除副作用

  • 在useEffect中编写的由渲染本身引起的对接组件外部的操作,也经常把它叫作副作用操作
    说明:清楚副作用的函数最常见的执行时机是在组件卸载时自动执行
const Son = ()=>{//渲染时开启一个定时器useEffect(()=>{const time = setInterval(() => {console.log("定时器开始");}, 1000);//清除副作用return ()=>{clearInterval(time)}},[])return <div>son component</div>
}function App() {const [show,setShow] = useState(true)return (<div className="App">{show && <Son/>}<button onClick={()=>setShow(false)}>卸载子组件</button></div>);
}

自定义Hook实现

  • 概念:自定义Hook是以use打头的函数,通过自定义hook函数可以用来实现逻辑的封装和复用
  • 通过一个按钮控制div组件是否显示
  • 本来的写法:
function App() {const [value,setValue] = useState(true)const qiehuan = ()=>{setValue(!value)}return (<div className="App">{value && <div>this is div</div>}    <button onClick={qiehuan}>切换</button></div>);
}
  • 使用Hook进行封装之后的写法:
//自定义Hook函数
const useQiehuan = ()=>{const [value,setValue] = useState(true)const qiehuan = ()=>{setValue(!value)}return {value,qiehuan}
}function App() {const {value,qiehuan} = useQiehuan()return (<div className="App">{value && <div>this is div</div>}    <button onClick={qiehuan}>切换</button></div>);
}

封装自定义hook通用思路

  1. 声明一个以use打头的函数(也可以不用use,为了语义化)
  2. 在函数体内封装可复用的逻辑
  3. 把组件中用到的状态和回调函数return出去(以对象或者数组)
  4. 在哪个组件中要用到这个逻辑,就执行这个函数,结构出来状态和回调进行使用

React Hooks使用规则

  1. 只能在组件中或者其他自定义Hook函数中调用
  2. 只能在组件的顶层调用,不能嵌套在if for 或者其他函数中

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

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

相关文章

【实战】deepseek数据分类用户评论数据

在平时的工作中&#xff0c;我们会遇到数据分类的情况&#xff0c;比如将一些文本划分为各个标签。如果人工分类这块的工作量将是非常大&#xff0c;而且分类数据的准确性也不高。我们需要用到一些工具来实现。提高效率的同时也提高准确率。 1.示例数据 用户ID 时间戳 评论场…

git tag以及git

git tag 以及git 一、先说收获吧 1. git bash 在windows上 类似于linux的bash提供的shell命令行窗口&#xff0c;可以执行很多linux命令&#xff0c;cd pwd ls vim cat touch mkdir&#xff0c;还可以用正则匹配查看标签。相当于在windows上装了一个小的linux。git init myproj…

[动手学习深度学习]28. 批量归一化

当前所有的深度学习网络&#xff0c;或多或少都用了批归一化操作 批归一化的思想不新&#xff0c;但是这个特定的层是16年左右出现的&#xff0c;在这之后&#xff0c;发现他对深度学习算法性能的提升非常有效 概念理解 这是一个网络的结构&#xff1a; 当数据很深的时候&am…

AI比人脑更强,因为被植入思维模型【17】万物联系思维模型

万物联系,万物,并不孤立。 定义 万物联系思维模型是一种强调世界上所有事物都相互关联、相互影响的思维方式。它认为任何事物都不是孤立存在的,而是与周围的环境、其他事物以及整个宇宙构成一个有机的整体。这种联系不仅包括直接的因果关系,还涵盖了间接的、潜在的、动态的…

昆仑技术重构AI大模型落地范式,长期作“加法”迎来国产生态化“拐点”

作者 | 曾响铃 文 | 响铃说 DeepSeek的爆火&#xff0c;在业内迅速掀起了一场国产化的变革。“国产大模型国产算力”软硬协同的范式正在被重构&#xff0c;AI产业国产化的含金量持续提升&#xff0c;越来越多的企业在这一趋势下加速走上数智化转型路径。 其中&#xff0c;以…

【C++初阶】---类和对象(上)

1.类的定义 1.1类的定义格式 • class为定义类的关键字&#xff0c;Data为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。 •…

常见中间件漏洞(tomcat)

CVE-2017-12615 当在Tomcat的conf&#xff08;配置目录下&#xff09;/web.xml配置文件中添加readonly设置为false时&#xff0c;将导致该漏洞产生&#xff0c;&#xff08;需要允许put请求&#xff09; , 攻击者可以利用PUT方法通过精心构造的数据包向存在漏洞的服务器里面上传…

NSSCTF(MISC)——[NSSRound#4 SWPU]Type Message

相应的做题地址&#xff1a;https://www.nssctf.cn/problem/2478 得到4个wav文件 使用DTMF Decoder工具&#xff0c;对D.wav进行识别 随波逐流&#xff0c;发现九宫格键盘解码能够得到flag 对其他3个文件依次进行识别解码 最终得到fNSSCTF{DTMFISREALLYEASY}

C++核心语法快速整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要为学过多门语言玩家快速入门C 没有基础的就放弃吧。 全部都是精华&#xff0c;看完能直接上手改别人的项目。 输出内容 std::代表了这里的cout使用的标准库&#xff0c;避免不同库中的相同命名导致混乱 …

Matplotlib完全指南:数据可视化从入门到实战

目录 引言 一、环境配置与基础概念 1.1 安装Matplotlib 1.2 导入惯例 1.3 两种绘图模式 二、基础图形绘制 2.1 折线图&#xff08;Line Plot&#xff09; 2.2 柱状图&#xff08;Bar Chart&#xff09; 三、高级图表类型 3.1 散点图&#xff08;Scatter Plot&#xff…

C++:IO库

一、C IO库的架构 C标准库中的IO系统基于流&#xff08;Stream&#xff09;​的概念&#xff0c;分为三层结构&#xff1a; ​流对象​&#xff08;如cin, cout, fstream&#xff09;​流缓冲区​&#xff08;streambuf&#xff0c;负责底层数据处理&#xff09;​数据源/目的…

【STM32】SPI通信外设硬件SPI读写W25Q64

【STM32】SPI通信协议&W25Q64Flash存储器芯片&#xff08;学习笔记&#xff09;-CSDN博客 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担可配置8位/16位数据帧、高位先行/…

二叉树之树的高以及遍历

二叉树的高其实很简单就一句话&#xff1a; 从根节点到叶节点的最长路径中的边数就是二叉树的高 int FindHeight(Btree root){int leftheight;int rightheight;if(rootNULL){return -1;}else{leftheightFindHeight(root->left );rightheightFindHeight(root->right );}r…

DeepSeek技术架构解析:MoE混合专家模型

一、前言 2025年初&#xff0c;DeepSeek V3以557万美元的研发成本&#xff08;仅为GPT-4的1/14&#xff09;和开源模型第一的排名&#xff0c;在全球AI领域掀起波澜。其核心创新之一——混合专家模型&#xff08;Mixture of Experts, MoE&#xff09;的优化设计&#xff0c;不…

VMware主机换到高配电脑,高版本系统的问题

原来主机是i3 ,windows7系统&#xff0c;vmware 14.0,虚机系统是ubuntu 14.04。目标新机是i7 14700KF,windows11系统。原以为安装虚拟机&#xff0c;将磁盘文件&#xff0c;虚拟机配置文件拷贝过去可以直接用。 新目标主机先安装了vmware 15&#xff0c;运行原理虚机&#xff0…

数字化转型驱动卫生用品安全革新

当315晚会上晃动的暗访镜头揭露卫生巾生产车间里漂浮的异物、纸尿裤原料仓中霉变的碎屑时&#xff0c;这一触目惊心的场景无情地撕开了“贴身安全”的遮羞布&#xff0c;暴露的不仅是部分企业的道德缺失&#xff0c;更凸显了当前检测与监管体系的漏洞&#xff0c;为整个行业敲响…

VideoHelper 油猴脚本,重塑你的视频观看体验

VideoHelper 油猴脚本&#xff0c;重塑你的视频观看体验 在日常上网看视频时&#xff0c;你是否也被这些问题困扰&#xff1a;视频网站开头的广告又臭又长&#xff0c;找个合适的播放倍速要在一堆选项里翻半天&#xff0c;每次手动调音量、点全屏按钮繁琐又影响沉浸感&#xf…

(C语言)习题练习 sizeof 和 strlen

sizeof 上习题&#xff0c;不知道大家发现与上一张的习题在哪里不一样嘛&#xff1f; int main() {char arr[] "abcdef";printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr 0));printf("%zd\n", sizeof(*arr));printf(&…

Java多线程与高并发专题——使用 Future 有哪些注意点?Future 产生新的线程了吗?

Future 的注意点 1. 当 for 循环批量获取 Future 的结果时容易 block&#xff0c;get 方法调用时应使用 timeout 限制 对于 Future 而言&#xff0c;第一个注意点就是&#xff0c;当 for 循环批量获取 Future 的结果时容易 block&#xff0c;在调用 get方法时&#xff0c;应该…

STM32基础教程——PWM驱动LED呼吸灯

目录 前言 技术实现 原理图 接线图 代码实现 内容要点 PWM基本结构 开启外设时钟 配置GPIO端口 配置时基单元 初始化输出比较单元 输出PWM波形 输出比较通道重映射 前言 PWM(Pulse Width Modulation):一种通过调节脉冲信号的占空比&#xff08;高电平持续时间与整…