常用的 React Hooks 的介绍和示例

devtools/2025/2/22 4:06:38/

目录

  • 1. useState
  • 2. useEffect
  • 3. useContext
  • 4. useReducer
  • 5. useCallback
  • 6. useMemo
  • 7. useRef
  • 8. useImperativeHandle
  • 9. useLayoutEffect
  • 10. useDebugValue

常用的 React Hooks 的介绍和示例:

1. useState

useState 是一个用于在函数组件中添加状态的 Hook。

javascript">import React, { useState } from 'react';function Example() {const [count, setCount] = useState(0); // 初始化状态return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

2. useEffect

useEffect 是一个用于在函数组件中执行副作用(如数据获取、订阅或手动更改 DOM)的 Hook。

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

3. useContext

useContext 是一个用于在函数组件中访问 React Context 的 Hook。

javascript">import React, { useContext } from 'react';const MyContext = React.createContext(null);function Example() {const value = useContext(MyContext);return <div>{value}</div>;
}

4. useReducer

useReducer 是一个用于在函数组件中使用更复杂的状态逻辑的 Hook。

javascript">import React, { useReducer } from 'react';function reducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };default:throw new Error();}
}function Example() {const [state, dispatch] = useReducer(reducer, { count: 0 });return (<div><p>Count: {state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>Increment</button><button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button></div>);
}

5. useCallback

useCallback 是一个用于缓存函数的 Hook,以避免不必要的重新渲染。

javascript">import React, { useState, useCallback } from 'react';function Example() {const [count, setCount] = useState(0);const handleClick = useCallback(() => {setCount(count + 1);}, [count]);return (<div><p>You clicked {count} times</p><button onClick={handleClick}>Click me</button></div>);
}

6. useMemo

useMemo 是一个用于缓存计算值的 Hook,以避免不必要的计算。

javascript">import React, { useState, useMemo } from 'react';function Example() {const [count, setCount] = useState(0);const memoizedValue = useMemo(() => {return count * 2;}, [count]);return (<div><p>Count: {count}</p><p>Memoized Value: {memoizedValue}</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

7. useRef

useRef 是一个用于在函数组件中访问 DOM 元素或存储可变值的 Hook。

javascript">import React, { useRef } from 'react';function Example() {const inputRef = useRef(null);const focusInput = () => {inputRef.current.focus();};return (<div><input ref={inputRef} /><button onClick={focusInput}>Focus Input</button></div>);
}

8. useImperativeHandle

useImperativeHandle 是一个用于自定义暴露给父组件的实例值的 Hook。

javascript">import React, { useRef, useImperativeHandle } from 'react';function FancyInput(props, ref) {const inputRef = useRef();useImperativeHandle(ref, () => ({focus: () => {inputRef.current.focus();}}));return <input ref={inputRef} />;
}FancyInput = React.forwardRef(FancyInput);function ParentComponent() {const inputRef = useRef();const focusInput = () => {inputRef.current.focus();};return (<div><FancyInput ref={inputRef} /><button onClick={focusInput}>Focus Input</button></div>);
}

9. useLayoutEffect

useLayoutEffect 是一个与 useEffect 类似的 Hook,但它会在所有 DOM 变更之后同步调用,而不是异步调用。

javascript">import React, { useLayoutEffect } from 'react';function Example() {useLayoutEffect(() => {console.log('This runs synchronously after all DOM changes');});return <div>Example</div>;
}

10. useDebugValue

useDebugValue 是一个用于在 React DevTools 中显示自定义 Hook 的调试值的 Hook。

javascript">import React, { useState, useDebugValue } from 'react';function useCustomHook(initialValue) {const [value, setValue] = useState(initialValue);useDebugValue(`Current value: ${value}`);return [value, setValue];
}function Example() {const [count, setCount] = useCustomHook(0);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

http://www.ppmy.cn/devtools/160857.html

相关文章

pdf-extract-kit paddle paddleocr pdf2markdown.py(效果不佳)

GitHub - opendatalab/PDF-Extract-Kit: A Comprehensive Toolkit for High-Quality PDF Content Extraction https://github.com/opendatalab/PDF-Extract-Kit pdf2markdown.py 运行遇到的问题&#xff1a; 错误&#xff1a; -------------------------------------- C Tra…

【Mysql】我在广州学Mysql 系列—— 有关日志管理的示例

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天星期四了&#xff0c;明天周五&#xff0c;美好的周末又要到了&#xff01;&#xff01;&#x1f606; 本文是对MySQL日志管理内容进行练习&#xff0c;后续将添加更多相关知识噢&#xff0c;谢谢各位的支持&#x1f64f; 复习…

【C++项目】Rpc通信框架设计

目录 Rpc远程调用的思想 项目框架设计 服务端模块划分 网络通信模块 Network 应用层通信协议模块 Protocol 消息分发处理模块 Dispatcher 远程调用路由功能模块 RpcRouter ​编辑 发布订阅功能模块 Publish-Subscribe 服务注册/发现/上线/下线功能模块 Registry-Disc…

安卓携手电脑,畅享局域网手机投屏全屏新体验

软件介绍 今天给大家推荐一款超实用的局域网手机投屏电脑的神器。它能让手机画面在电脑上全屏显示&#xff0c;效果超赞&#xff01; 这款软件分安卓端和电脑端&#xff0c;两边都得安装相应软件才能实现投屏功能。就拿 Windows 系统来说&#xff0c;对应的软件叫 Macast&…

软件评测师复习之计算机网络(4)

目录 (一)1.网络功能和分类2.OSI七层模型3.TCP/IP协议4.传输介质(二)1.通信方式和交换方式2.IP地址3.IPv64.网络规划与设计5.磁盘冗余阵列6.网络存储技术(一) 1.网络功能和分类 计算机网络功能:数据通信、资源共享、负载均衡、高可靠性 按分布范围和拓扑结构划分: 网络分类…

创客匠人:知识服务还有未来吗?个人IP如何突围下半场的生死局?

我是老蒋&#xff0c;创客匠人创始人。 最近各种对个人IP赛道的预测&#xff0c;我听了不少&#xff0c;打开手机就是对个人IP的一顿喷和对行业未来的悲观猜想。 当所有人都在唱衰知识服务赛道时&#xff0c;我却在公司的后台数据看到令人振奋的消息&#xff1a; 2025年创客…

CentOS 7.8 安装MongoDB 7 副本集(Replica Set)

文章目录 1 环境假设步骤1&#xff1a;在两台服务器上安装MongoDB步骤2&#xff1a;配置副本集步骤3&#xff1a;初始化副本集步骤4&#xff1a;验证副本集配置步骤5&#xff1a;设置安全性&#xff08;可选&#xff09;扩展配置示例&#xff1a;最佳实践&#xff1a;仲裁节点步…

【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?

在分布式系统中&#xff0c;RabbitMQ 自身不直接提供消息幂等性保障机制&#xff0c;但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践&#xff1a; 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一ID&#xff…