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

React 基础:快速掌握 State、事件和 Hook

React 基础:快速掌握 State、事件和 Hook

学习 React 的过程可能感觉像是在一片概念的密林中穿梭。但一旦你掌握了核心概念,它就会成为构建动态 Web 应用的强大工具。本文将带你快速回顾支撑大多数 React 应用的几个核心概念:事件状态(State)Hook

React 的方式:处理事件和状态

在 React 中,你不会直接操作 DOM。相反,你使用的是一个 合成事件系统(Synthetic Event System),它是一个围绕原生事件(如 clickkeydownsubmit)的跨浏览器封装。事件处理程序的命名约定采用 驼峰式命名(例如 onClick 而非 onclick),并将函数引用作为处理程序传递。

当用户触发事件时,React 会向你的处理程序传递一个合成事件对象,其行为类似于原生事件对象,提供了 typetargetcurrentTarget 等属性。例如,你可以调用 preventDefault() 方法来阻止表单提交时页面刷新,或者使用箭头函数来传递额外的数据,比如 onClick={() => handleDelete(1)}

任何交互式 React 组件的核心是状态(state)。State 是一个包含动态数据的普通 JavaScript 对象。状态的黄金法则是它是不可变的——你永远不应该直接修改它。当状态更新时,React 会高效地重新渲染组件以反映这些变化。

useState Hook 是你为函数式组件添加状态的首选工具。它返回一个包含两个值的数组:当前状态变量和一个用于更新它的设置函数(setter function)

const [count, setCount] = useState(0);

当你需要更新状态中的对象或数组时,你必须始终创建一个新的。对于对象,使用扩展语法(...)来复制现有属性,然后再添加或更改新属性。对于数组,使用 filter() 或扩展语法等非变异方法来创建包含所需更改的新数组。这对于 React 检测变化并重新渲染至关重要。

你的组件如何显示在屏幕上:渲染过程

React 的渲染过程是一个三步走的“舞蹈”,让你的组件出现在页面上。

  1. 触发(Trigger):当某些东西(通常是状态或属性)发生变化时,它会触发 React,让其知道可能有必要更新 UI。
  2. 渲染(Render):React 重新评估组件并构建一个虚拟 DOM——一个轻量级的、内存中的真实 DOM 表示。在这个阶段,React 能够快速找出需要更改的部分。
  3. 提交(Commit):React 将从虚拟 DOM 中准备好的更改应用到真实的 DOM 上,使最终结果可见。这就是你在屏幕上看到 UI 更新的时刻。

深入了解:Refs 和 Effects

有时,你需要直接与真实 DOM 交互。这就是 Refs 的用武之地。你可以使用 useRef() Hook 创建一个 ref,并通过 ref 属性将其附加到元素上。真实的 DOM 节点可以通过 ref.current 来访问。这非常适合以编程方式聚焦输入框等任务。请记住,refs 用于访问 DOM,而不是管理状态。

Effects(副作用) 是发生在组件常规渲染流程之外的动作,例如从 API 获取数据、更新浏览器标签页标题或设置事件监听器。useEffect Hook 就是用来处理这些副作用的。

它接受两个参数:一个包含副作用逻辑的函数,以及一个可选的依赖数组,告诉 React 何时重新运行这个副作用。

  • 空数组([]:只在首次渲染时运行一次。
  • 包含值的数组([value]:在首次渲染和该值更改时运行。
  • 无数组:每次渲染时都会运行。

可重用性的力量:自定义 Hook

React 的内置 Hook 很棒,但如果你有一段复杂的逻辑想要在多个组件中复用怎么办?这就是自定义 Hook大放异彩的地方。

自定义 Hook 只是一个以 use 开头的 JavaScript 函数,它可以在内部调用其他 Hook。它允许你将数据获取或防抖计时器等逻辑从组件中提取出来,使你的代码更简洁、更具可重用性。例如,可以创建一个 useDebounce Hook 来延迟一个操作,直到用户停止输入,这非常适合搜索栏。

掌握了这些核心概念,你将能更好地构建健壮而高效的 React 应用。

http://www.dtcms.com/a/397918.html

相关文章:

  • 烟台网站制作计划wordpress怎么修改logo尺寸
  • Apache Hive 如何在大数据中发挥能量
  • CSS——实现盒子在页面居中
  • RocketMQ相对于RabbitMQ 的优势
  • ELK 企业级日志分析系统(完整版)
  • WaveTerminal+cpolar:提升远程协作效率的开发利器
  • 【记录】Ubuntu系统实现从远程服务器上传下载文件
  • 通过串口控制RDA5807收音模块(stm32+c#上位机)
  • hive表元数据修复脚本
  • React中的Hook
  • React简单例子
  • Playwright MCP 服务器对比高层级的 MCP 服务器解决方案
  • app下载网站模板wordpress将公网ip改为域名
  • 个人做网站如何推广安全优化大师
  • jupyter notebook用简易python代码跑本地模型
  • Android 安卓RIL介绍
  • 开源 java android app 开发(十五)绘图定义控件--仪表盘
  • Android如何自动弹出软键盘?
  • Linux Shell 脚本:从零到进阶的实战笔记
  • MR 一体机市场报告:2031全球规模突破 1.98亿美元,中国 40.8% 市占率成核心增长极
  • 网站管理员权限权重高的网站有哪些
  • 【Spark+Hive+hadoop】基于spark+hadoop基于大数据的全球用水量数据可视化分析系统大数据毕设
  • 07.【Linux系统编程】进程控制(进程创建fork、进程终止exit等、进程等待waitwaitpid、进程替换execl等)
  • 百度Qianfan-VL系列上线:推出3B/8B/70B三款视觉理解模型,覆盖不同算力需求
  • 基于 Python Keras 实现 猫狗图像的精准分类
  • 点云-标注-分类-航线规划软件 (一)点云自动分类
  • 挑战用R语言硬干一百万单细胞数据分析
  • 如何自己弄个免费网站wordpress前端登陆
  • npm install 时包库找不到报错解决
  • 【开题答辩实录分享】以《城市网约车服务预约与管理小程序的设计与实现》为例进行答辩实录分享