浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 React 应用编码实现。

1. 优势

1.1. 简化状态管理和副作用处理

Hooks 如 useState 和 useEffect 使得在函数组件中处理状态和副作用变得更加直观和简洁。

import React, { useState, useEffect } from 'react';function Counter() {const [count, setCount] = useState(0);useEffect(() => {document.title = `You clicked ${count} times`;}, [count]);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

1.2. 代码复用和组织

Hooks 提供了一种无需修改组件结构即可复用状态逻辑的方法。例如,可以创建自定义 Hook,将特定的状态逻辑封装起来,然后在多个组件中重用。

import { useState, useEffect } from 'react';function useWindowWidth() {const [width, setWidth] = useState(window.innerWidth);useEffect(() => {const handleResize = () => setWidth(window.innerWidth);window.addEventListener('resize', handleResize);return () => {window.removeEventListener('resize', handleResize);};}, []);return width;
}function DisplayWidth() {const width = useWindowWidth();return <div>Window width: {width}</div>;
}

2. 常用的 React Hooks

2.1. useState

用于在函数组件中添加 state 变量。

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

2.2. useEffect

用于在函数组件中执行副作用操作,如数据获取、订阅等。

useEffect(() => {// 组件挂载时执行return () => {// 组件卸载时清理};
}, [dependencies]); // 依赖数组

2.3. useContext

用于在函数组件中访问上下文。

const value = useContext(MyContext);

2.4. useReducer

用于管理复杂的 state 逻辑,类似于 Redux 的 reducer 概念。

const [state, dispatch] = useReducer(reducer, initialState);

2.5. useRef

用于访问 DOM 元素或保存不需要触发重新渲染的变量。

const inputRef = useRef(null);

2.6. useMemo和useCallback

用于性能优化,分别用于记忆化计算结果和记忆化函数。

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);

3. 自定义 Hook

自定义 Hook 是一种复用状态逻辑的方式,可以提取组件中重复的逻辑,封装成一个自定义 Hook,从而在多个组件中重用。

import { useState, useEffect } from 'react';function useFetch(url) {const [data, setData] = useState(null);const [loading, setLoading] = useState(true);useEffect(() => {fetch(url).then(response => response.json()).then(data => {setData(data);setLoading(false);});}, [url]);return { data, loading };
}function App() {const { data, loading } = useFetch('https://api.example.com/data');if (loading) {return <div>Loading...</div>;}return (<div><pre>{JSON.stringify(data, null, 2)}</pre></div>);
}

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

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

相关文章

【个人笔记】数据库原理(西电)

写在前面&#xff1a;文中提到的页面指向&#xff08;如“p45”&#xff09;&#xff0c;除特别说明&#xff0c;都是指对应ppt上的页面&#xff0c;非同款ppt的友友可忽略 第一章 ER图和关系分解见课本p69 ER图是常用的 概念模型 方形&#xff1a;实体圆形&#xff1a;属性…

SDC命令详解:使用set_propagated_clock命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定端口列表/集合 简单使用 注意事项 传播时钟是在进行了时钟树综合后&#xff0c;使用set_propagated_clock命令可以将一个理想时钟转换为传播时钟&#x…

关于华为仓颉编程语言

文章目录 一、基本概况二、技术特点1. 多范式编程2. 原生智能化3. 高性能与安全4. 全场景兼容 三、编译器与开发工具四、语言相似性对比五、行业应用实例总结 最近经常看到这个东西&#xff0c;于是搜了一下&#xff0c;整理了一些内容&#xff0c;水一篇&#xff0c;以后慢慢研…

【STM32F1标准库】理论——定时器中的输出比较

目录 一、定时器的输出比较介绍&#xff08;Output Compare&#xff09; 1.整体简介 2.输出比较单元具体功能框图 3.以PWM模式1举例 二、杂谈 1.CCR的全名 2.PWM简介 3.舵机简介 4.直流电机及驱动模块TB6612简介 一、定时器的输出比较介绍&#xff08;Output Compare…

前端开发面试题总结-HTML篇

文章目录 HTML面试高频问答一、HTML 的 src 和 href 属性有什么区别?二、什么是 HTML 语义化?三、HTML的 script 标签中 defer 和 async 有什么区别?四、HTML5 相比于 HTML有哪些更新?五、HTML行内元素有哪些? 块级元素有哪些? 空(void)元素有哪些?六、iframe有哪些优点…

Scrapy爬虫教程(新手)

1. Scrapy的核心组成 引擎&#xff08;engine&#xff09;&#xff1a;scrapy的核心&#xff0c;所有模块的衔接&#xff0c;数据流程梳理。 调度器&#xff08;scheduler&#xff09;&#xff1a;本质可以看成一个集合和队列&#xff0c;里面存放着一堆即将要发送的请求&#…

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五…

历史数据分析——唐山港

