当前位置: 首页 > news >正文

React基础

目录

  • 一、开发环境搭建
  • 二、状态
    • 1.状态驱动
    • 2.列表渲染
  • 三、参数
    • 1.组件开发
    • 2.父组件向子组件传参
    • 3.子组件向父组件传参
  • 四、副作用Hooks
    • 1.useState()
    • 2.useEffect()
    • 3.useRef()
    • 4.useActionState()

一、开发环境搭建

当前主流方案是使用Vite脚手架:

npmcreate vite@latest 项目名--template=react-ts

二、状态

1.状态驱动

传统开发依靠JavaScript+Ajax定位DOM元素并绑定事件,依靠事件驱动页面变化

React、Vue属于状态驱动,根据状态的变化实时更新页面,封装了事件驱动的过程,只关注页面结果。

// 其中,在JavaScript中编写的HTML在编译阶段会被编译成JavaScript:<h1 className="title">Hello World</h1>// 实际上会被编译成:React.createElement('h1',{className:'title'},'Hello World');

状态驱动即根据参数的值返回不同的HTML代码块,如果要基于某个参数的状态实时更新页面必须要使用useState(0)定义参数:函数传入初始值和格式,返回状态变量和状态更新函数。

状态更新函数不仅会更新变量,还会触发该组件的一次重新渲染。由于状态变量具有不可变性,因此状态更新函数更新变量的原理是将新的状态变量赋值给引用。

