React 钩子汇总
React 钩子
一、常用的 React 钩子:
1. useState
用于在函数式组件中添加状态管理。它返回一个状态值和一个更新状态的函数,让你可以在组件中追踪和更新状态。
2. useEffect
用于在组件渲染完成后执行副作用操作,比如数据获取、订阅等。它接收一个回调函数和一个依赖数组,可以用来管理副作用的触发时机。
3. useContext
用于在组件中访问全局的上下文数据。它接收一个上下文对象,返回上下文中的数据。
4. useReducer
类似于 useState,但更适用于复杂的状态逻辑,它通过使用一个 reducer 函数来管理状态。
5. useCallback
用于缓存回调函数,以避免在每次渲染时创建新的回调函数。适用于性能优化。
6. useMemo
用于缓存计算结果,以避免在每次渲染时重复计算。适用于性能优化。
7. useState
用于在函数式组件中添加状态管理。它返回一个状态值和一个更新状态的函数,让你可以在组件中追踪和更新状态。
8. useContext
用于在组件中访问全局的上下文数据。它接收一个上下文对象,返回上下文中的数据。
9. useReducer
类似于 useState,但更适用于复杂的状态逻辑,它通过使用一个 reducer 函数来管理状态。
10. useCallback
用于缓存回调函数,以避免在每次渲染时创建新的回调函数。适用于性能优化。
11. useMemo
用于缓存计算结果,以避免在每次渲染时重复计算。适用于性能优化。
二、不常用的 React 钩子:
- useImperativeHandle:用于自定义暴露给父组件的实例值,通常与 forwardRef 一起使用。
- useLayoutEffect:与 useEffect 类似,但在 DOM 更新之后同步执行,适用于需要操作 DOM 布局的情况。
- useDebugValue:用于在 React 开发者工具中提供自定义钩子的标签和调试信息。
- useRef:用于在组件渲染之间保持变量的稳定引用,不触发重新渲染。还可以用于获取 DOM 元素的引用。
- useTransition:用于管理异步更新的状态,可以平滑地在不同状态之间切换。
- useMutableSource:用于自定义数据源,以供 useTransition 和 Concurrent Mode 使用。
- useDeferredValue:与 useTransition 一起使用,用于推迟渲染较不重要的数据。
- useSyncExternalStore:与外部数据源集成的实验性 API,用于从外部数据源同步状态。
三、常用的 React 钩子示例:
1. useState:
import React, { useState } from 'react';
function Counter() {const [count, setCount] = useState(0);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}
2. useEffect:
import React, { useState, useEffect } from 'react';
function DataFetching() {const [data, setData] = useState([]);useEffect(() => {fetch('https://api.example.com/data').then(response => response.json()).then(data => setData(data));}, []);return (<div>{data.map(item => <p key={item.id}>{item.name}</p>)}</div>);
}
3. useContext:
import React, { useContext } from 'react';
const ThemeContext = React.createContext('light');
function ThemedText() {const theme = useContext(ThemeContext);return <p className={theme}>This is themed text.</p>;
}
4. useReducer:
import React, { useReducer } from 'react';
const initialState = { count: 0 };
function countReducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };default:return state;}
}function Counter() {
const [state, dispatch] = useReducer(countReducer, initialState);
return (<div><p>Count: {state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>Increment</button><button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button></div>);
}
5. useCallback:
import React, { useState, useCallback } from 'react';
function Button({ onClick }) {console.log('Button rendered');return <button onClick={onClick}>Click me</button>;
}function Parent() {const [count, setCount] = useState(0);const handleClick = useCallback(() => {setCount(count + 1);}, [count]);return (<div><p>Count: {count}</p><Button onClick={handleClick} /></div>);
}
6. useMemo:
import React, { useState, useMemo } from 'react';function ExpensiveCalculation() {console.log('Expensive calculation');// Simulating a time-consuming calculationreturn 5 + 10;
}function Parent() {const [count, setCount] = useState(0);const result = useMemo(() => {return ExpensiveCalculation();}, [count]);return (<div><p>Result: {result}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}
四、不常用的 React 钩子示例:
1. useImperativeHandle:
import React, { useRef, forwardRef, useImperativeHandle } from 'react';const FancyInput = forwardRef((props, ref) => {const inputRef = useRef();useImperativeHandle(ref, () => ({focus: () => {inputRef.current.focus();}}));return <input ref={inputRef} />;
});
2. useLayoutEffect:
import React, { useState, useLayoutEffect } from 'react';function LayoutEffectExample() {const [width, setWidth] = useState(0);useLayoutEffect(() => {setWidth(document.documentElement.clientWidth);}, []);return <p>Window width: {width}</p>;
}
3. useDebugValue:
import React, { useDebugValue, useState } from 'react';function useCustomHook() {const [count, setCount] = useState(0);useDebugValue(`Count: ${count}`);return count;
}
4. useRef:
import React, { useRef } from 'react';function FocusableInput() {const inputRef = useRef();const focusInput = () => {inputRef.current.focus();};return (<div><input ref={inputRef} /><button onClick={focusInput}>Focus Input</button></div>);
}
5. useTransition:
import React, { useState, useTransition } from 'react';function AsyncContent() {const [data, setData] = useState([]);const [startTransition, isPending] = useTransition();const fetchData = () => {startTransition(() => {fetch('https://api.example.com/data').then(response => response.json()).then(data => setData(data));});};return (<div><button onClick={fetchData} disabled={isPending}>Fetch Data</button>{data.map(item => <p key={item.id}>{item.name}</p>)}</div>);
}
6.useMutableSource
useMutableSource 是一个用于实验性的 API,通常用于与 React 的 Concurrent Mode 结合使用。它允许你创建一个可变数据源,可以在更新时传递给 React,以实现异步更新的状态。
import React, { useMutableSource } from 'react';const dataSource = {// 在这里定义你的数据源方法
};function CustomComponent() {const mutableSource = useMutableSource(dataSource);return <div>{mutableSource.getData()}</div>;}
7.useDeferredValue
useDeferredValue 与 useTransition 一起使用,用于将某些数据的渲染推迟到未来帧,以平滑地处理异步数据的更新。
import React, { useState, useTransition, useDeferredValue } from 'react';function AsyncContent() {const [data, setData] = useState([]);const [startTransition, isPending] = useTransition();const fetchData = () => {startTransition(() => {fetch('https://api.example.com/data').then(response => response.json()).then(data => setData(data));});};return (<div><button onClick={fetchData} disabled={isPending}>Fetch Data</button>{data.map(item => (<p key={item.id}><DeferredText text={item.name} /></p>))}</div>);
}function DeferredText({ text }) {const deferredText = useDeferredValue(text);return <span>{deferredText}</span>;
}
8.useSyncExternalStore
useSyncExternalStore 是一个实验性 API,用于将 React 组件状态与外部数据源同步,适用于从外部数据源获取数据并同步状态。
import React, { useSyncExternalStore } from 'react';const externalStore = {// 定义与外部数据源交互的方法
};function SyncedComponent() {const syncedData = useSyncExternalStore(externalStore);return <div>Data from external store: {syncedData}</div>;
}
相关文章:
React 钩子汇总
React 钩子 一、常用的 React 钩子: 1. useState 用于在函数式组件中添加状态管理。它返回一个状态值和一个更新状态的函数,让你可以在组件中追踪和更新状态。 2. useEffect 用于在组件渲染完成后执行副作用操作,比如数据获取、订阅等。…...
Python爬取旅游网站数据机票酒店价格对比分析
本文将介绍如何使用Python爬虫从旅游网站上获取机票和酒店的价格数据,并实现价格对比分析,帮助你做出明智的旅行决策。我们提供了完善的方案和代码,让你能够轻松操作并获得实际价值。 使用Python爬虫获取旅游网站上的机票和酒店价格数据&…...

OA项目之会议通知(查询是否参会反馈详情)
目录 会议查询 是否参会 反馈详情 讲解思路 会议通知SQL语句分析 反馈详情SQL语句分析 后台代码编写 前端代码编写 效果预览 会议查询 MeetingFeedBack.java package com.zking.oa.model;import org.lisen.mvc.util.AutoIncrement; import org.lisen.mvc.util.…...
如何维护自己的电脑的措施
维护自己的电脑可以采取以下措施: 硬件维护:定期清理电脑表面的灰尘和污垢,避免灰尘对电脑内部部件造成影响。电源插座要保持接触良好,保证电脑的电源稳定。如果使用笔记本电脑,要注意保证散热通畅,避免电…...

VS2022 Community 安装步骤
VS2022 Community 安装步骤(C语言学习) 1. 下载地址2. 安装步骤 1. 下载地址 链接: VS2022 Community下载地址 2. 安装步骤 双击图标进行安装。 点击【继续】后等待安装。 选择需要的安装包并修改安装位置,然后点击【安装】。 点击安装…...
vue3中mitt.js使用
在vue2中我们通过事件总线eventbus,来实现两个平行组件之间的通信: bus.js import Vue from vue // 创建vue实例 const Bus new Vue() export default Bus在具体的组件中: A.vue import Bus from ./bus.js // 发布一个事件 Bus.$emit(sendData, {nam…...
Redis 内存淘汰策略详解
Redis 内存淘汰策略详解 一、简介Redis内存管理问题 二、内存淘汰策略1.为什么需要内存淘汰策略2.内存淘汰策略分类(1)noeviction(2)allkeys-lru(3)allkeys-lfu(4)volatile-lru&…...

初识Redis之分布式
一.简单介绍: Redis是用来在内存中, 存储数据的, 他的初心是用来搞消息中间件(或者说消息队列 很熟悉了吧~~),但是呢用的不多,他现在主要是用来做 数据库,缓存 用来存储数据, 为什么不直接存储呢? Redis的优势就在于分布式系统 二.分布式系统 要说其分布式系统,简单想想都能…...

计算机网络-笔记-第三章-数据链路层
目录 三、第三章——数据链路层 1、数据链路层概述(帧) (1)封装成帧、差错检测、可靠传输(简单介绍) (2)CSMA/CD 2、封装成帧 (1)透明传输(…...
【1】openGL glew示例代码分析绘制一个三角形
openGL文档 > docs.gl ,可以直接查询函数的定义和使用 #include <iostream> #include <string> #include <GL/glew.h> #include <GLFW/glfw3.h>int main(void) {GLFWwindow* window;/* Initialize the library */if (!glfwInit())retu…...

android:新建工程文件介绍
一、前言当我们新建一个app时会呈现出固定的工程文件,这篇文章介绍新建工程里的文件。 二、介绍 Structure:就是你选择哪个页面就会显示那个页面的结构,就比如说我选择的是MainActivity他就会显示这个页面所使用的方法。 1-2:是android自动生…...
强化历程6-网络系列(2023.8.30)
文章目录 强化历程6-网络系列(2023.8.30)1 说一下OSI七层协议,为什么要分层?2 什么是TCP/IP协议,与OSI七层协议两者对比?3 什么是TCP协议,TCP协议和UDP协议区别?4 说一下TCP的三次握手和四次挥手5 两次握手…...
下载MedShapeNet
在 [1] 可下载 MedShapeNet 数据集,在其 Download 页,可选直接 GUI 下,或者先下一个索引文件,.txt 的,每行一条文件的下载链接,然后用 wget 逐条下。这里放下 wget 下载的 shell 脚本: 下载链索…...

根据身高重建队列【贪心算法】
根据身高重建队列 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…...

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 高校汉服租赁网站的 设计与实现
一.项目介绍 高校汉服租赁网站分为普通用户以及管理员两类 普通用户: 注册、登录系统、查看汉服首页发帖公告信息、 交流论坛(发帖、查看帖子、评论)、 公告咨询(查看公告以及评论)、 汉服信息(查…...

SQL-DQL
-----分组查询----- 1.语法: SELECT 字段列表 FROM 表名 [WHERE 条件 ] GROUP BY 分组字段名 [HAVING 分组后过滤条件]; 2.where与having区别 》执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组&…...
手写深拷贝方法
function deepClone(data){if(!isObject(data)){// 非对象,直接拷贝return data}let result {}if(data instance of Array){result []}for(let key in data){if(data.hasOwnProperty(key)){result[key] deepClone(data[key])}}return result }// 是否对象 functi…...

格子游戏——并查集
Alice和Bob玩了一个古老的游戏:首先画一个 nn 的点阵(下图 n3 )。 接着,他们两个轮流在相邻的点之间画上红边和蓝边: 直到围成一个封闭的圈(面积不必为 1)为止,“封圈”的那个人就是…...

2023最新Python重点知识万字汇总
这是一份来自于 SegmentFault 上的开发者 二十一 总结的 Python 重点。由于总结了太多的东西,所以篇幅有点长,这也是作者"缝缝补补"总结了好久的东西。 **Py2 VS Py3** * print成为了函数,python2是关键字* 不再有unicode对象…...

【STM32】学习笔记(TIM定时器)-江科大
TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...