React Hooks 你知道哪些 ?

news/2025/4/2 11:57:20/文章来源:https://www.cnblogs.com/strivegys/p/18803107

基础 Hooks

useState:状态管理

  • 作用:在函数组件中声明和更新局部状态。
  • 实战场景:表单输入、计数器、开关状态。
import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);return (<div><p>{count}</p><button onClick={() => setCount(count + 1)}>+1</button></div>);
}

useEffect:副作用处理

  • 作用:处理副作用(如数据请求、DOM 操作、订阅)。
  • 实战场景:API 请求、事件监听、定时器。
import React, { useState, useEffect } from 'react';function DataFetcher() {const [data, setData] = useState(null);useEffect(() => {fetch('https://api.example.com/data').then(response => response.json()).then(data => setData(data));return () => {// 清理逻辑(如取消请求、移除监听)};}, []); // 空依赖数组表示只在挂载时执行return <div>{data ? data.title : 'Loading...'}</div>;
}

useContext:共享全局数据

  • 作用:跨组件树传递数据,避免逐层传递 props。
  • 实战场景:主题切换、用户登录状态。
import React, { createContext, useContext } from 'react';const ThemeContext = createContext('light');function App() {return (<ThemeContext.Provider value="dark"><Toolbar /></ThemeContext.Provider>);
}function Toolbar() {const theme = useContext(ThemeContext);return <div style={{ background: theme === 'dark' ? '#333' : '#fff' }}>Theme</div>;
}

进阶 Hooks

useReducer:复杂状态逻辑

  • 作用:类似 Redux,通过 reducer 函数管理复杂状态。
  • 实战场景:表单多字段管理、购物车状态。
import React, { useReducer } from 'react';const initialState = { count: 0 };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 Counter() {const [state, dispatch] = useReducer(reducer, initialState);return (<div><p>{state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>+1</button></div>);
}

useCallback:缓存函数

  • 作用:缓存函数引用,避免子组件不必要的渲染。
  • 实战场景:性能优化,防止函数重复创建。
import React, { useCallback, useState } from 'react';function Parent() {const [count, setCount] = useState(0);const handleClick = useCallback(() => {setCount(prev => prev + 1);}, []); // 依赖数组为空表示函数不变化return <Child onClick={handleClick} />;
}const Child = React.memo(({ onClick }) => {return <button onClick={onClick}>Click me</button>;
});

useMemo:缓存计算结果

  • 作用:缓存复杂计算结果,避免重复计算。
  • 实战场景:计算密集型操作、过滤列表。
import React, { useMemo, useState } from 'react';function List({ items }) {const [filter, setFilter] = useState('');const filteredItems = useMemo(() => {return items.filter(item => item.includes(filter));}, [items, filter]); // 依赖变化时重新计算return (<div><input value={filter} onChange={(e) => setFilter(e.target.value)} /><ul>{filteredItems.map(item => <li key={item}>{item}</li>}</ul></div>);
}

useRef:引用 DOM 或保存可变值

  • 作用:访问 DOM 元素或保存不触发渲染的变量。
  • 实战场景:输入框聚焦、保存定时器 ID。
import React, { useRef, useEffect } from 'react';function InputFocus() {const inputRef = useRef(null);useEffect(() => {inputRef.current.focus(); // 组件挂载后自动聚焦}, []);return <input ref={inputRef} type="text" />;
}

其他实用 Hooks

useLayoutEffect:同步副作用

  • 作用:类似 useEffect,但会在 DOM 更新后同步执行。
  • 实战场景:测量 DOM 元素尺寸、同步渲染前操作。
import React, { useLayoutEffect, useRef } from 'react';function MeasureElement() {const ref = useRef(null);useLayoutEffect(() => {const { width } = ref.current.getBoundingClientRect();console.log('Width:', width);}, []);return <div ref={ref}>Measure me</div>;
}

useImperativeHandle:暴露子组件方法

  • 作用:自定义通过 ref 暴露给父组件的方法。
  • 实战场景:表单验证、控制子组件行为。
import React, { useRef, useImperativeHandle, forwardRef } from 'react';const Child = forwardRef((props, ref) => {const inputRef = useRef();useImperativeHandle(ref, () => ({focus: () => inputRef.current.focus(),}));return <input ref={inputRef} />;
});function Parent() {const childRef = useRef();return (<div><Child ref={childRef} /><button onClick={() => childRef.current.focus()}>Focus Child</button></div>);
}

useDebugValue:调试自定义 Hook

  • 作用:在 React 开发者工具中显示自定义 Hook 的标签。
  • 实战场景:调试复杂自定义 Hook。
function useCustomHook() {const [value] = useState('Initial');useDebugValue(value); // 在开发者工具中显示值return value;
}

Hooks 组合实战

场景:全局状态管理(useContext + useReducer)

// 创建全局状态上下文
const AppContext = createContext();function App() {const [state, dispatch] = useReducer(reducer, initialState);return (<AppContext.Provider value={{ state, dispatch }}><ChildComponent /></AppContext.Provider>);
}function ChildComponent() {const { state, dispatch } = useContext(AppContext);return <div>{state.count}</div>;
}

场景:防抖搜索(useState + useEffect + useCallback)

function Search() {const [query, setQuery] = useState('');const [results, setResults] = useState([]);const debouncedSearch = useCallback(_.debounce((searchText) => {fetchResults(searchText).then(setResults);}, 500),[]);useEffect(() => {if (query) debouncedSearch(query);}, [query]);return (<div><input value={query} onChange={(e) => setQuery(e.target.value)} /><ul>{results.map(result => <li key={result.id}>{result.name}</li>}</ul></div>);
}

Hooks 使用规则

  • 只在顶层调用:不要在循环、条件或嵌套函数中使用 Hooks。
  • 仅在函数组件或自定义 Hook 中使用:不可在普通 JavaScript 函数中使用。

本文由mdnice多平台发布

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

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

相关文章

《HarmonyOS Next开发进阶:打造功能完备的Todo应用华章》

章节 6:日期选择器与日期处理目标学习如何使用DatePicker组件。 理解日期格式化和日期计算。内容日期选择器基础使用DatePicker组件。 处理日期选择事件。日期格式化格式化日期为友好的文本。日期计算判断日期是否过期或即将到期。代码示例 @Entry @Component struct DatePick…

MarkDwon语法

MarkDown语法 1、标题用法 一级标题:#+空格+内容+回车 二级标题:##+空格+内容+回车 三级标题:###+空格+内容+回车 四级标题:####+空格+内容+回车 2、字体用法 粗体使用:快捷键ctrl+b或者内容两边加两个星号,示例 斜体使用:内容两边加一个星号,示例 斜体加粗:内容两边加…

图论(连通分量)

AT_abc284_c [ABC284C] Count Connected Components 题目描述 頂点に $ 1 $ から $ N $ の番号が、辺に $ 1 $ から $ M $ の番号がついた $ N $ 頂点 $ M $ 辺の単純無向グラフが与えられます。辺 $ i $ は頂点 $ u_i $ と頂点 $ v_i $ を結んでいます。 グラフに含まれる連結…

业务系统基础框架-Winform版-角色

角色列表,可刷新,可展开,可折叠编辑角色为角色权限为角色分配菜单查看拥有此角色的账号

3.31 学习记录

实现了使用springboot从文件中读取数据显示在前端

记一次GC导致线上服务超时问题

1、现象2024-12-28 23点左右,线上其他服务请求 content-cache 出现批量超时。content-cache-03 机器内存使用率如下:机器配置:4核8G这里因为JVM参数设置为:-Xms4g -Xmx4g -XX:MaxNewSize=1g所以达到42%时,内存的使用率已经达到了3.3G。 2、数据查看GC日志如下: (1)CMS老…

No.1 可视化大屏--vite+vue3项目环境搭建

一、DataV-Vue3 1.1 安装 官网:https://datav-vue3.netlify.app/Guide/Guide.htmlnpm install @kjgl77/datav-vue3 一、vite3构建Vue3项目 1.1 什么是Vite 1.2创建vite3项目 第一步:新建一个项目的文件夹第二步:输入cmd,回车 第三步: npm init vite 第四步:输入项目名称…

SvelteKit 最新中文文档教程(16)—— Service workers

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

OLLAMA 自定义大模型角色

在Ollama中通过deepseek-r1生成特定角色的模板(如教案设计),核心是通过Modelfile定义模型的系统提示(SYSTEM)和对话模板(TEMPLATE)。以下是具体步骤和示例: 一、Modelfile 基本结构与关键指令FROM指令指定基础模型,这里你可以使用ollama本地下载的模型,也可以去Huggi…

WebSocket调试神器对决:Apipost凭何碾压Apifox?

你以为所有API工具都能玩转WebSocket? 当你的APP需要实时股票行情推送,当你的游戏要处理千人同屏交互,当你的IM系统必须保障消息零延迟——传统HTTP协议的"一问一答"模式瞬间破功。此刻WebSocket协议才是真正的救世主,这个全双工通信协议能让客户端与服务器建立&…

一年前的无心之举,一年后我想要将其做的更好——公众号开通。

大家好,答应的事情要做到。 我是晚秋,我在这里,这是我的公众号。 一年前我想把学过的技术,解决得问题都记录下来,帮助更多的人。 日复一日,也放弃过。 但是到今日,忽然看到自己的无心之举帮助了很多刚进入技术这一行的人。 他们迷茫,他们困顿,正如当初的我一样。 谢谢…