exportfunctionApp(){// 状态const[count,setCount]=useState(0)// 视图return<div onClick={()=>setCount(count+1)}>{count}</div>}

而以下方式参数变化不会引起页面变化:

exportfunctionApp(){// 状态letcount=0// 视图return<div onClick={()=>count+1}>{count}</div>}

2.列表渲染

import{useState}from'react'interfaceUser{id:stringname:string}exportconstListDemo=()=>{const[userId,setUserId]=useState('')const[userName,setUserName]=useState('')const[userList,setUserList]=useState<User[]>([])constaddUser=()=>{if(!userId||!userName)return// ...userList将旧数组数据取出。并追加一条新用户数据,用新数组更新状态变量setUserList([...userList,{id:userId,name:userName}])setUserId('')setUserName('')}return(<div><input value={userId}onChange={(event)=>setUserId(event.target.value)}/><input value={userName}onChange={(event)=>setUserName(event.target.value)}/><button onClick={addUser}>+</button><ul>{userList.map((item)=>(<li}>{item.id}-{item.name}</li>))}</ul></div>)}

三、参数

1.组件开发

组件开发即解耦页面为多个不同功能的组件,便于复用。

组件定义规范如下:

  1. 组件参数一般用接口定义,参数可以是变量、函数。
  2. 使用export将子组件暴露出去,其他文件可以通过import导入。
  3. 组件返回值是HTML代码块,可以根据参数渲染不同内容。
import{useState}from"react"interfaceHelloWorldProps{title:string,render?:()=>React.ReactNode}exportconstHelloWorld=(props:HelloWorldProps)=>{const{title,render}=props;const[count,setCount]=useState(0);return<div>{title}<br/>{count}<button onClick={()=>{setCount(count+1)}}>+</button>{render?.()}</div>}

2.父组件向子组件传参

父组件通过组件属性向子组件传递参数,子组件使用函数形参捕获。

import'./App.css'import{HelloWorld}from'./components/HelloWorld/index'exportfunctionApp(){return<HelloWorld title='这是父组件向子组件传递参数'render={()=>{return<div>这是父组件向子组件传递的函数</div>}}/>}
import{useState}from"react"interfaceHelloWorldProps{title:string,render?:()=>React.ReactNode}exportconstHelloWorld=(props:HelloWorldProps)=>{const{title,render}=props;return<div>{title}<br/>{render?.()}</div>}

3.子组件向父组件传参

父组件通过组件属性向子组件传递由父组件编写的回调函数,子组件调用父组件的回调函数并传入参数,父组件就能通过函数体拿到子组件传入的参数。

exportfunctionApp(){const[num,setNum]=useState(0);return<div><HelloWorld handle={(msg:number)=>{setNum(msg)}}/><div>子组件向父组件传来的值:{num}</div></div>}
import{useState}from"react"interfaceHelloWorldProps{handle?:(count:number)=>void}exportconstHelloWorld=(props:HelloWorldProps)=>{const{handle}=propsconst[count,setCount]=useState(0);return<div>{count}<button onClick={()=>{setCount(count+1);handle?.(count+1)}}>+</button></div>}

四、副作用Hooks

Hook赋予组件能使用 state 状态、生命周期的能力,将静态组件动态化。

1.useState()

useState(0)用于维护状态变量,通过状态更新函数更新变量会触发该组件的一次重新渲染

exportfunctionApp(){// 状态const[count,setCount]=useState(0)// 视图return<div onClick={()=>setCount(count+1)}>{count}</div>}

2.useEffect()

useEffect()用于监听状态变量的变化,当状态变量发生变化时执行函数体:

import'./App.css'import{useEffect,useState}from'react'exportfunctionApp(){// 状态const[count,setCount]=useState(0)//副作用useEffect(()=>{console.log({count})},[count])// 视图return<div onClick={()=>setCount(count+1)}>{count}</div>}
  • useEffect(()=>{},[prop]),状态变量发生变化时执行
  • useEffect(()=>{}),组件发生变化后执行
  • useEffect(()=>{},[]),仅组件挂载阶段执行

3.useRef()

useRef()用于获取DOM和缓存变量。

import'./App.css'import{useRef}from'react'exportfunctionApp(){// div对象constdivRef=useRef<HTMLDivElement>(null)return<div ref={divRef}></div>}

4.useActionState()

useActionState()用来获取表单提交状态和返回值。

import{useActionState}from"react"exportconstFormDemo=()=>{consthandleSubmit=async(formData:FormData)=>{constname=formData.get("name")console.log({name})awaitapi.post("/user",{name})return{}}const[state,actions,pending]=useActionState(handleSubmit,null)console.log("当前提交状态和返回值",state)return(<form action={actions}><input type="text"name="name"/><button type="submit">提交</button></form>)}
http://www.cnnetsun.cn/news/2725717.html

相关文章:

  • 告别拖拽式布局:用SceneBuilder + FXML重构你的JavaFX项目(附完整配置流程)
  • Rocky Linux 8.10安装Environment Modules踩坑记:解决‘libtclenvmodules.so’报错全记录
  • 从Kali到Windows:手把手教你用Ettercap-GTK图形化界面复现一次HTTPS中间人攻击(含证书导入避坑指南)
  • Java开发必知必会的MySQL核心知识点(一)-基础入门:从零开始认识数据库核心
  • AI 时代,测试工程师的生存之道
  • RimSort终极指南:免费开源模组管理器让《边缘世界》体验更完美
  • 生物识别技术如何解决结核病治疗依从性难题:一个公共卫生领域的创新实践
  • [实战] 2026年图纸特性提取AI在质量管理中的应用:从GDT识别到数字化检验计划
  • 手把手教你用Matlab/Simulink搞定Boost升压电路仿真(含PI控制器参数调试)
  • STM32F3 HAL库V1.11.0开发包:含Nucleo/Discovery全系列板级示例与驱动源码
  • 从‘一致对’到p值:手把手推导肯德尔相关系数,并用NumPy复现scipy的kendalltau
  • Windows平台终极asar文件处理工具:WinAsar完整使用指南
  • 别再只用mount了!用UUID挂载硬盘才是真·永久,保姆级配置流程(含fstab详解)
  • 别再当‘黑盒’炼丹师了!用GradCAM给你的YOLOv8模型做个‘X光’检查
  • Qt 高级开发 023:布局间距、边距与输入组件全套实操指南
  • 保姆级教程:PVE 8.0 国内源一键配置脚本(含Debian 12、LXC、Ceph源及弹窗去除)
  • 3分钟掌握Scarab:空洞骑士模组管理的神器
  • AI创意工具组合不是越多越好!——基于372个设计工作室数据的效能拐点分析(附决策矩阵表)
  • ComfyUI-Manager生产级部署:多线程架构深度优化与300%性能突破
  • 手把手教你用Replicate打造个人AI工具箱:从文生图到PDF对话,一次配置全搞定
  • 告别第三方App!手把手教你用xdisp_virt在Windows上搭建AirPlay接收端(支持iOS/iPad投屏)
  • 别再死记硬背Base64了!从XCTF‘如来十三掌’题看编码的‘套娃’与识别技巧
  • CLion调试Keil老项目踩坑记:解决printf报错和启动文件冲突
  • 终极赛博朋克2077存档编辑器:如何完全掌控你的夜之城冒险
  • Jeecg-Boot弹框选数据后,如何把关联表的其他信息也带回来?一个完整的前后端配置案例
  • XUnity.AutoTranslator终极指南:5步让外文游戏秒变中文
  • KeePass进阶玩法:巧用AutoTypeSearch插件,在远程桌面和虚拟机里也能一键输密码
  • 揭秘Windows右键菜单的底层逻辑:ContextMenuManager深度解析与技术实现
  • 构建高效技术情报系统:研究周报的生产流程与价值实现
  • 从Pikachu靶场通关看Web安全实战:一个新手如何用Burp Suite和PHPStudy复现所有漏洞(附完整Payload)