React 中常见的Hooks,安排!

news/2025/2/6 5:59:35/

哈喽小伙伴们大家好!我是小李,今天是年后开工的第一天,相信大家已经元气满满,准备好迎接新的一年的挑战了吧!打起精神来,我们继续加油呀!今天,给大家分享一道我之前面试被问到相关Hooks的一道题目,今天先来说说react的,下期文章为大家分享vue的,希望对大家有所帮助!

首先,什么是Hooks?为什么会有Hooks这个东西?

所谓Hooks,它其实就是一些特殊的函数,也称钩子函数,它允许开发者在不编写 class 的情况下使用 state 以及其他 React 特性。简单来说,Hooks 就是一些特殊的函数,这些函数可以让你 “钩入”(Hook into) React 的状态和生命周期等特性。

1、useState

用于在函数组件中添加 statestate 是 React 组件中的一个重要概念,它允许组件存储和管理动态数据。

import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}export default Counter;
2、useEffect

用于处理副作用操作,比如数据获取、订阅、手动修改 DOM 等。它类似于 componentDidMountcomponentDidUpdate 和 componentWillUnmount 这几个生命周期方法的组合。

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>);
}export default Example;
3、useContext

用于在组件之间共享数据,避免通过中间组件层层传递 props。它需要和 React.createContext 一起使用。

import React, { createContext, useContext, useState } from 'react';// 创建一个 Context 对象
const ThemeContext = createContext();function App() {const [theme, setTheme] = useState('light');return (<ThemeContext.Provider value={theme}><Toolbar /><button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>Toggle Theme</button></ThemeContext.Provider>);
}function Toolbar() {return (<div><ThemedButton /></div>);
}function ThemedButton() {// 使用 useContext 获取 ThemeContext 的值const theme = useContext(ThemeContext);return <button style={{ background: theme === 'light' ? 'white' : 'black', color: theme === 'light' ? 'black' : 'white' }}>Themed Button</button>;
}export default App;

接下来是一些不常见的。

1、useReducer

是 useState 的替代方案,适用于复杂的 state 逻辑或多个子值需要更新的情况。它使用一个reducer 函数来管理 state 的更新。

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 (<>Count: {state.count}<button onClick={() => dispatch({ type: 'increment' })}>+</button><button onClick={() => dispatch({ type: 'decrement' })}>-</button></>);
}export default Counter;
2、useCallback

返回一个 memoized 回调函数,用于优化性能。当父组件重新渲染时,使用 useCallback 可以避免子组件因为传入的回调函数引用变化而不必要地重新渲染。

import React, { useState, useCallback } from 'react';function Parent() {const [count, setCount] = useState(0);// 使用 useCallback 缓存回调函数const handleClick = useCallback(() => {console.log('Button clicked');}, []);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button><Child onClick={handleClick} /></div>);
}function Child({ onClick }) {return <button onClick={onClick}>Click me</button>;
}export default Parent;
3、useMemo

返回一个 memoized 值,用于优化性能。它会在依赖项发生变化时重新计算值,避免在每次渲染时都进行昂贵的计算。

import React, { useState, useMemo } from 'react';function App() {const [a, setA] = useState(1);const [b, setB] = useState(2);// 使用 useMemo 缓存计算结果const sum = useMemo(() => {console.log('Calculating sum...');return a + b;}, [a, b]);return (<div><p>a: {a}</p><p>b: {b}</p><p>Sum: {sum}</p><button onClick={() => setA(a + 1)}>Increment a</button><button onClick={() => setB(b + 1)}>Increment b</button></div>);
}export default App;
4、useRef

返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数。它可以用来访问 DOM 节点或在多次渲染之间保存值。

import React, { useRef } from 'react';function TextInputWithFocusButton() {const inputEl = useRef(null);const onButtonClick = () => {// `current` 指向已挂载到 DOM 上的文本输入元素inputEl.current.focus();};return (<><input ref={inputEl} type="text" /><button onClick={onButtonClick}>Focus the input</button></>);
}export default TextInputWithFocusButton;

好啦,今天的分享就到这里,整理不易,如果觉得对你有帮助,欢迎给个三连支持,我是小李,我们下期见!


http://www.ppmy.cn/news/1569718.html

相关文章

deepseek、qwen等多种模型本地化部署

想要在本地部署deepseek、qwen等模型其实很简单,快跟着小编一起部署吧 1 环境搭建 1.1下载安装环境 首先我们需要搭建一个环境ollama,下载地址如下 :Ollama 点击Download 根据自己电脑的系统选择对应版本下载即可 1.2 安装环境(window为例) 可以直接点击安装包进行安…

Github 2025-02-02 php开源项目日报 Top10

根据Github Trendings的统计,今日(2025-02-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次…

IDA Pro的基础指南

引言 在网络安全和软件分析领域&#xff0c;逆向工程是理解程序行为、挖掘漏洞或分析恶意软件的核心技能之一。而IDA Pro&#xff08;Interactive Disassembler&#xff09;作为逆向工程的“瑞士军刀”&#xff0c;是每位安全研究员和分析师的必备工具。本文将带你从零开始&…

启元世界(Inspir.ai)技术浅析(二):深度强化学习

深度强化学习(Deep Reinforcement Learning, DRL)是启元世界在人工智能领域的一项核心技术,广泛应用于游戏AI、智能决策等领域。 一、状态(State) 1.1 概念与作用 **状态(State)**是指智能体对环境的感知,是智能体进行决策的基础。在深度强化学习中,状态通常是一个高…

计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战

前一篇文章&#xff0c;Tensor 基本操作5 device 管理&#xff0c;使用 GPU 设备 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started PyTorch 计算图和 Autograd 微积分之于机器学习Computational Graphs 计算图Autograd…

信标链的基本概念

什么是信标链&#xff1f; 信标链&#xff08;Beacon Chain&#xff09;是以太坊网络从工作量证明&#xff08;PoW&#xff09;向权益证明&#xff08;PoS&#xff09;过渡过程中的一次关键升级&#xff0c;标志着区块链演进过程中的一个重要里程碑。信标链于2020年12月1日推出…

k8m 是一款轻量级、跨平台的 Kubernetes 仪表板

k8m 是一款轻量级、跨平台的 Kubernetes 仪表板&#xff0c;专注于简化集群管理与 AI 功能的集成。其最新版本 v0.0.28 于 2025 年 2 月 4 日发布&#xff0c;包含多项功能优化和安全增强。以下是该版本的核心更新内容&#xff1a; 1. 安全性与认证优化1 动态 JWT 密钥配置&…

1992-2025年中国计算机发展状况:服务器、电脑端与移动端的演进

1992-2025年中国计算机发展状况&#xff1a;服务器、电脑端与移动端的演进 一、1992-2000年&#xff1a;市场化转型与基础积累 背景&#xff1a;改革开放深化&#xff0c;计算机产业从科研导向转向市场化&#xff0c;但核心技术仍依赖进口。 1. 服务器领域 技术基础&#xff1…