个股简介 公司简介: 唐山港口投资有限公司、北京京泰投资管理中心、河北利丰燕山投资管理中心、国富投资公司、唐山市建设投资公司、河北省建设投资公司、国投交通实业公司7家发起人共同发起设立。 经营分析: 港口经营一般项目:港口货物装卸搬运活动;普通货物仓储服务(不含…

云端回声消除:让超低端硬件能玩实时打断

传统认知里“优质交互 高性能硬件”的等式正在被打破&#xff1f; 超低端开发板也能实现高配置硬件才有的实时打断语音交互&#xff1f; 网易云信推出的云端回声消除技术不仅解决了硬件配置对交互体验的限制&#xff0c;更以系统性解决方案重构了嵌入式设备的实时对话体验。 困…

堆排序的详细解读

一.堆的基本概念 1.什么是堆 堆是一种特殊的完全二叉树&#xff0c;满足一下性质&#xff1a; 最大堆&#xff1a;每个节点的值都大于或等于其子节点的值&#xff08;堆顶元素最大&#xff09;最小堆&#xff1a;每个节点的值都小于或等于其子节点的值&#xff08;堆顶元素最小…

hmdp知识点

1. 前置知识 1.1 MyBatisPlus的基本使用 1.1.1 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> </dependency> 1.1.2 建立实体类和数…

分享5个免费5个在线工具网站:Docsmall、UIED Tool在线工具箱、草料二维码、图片在线压缩、表情符号

01. Docsmall 它是一个免费的在线图片与PDF处理工具&#xff0c;功能主要包含Ai图片处理工具&#xff0c;图片压缩工具&#xff0c;图片PDF格式转换工具等&#xff0c;如下图&#xff0c;我认为比较实用的是自动抠图、图片变高清、图片压缩和PDF压缩。 https://docsmall.com/…

打通印染车间“神经末梢”:DeviceNet转Ethernet/IP连接机器人的高效方案

在印染行业自动化升级中&#xff0c;设备联网需求迫切。老旧印染设备多采用Devicenet协议&#xff0c;而新型工业机器人普遍支持Ethernet/IP协议&#xff0c;协议不兼容导致数据交互困难&#xff0c;设备协同效率低、生产监控滞后&#xff0c;成了行业数字化转型的阻碍。本文将…

RSA加密算法:非对称密码学的基石

一、RSA算法概述 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的非对称加密算法&#xff0c;它基于大数分解的数学难题&#xff0c;是当今应用最广泛的公钥密码系统。RSA的核心思想是使用一对密钥&#xff08;公钥…

杭州瑞盟 MS35774/MS35774A 低噪声256细分微步进电机驱动,用于空调风门电机驱动,香薰电机驱动

杭州瑞盟 MS35774/MS35774A 低噪声256细分微步进电机驱动&#xff0c;用于空调风门电机驱动&#xff0c;香薰电机驱动 简述 MS35774/MS35774A 是一款高精度、低噪声的两相步进 电机驱动芯片&#xff0c;芯片内置功率 MOSFET &#xff0c;长时间工作的平均电 流可以达到 1…

驶向智能未来:车载 MCP 服务与边缘计算驱动的驾驶数据交互新体验

引言 在人工智能技术与车载算力持续突破的驱动下&#xff0c;现代车辆的数字化进程正加速推进。车联网系统将突破传统云端架构的局限&#xff0c;依托边缘计算与 AI 融合技术&#xff0c;实现人车交互体验的范式重构‌。通过构建基于多源异构数据的自动化分析框架&#xff0c;…

Python数据可视化科技图表绘制系列教程(三)

目录 单一柱状图 分组柱状图 堆积柱状图 百分比柱状图 均值柱状图 不等宽柱状图 有序柱状图 条形图 发散条形图 在条上添加标签的发散条形图 基础棒棒糖图1 基础棒棒糖图2 【声明】&#xff1a;未经版权人书面许可&#xff0c;任何单位或个人不得以任何形式复制、发…

JavaScript 数组与流程控制:从基础操作到实战应用

在 JavaScript 编程的世界里&#xff0c;数组是一种极为重要的数据结构&#xff0c;它就像是一个有序的 “收纳盒”&#xff0c;能够将多个值整齐地存储起来。而流程控制语句则像是 “指挥官”&#xff0c;能够按照特定的逻辑对数组进行遍历和操作。接下来&#xff0c;就让我们…

十(1). 强制类型转换

继第十部分C强制类型转换的四种方式&#xff0c;再进行强化巩固一下知识点 static_cast 最常用的&#xff0c;在指针之间做转换 const_cast 去除常量属性 dynamic_cast 用在基类和派生类之间的转换 reinterpret_cast 在任意类型之间进行转 10.1 static_cast 常见的使用场景&am…

Git版本控制工具详解

如何区分开发环境和生产环境呢 答案就是写不同的配置文件&#xff0c;开发的设置成开发需要的&#xff0c;生产的设置成生产需要的&#xff0c;共同放到config这个配置文件夹下面&#xff0c;开发和生成的时候分别加载不同的配置文件 方式二就是使用相同的一个入口配置文件&a…