react中的hook

server/2025/1/21 14:32:06/

在 React 中,Hooks 是一种在函数组件中使用状态和其他 React 特性(如生命周期方法)的新方式。它们在 React 16.8 中被引入,并且极大简化了组件的状态管理和副作用处理。

常见的 React Hook

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

1. useState

useState 是最基本的 Hook,用于在函数组件中添加状态。

示例:
javascript">import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);  // count 为状态变量,setCount 为更新该状态的函数return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}export default Counter;
  • useState(0) 中的 0 是初始状态值。
  • setCount 是更新状态的方法。

2. useEffect

useEffect 用于处理副作用,类似于类组件中的生命周期方法(如 componentDidMount, componentDidUpdate, componentWillUnmount)。

示例:
javascript">import React, { useState, useEffect } from 'react';function Example() {const [count, setCount] = useState(0);// 组件挂载时运行useEffect(() => {console.log('Component mounted or count changed!');document.title = `You clicked ${count} times`;// 返回的函数是清理函数,在组件卸载时调用return () => {console.log('Cleanup for count change!');};}, [count]);  // 依赖数组,表示只有当 count 改变时才执行副作用return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}export default Example;
  • useEffect 第一个参数是一个副作用函数,第二个参数是依赖数组。
  • 如果依赖数组为空([]),副作用函数只会在组件挂载和卸载时执行。

3. useContext

useContext 用于在函数组件中访问 React 上下文(Context)中的值。

示例:
javascript">import React, { useContext } from 'react';// 创建上下文
const MyContext = React.createContext('default value');function Example() {const value = useContext(MyContext);  // 访问上下文值return <div>{value}</div>;
}function App() {return (<MyContext.Provider value="Hello, world!"><Example /></MyContext.Provider>);
}export default App;
  • useContext(MyContext) 用于获取 MyContext 提供的值。

4. useReducer

useReducer 是一种更复杂的状态管理方式,类似于 useState,但是它适用于处理复杂的状态逻辑,尤其是有多个子状态的情况。它通常用于处理复杂的状态更新逻辑,或者在 React 应用中使用类似 Redux 的模式。

示例:
javascript">import React, { useReducer } from 'react';// 定义 reducer 函数
function counterReducer(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(counterReducer, { count: 0 });return (<div><p>Count: {state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>Increment</button><button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button></div>);
}export default Counter;
  • useReducer 接受两个参数:reducer 函数和初始状态。
  • dispatch 是用于触发 reducer 更新状态的函数。

5. useRef

useRef 用于获取 DOM 元素的引用或者持久化值。在重新渲染时,useRef 不会导致组件重新渲染,它常用于访问 DOM 元素或保持跨渲染周期不变的值。

示例:
javascript">import React, { useRef } from 'react';function FocusInput() {const inputRef = useRef();const focusInput = () => {inputRef.current.focus();  // 让 input 元素获取焦点};return (<div><input ref={inputRef} type="text" /><button onClick={focusInput}>Focus the input</button></div>);
}export default FocusInput;
  • useRef 返回一个对象,该对象的 current 属性指向 DOM 元素或任何可变值。

6. useMemo

useMemo 用于缓存计算结果,以避免不必要的重新计算。它只会在依赖项发生变化时重新计算结果。

示例:
javascript">import React, { useMemo } from 'react';function Example({ num }) {const expensiveComputation = (num) => {console.log('Computing...');return num * 2;};const computedValue = useMemo(() => expensiveComputation(num), [num]);return <div>{computedValue}</div>;
}export default Example;
  • useMemo 通过依赖数组来优化性能,避免在每次渲染时执行高昂的计算。

7. useCallback

useCallback 用于返回一个 memoized 版本的回调函数,只有当依赖项发生变化时才会更新。它常用于将回调函数传递给子组件,以避免不必要的重新渲染。

示例:
javascript">import React, { useCallback, useState } from 'react';function Button({ onClick }) {return <button onClick={onClick}>Click me</button>;
}function Parent() {const [count, setCount] = useState(0);const increment = useCallback(() => setCount(count + 1), [count]);return (<div><Button onClick={increment} /><p>Count: {count}</p></div>);
}export default Parent;
  • useCallback 确保 increment 函数只有在 count 改变时才会重新创建。

8. useLayoutEffect

