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

ReactHook有哪些

React 中常用的 Hooks 列表及用法

React Hooks 是 React 16.8 版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。以下是 React 中常用的 Hooks 列表及其详细用法:

1. useState

useState 是用于在函数组件中添加状态的 Hook。通过调用 useState,可以声明一个状态变量,并提供更新该状态的方法。

const [state, setState] = useState(initialState);
  • state:当前的状态值。
  • setState:更新状态的函数。
  • initialState:状态的初始值。

示例:

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

useEffect 是用于处理副作用的 Hook,例如数据获取、订阅或手动 DOM 操作。它类似于类组件中的 componentDidMountcomponentDidUpdatecomponentWillUnmount 的组合。

useEffect(effect, dependencies);
  • effect:副作用的回调函数。
  • dependencies:依赖项数组,当数组中的值发生变化时触发 effect

示例:

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

useContext 是用于访问 React 的上下文(Context)的 Hook。它允许你从组件树中任何位置读取上下文值,而无需显式传递 props。

const value = useContext(MyContext);

示例:

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>Current theme is {theme}</div>;
}
4. useReducer

useReducer 是用于管理复杂状态逻辑的 Hook。它类似于 Redux 的 reducer 函数,适合处理多个状态值或复杂的更新逻辑。

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

示例:

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 Counter() {const [state, dispatch] = useReducer(reducer, { count: 0 });return (<div>Count: {state.count}<button onClick={() => dispatch({ type: 'increment' })}>+</button><button onClick={() => dispatch({ type: 'decrement' })}>-</button></div>);
}
5. useCallback

useCallback 是用于记忆函数的 Hook。它可以防止因为组件重新渲染导致方法被重新创建,起到缓存作用。

const memoizedCallback = useCallback(callback, dependencies);

示例:

import React, { useCallback, useState } from 'react';function ParentComponent() {const [count, setCount] = useState(0);const handleChildClick = useCallback(() => {console.log('Child clicked');}, []);return <ChildComponent onChildClick={handleChildClick} />;
}
6. useMemo

useMemo 是用于记忆计算结果的 Hook。它仅会在某个依赖项改变时才重新计算 memoized 值,从而避免不必要的开销。

const memoizedValue = useMemo(computeFunction, dependencies);

示例:

import React, { useMemo, useState } from 'react';function ExpensiveComponent() {const [count, setCount] = useState(0);const expensiveValue = useMemo(() => computeExpensiveValue(count), [count]);return (<div><p>Expensive Value: {expensiveValue}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}
7. useRef

useRef 是用于创建一个可变的引用对象的 Hook。它适用于保存 DOM 引用、计时器 ID 或其他不触发重新渲染的值。

const refContainer = useRef(initialValue);

示例:

import React, { useRef } from 'react';function TextInputWithFocusButton() {const inputEl = useRef(null);const onButtonClick = () => {inputEl.current.focus();};return (<><input ref={inputEl} type="text" /><button onClick={onButtonClick}>Focus the input</button></>);
}
8. useLayoutEffect

useLayoutEffect 类似于 useEffect,但会在所有的 DOM 变更之后同步调用。它适用于需要测量布局并同步执行某些操作的场景。

useLayoutEffect(effect, dependencies);
9. useImperativeHandle

useImperativeHandle 是用于自定义暴露给父组件的实例值的 Hook。它通常与 ref 配合使用。

useImperativeHandle(ref, createHandle, dependencies);
10. useDebugValue

useDebugValue 是用于在开发者工具中显示自定义 Hook 的调试标签的 Hook。

useDebugValue(value);

总结

useImperativeHandle(ref, createHandle, dependencies);
10. useDebugValue

useDebugValue 是用于在开发者工具中显示自定义 Hook 的调试标签的 Hook。

useDebugValue(value);

总结

在这里插入图片描述

相关文章:

  • 云原生应用架构设计原则与落地实践:从理念到方法论
  • 漫画Android:事件分发的过程是怎样的?
  • 浏览器的渲染原理
  • 多功能文档处理工具推荐
  • 常见跨域问题解决
  • Go语言接口:灵活多态的核心机制
  • 指数函数的泰勒展开可视化:从数学理论到Python实现
  • 每日c/c++题 备战蓝桥杯(P1011 [NOIP 1998 提高组] 车站)
  • 深兰科技董事长陈海波受邀出席2025苏商高质量发展(常州)峰会,共话AI驱动产业升级
  • MATLAB项目实战:阻尼振动与数据拟合项目
  • 流复制(Streaming Replication)与自动故障转移(Failover)实战:用Patroni或Repmgr搭建生产级数据库集群
  • visual studio 2022 初学流程
  • Photoshop使用钢笔绘制图形
  • 【ArcGIS微课1000例】0147:Geographic Imager6.2下载安装教程
  • CPT302 Multi-Agent Systems 题型
  • Axure疑难杂症:中继器新增数据时如何上传并存储图片(玩转中继器)
  • ch12 课堂参考代码 及 题目参考思路
  • 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
  • 历年中国科学技术大学计算机保研上机真题
  • 历年中国农业大学计算机保研上机真题
  • 做营销网站设计/抖来查关键词搜索排名
  • 人力资源公司注册/班级优化大师的功能有哪些
  • 杭州网站建设设计公司/百度导航和百度地图
  • 男生可以做网站编辑工作吗/深圳网络营销外包公司推荐
  • 营销网站建设专家/seo薪酬水平
  • 做网站_你的出路在哪里/网络销售平台排名前十