useLayoutEffectuseEffect 类似,不同之处在于它会在 DOM 更新之前同步执行。通常用于读取布局和同步触发副作用。

示例:
javascript">import React, { useLayoutEffect, useState } from 'react';function LayoutExample() {const [width, setWidth] = useState(0);useLayoutEffect(() => {setWidth(window.innerWidth);}, []);return <div>Window width: {width}</div>;
}export default LayoutExample;
  • useLayoutEffect 在 DOM 更新后立即执行,通常用于在页面渲染之前进行一些测量。

9. useImperativeHandle

useImperativeHandle 用于自定义暴露给父组件的实例值。通常与 forwardRef 配合使用,用于在函数组件中暴露 ref。

示例:
javascript">import React, { useImperativeHandle, forwardRef, useRef } from 'react';const MyComponent = forwardRef((props, ref) => {const localRef = useRef();useImperativeHandle(ref, () => ({focus: () => {localRef.current.focus();}}));return <input ref={localRef} />;
});function Parent() {const inputRef = useRef();const focusInput = () => {inputRef.current.focus();  // 使用子组件暴露的 focus 方法};return (<div><MyComponent ref={inputRef} /><button onClick={focusInput}>Focus the input</button></div>);
}export default Parent;
  • useImperativeHandle 用于控制外部组件访问的实例值。

总结

React 的 Hook 提供了许多强大的功能,使函数组件能够处理状态、生命周期、引用等。掌握这些常用的 Hook,能够帮助你在开发中写出更加简洁、可维护的代码。


http://www.ppmy.cn/server/160198.html

相关文章

电气防火保护器为高校学生宿舍提供安全保障

摘 要&#xff1a;3月2日&#xff0c;清华大学紫荆学生公寓发生火情&#xff0c;无人员伤亡。推断起火原因系中厅内通电电器发生故障引燃周边可燃物所致。2月27日&#xff0c;贵州某高校女生宿舍发生火灾&#xff0c;现场明火得到有效控制&#xff0c;无人员受伤。2月19日&…

得物App亮相第七届进博会,科技赋能打造消费新热点

在2024年11月5日至11月10日举办的第七届进博会舞台上&#xff0c;上海交易团虹口分团表现亮眼&#xff0c;其中得物作为来自虹口品质电商的践行者&#xff0c;备受众多参观者关注。 上海得物信息集团有限公司自2015年于上海虹口创立以来&#xff0c;始终坚守“满足年轻人对美好…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

JAVA-Exploit编写(6)--http-request库文件上传使用

目录 1.http-request简介 2. 依赖导入 3.文件上传页面代码 4. http-request文件上传简单使用 5.请求https的网站解决SSL证书的问题 5. 1 直接请求带https域名的网站 5.2 信任所有证书 1.http-request简介 http-request 是一个库 里面提供很多方法&#xff0c;使得很容易就…

QT+VS2022 应用程序无法启动0x000007b问题记录

不知道怎么搞的出现了这个问题。记录一下我做的工作&#xff1b; 1.检查环境变量 我安装了两个版本的Qt&#xff0c;环境变量的顺序很重要&#xff0c;要把程序使用的那个版本靠前放&#xff1b; 可以参考&#xff1a; 彻底解决Qt报错&#xff1a;无法定位程序输入点于动态…

Linux -- HTTP 请求 与 响应 报文

目录 请求报文&#xff1a; 请求方法 响应报文&#xff1a; 状态码 与 状态码描述 共性 常见的报头 请求报文&#xff1a; 请求方法 方法说明GET获取资源POST传输实体主体PUT传输文件HEAD获得报文首部DELETE删除文件OPTIONS询问支持的方法TRACE追踪路径CONNECT要求用…

PyCharm中解决依赖冲突

1. 创建虚拟环境 确保为项目创建了一个虚拟环境&#xff0c;这样可以隔离项目的依赖&#xff0c;避免全局依赖冲突。 检查当前项目的 Python 环境 打开 PyCharm。点击菜单栏的 File > Settings > Project: [Your Project Name] > Python Interpreter。确保已选择一…

Vue2+OpenLayers添加缩放、滑块缩放、拾取坐标、鹰眼、全屏控件(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 废话不多说&#xff0c;直接给完整代码&#xff0c;替换成自己的KEY即可运行&#xff1a; <template><div><div i…