React-Hooks笔记

发布时间:2026/8/5 10:40:07

React-Hooks笔记
class组件存在的问题和添加Hooks的原因一、函数组件的特点没有组件实例没有生命周期没有state和setState只能接收props二、class组件的问题大型组件很难拆分和重构很难测试即class不易拆分相同业务逻辑分散到各个方法中逻辑混乱复用逻辑变得复杂如MixinsHOCRender Prop三、React组件更易用函数表达React提倡函数式编程函数更灵活更易拆分更易测试但是函数组件太简单需要增强能力-----HooksHooks的具体讲解1、State Hook注意让函数组件实现state和setState默认函数组件没有state函数组件是一个纯函数执行完即销毁无法存储state需要State Hook 即把state功能 “钩” 到纯函数中1、函数组件import React from react import { useState } from react; function ClickCount() { const [count, setCount] useState(0); return ( div p你点击了{count}次/p button onClick{() setCount(count 1)}点击/button /div ) } export default ClickCount;2、class组件import React from react class ClickCountClass extends React.Component { constructor(props) { super(props); this.state { count: 0 } this.handleClick this.handleClick.bind(this); } render() { return div p你点击了{this.state.count}次/p button onClick{this.handleClick}点击/button /div } handleClick() { this.setState({ count: this.state.count 1 }) } } export default ClickCountClass;3、useState使用总结useState(0)传入初始值返回数组[state,setSate]通过state获取值通过setState(1)修改值4、Hooks命名规范规定所有Hooks都用use开头如useXXX自定义Hooks也要用use开头非Hooks的地方尽量不要用useXXX写法Effect Hook具体讲解1、让函数组件模拟生命周期默认函数组件没有生命周期函数组件是一个纯函数执行完即销毁自己无法实现生命周期使用Effect Hook把生命周期“钩”到纯函数中2、模拟class组件的DidMount和DidUpdatauseEffect(() { console.log(name, name); });3、模拟class组件的DidMountuseEffect(() { console.log(组件挂载); }, []);4、模拟class组件的DidUpdatauseEffect(() { console.log(count, count, name, name); }, [count, name]);注意只有写在【】中间的元素变化更新了才会触发DidUpdata如果元素没有写在这里那么就算元素改变了也不会触发DidUpdata5、useEffect总结模拟DidMount --- useEffect依赖[]模拟DidUpdata --- useEffect无依赖或者依赖 [a, b]模拟WillUnMount --- useEffect 中返回一个函数6、useEffect让纯函数有了副作用默认情况下执行纯函数输入参数返回结果无副作用所谓副作用就是对函数之外造成影响如设置全局定时任务而组件需要副作用所以需要useEffect “钩” 入纯函数中注意useEffect可能会出现内存泄漏的问题比如纯函数的Effect中写了定时任务没有做销毁而外部又将纯函数销毁了那么定时器不会自动关闭还会继续存在。useRef具体讲解注意:主要用于获取Dom节点通过.current调用import React, { useRef, useEffect } from react; function UseFef() { const inputRef useRef(null); useEffect((){ console.log(inputRef.current);//Dom节点 },[]) return ( div ref{inputRef} 按钮 /div ); } export default UseFef;useContext具体讲解注意React中的Context具体意义就是全局存值。可以理解为vuex或者Rudex的简单版本import React, { useContext } from react; //主题颜色 const Themes { light: { foreground: #000, background: #fff }, dark: { foreground: #fff, background: #222 } } const ThemeContext React.createContext(Themes.light); function ThemedButton() {//底层组件 const theme useContext(ThemeContext);//使用useContext获取主题颜色 return ( button style{{ background: theme.background, color: theme.foreground }}你好/button ) } function Toolbar() {//中间组件 return ( ThemedButton / ) } function App() {//顶层组件 return ( ThemeContext.Provider value{Themes.dark}//使用ThemeContext.Provider提供主题颜色 Toolbar / /ThemeContext.Provider ) } export default App;useReducer具体讲解import React, { useReducer } from react; const initialState { count: 0 }; const reducer (state: any, action: any) { switch (action.type) { case increment: return { count: state.count 1 }; case decrement: return { count: state.count - 1 }; default: return state; } } function App() { //很像useStateconst [count, setCount] useState(0); const [state, dispatch] useReducer(reducer, initialState); return ( div pCount: {state.count}/p button onClick{() dispatch({ type: increment })}Increment/button button onClick{() dispatch({ type: decrement })}Decrement/button /div ) } export default App;1、useReducer和redux的区别useReducer是useState的代替方案用于state的复杂变化useReducer是单个组件的状态管理组件通讯还是需要propsredux是全局的状态管理多组件共享数据useMemo的具体讲解注意用于Hooks性能优化的1、有问题的情况注意我只改变父组件的数据情况下子组件会跟着一起发生改变去进行更新渲染。这样的情况是不应该的因为我子组件没有数据变化不应该让他重新渲染这样会造成资源的浪费耗费性能。import React, { useMemo, useState } from react; //子组件 function Child({ userInfo }) { console.log(Child组件渲染); return ( div pName: {userInfo.name}/p pAge: {userInfo.age}/p /div ) } //父组件 function App() { console.log(父组件渲染); const [count, setCount] useState(0); const [name, setName] useState(江停); const userInfo {name, age: 30}; return ( div Child userInfo{userInfo} / button onClick{() setCount(count 1)}Count: {count}/button button onClick{() setName(name 1)}Name: {name}/button /div ) } export default App;2、memo的应用注意虽然上述情况react会自己做nodeChild的校验如果在没有影响性能的情况下可以不用做memo的性能优化操作注意类似于PureComponent,对props进行浅层的比较注意用useMemo缓存数据当name变化时userInfoMemo会重新计算[]表示依赖项当依赖项变化时useMemo会重新计算import React, { memo, useMemo, useState } from react; //子组件 const Child memo(({ userInfo }: { userInfo: { name: string; age: number } }) { console.log(Child组件渲染); return ( div pName: {userInfo.name}/p pAge: {userInfo.age}/p /div ) }) //父组件 function App() { console.log(父组件渲染); const [count, setCount] useState(0); const [name, setName] useState(江停); const userInfo {name, age: 30}; //用useMemo缓存数据当name变化时userInfoMemo会重新计算[]表示依赖项当依赖项变化时useMemo会重新计算 const userInfoMemo useMemo(() userInfo, [name]); return ( div Child userInfo{userInfoMemo} / button onClick{() setCount(count 1)}Count: {count}/button button onClick{() setName(name 1)}Name: {name}/button /div ) } export default App;3、useMemo总结React默认会更新所有子组件class组件使用SUC和PureComponent做优化Hooks中使用useMemo但是优化的原理都是一样的useCallback的具体讲解1、有问题的情况注意当我们在子组件内添加一个传递的函数之前的子组件又会自动更新。import React, { memo, useMemo, useState } from react; //子组件 const Child memo(({ userInfo,onChange }: { userInfo: { name: string; age: number }, onChange: () void }) { console.log(Child组件渲染); return ( div pName: {userInfo.name}/p pAge: {userInfo.age}/p button onClick{onChange}Change/button /div ) }) //父组件 function App() { console.log(父组件渲染); const [count, setCount] useState(0); const [name, setName] useState(江停); const userInfo {name, age: 30}; //用useMemo缓存数据当name变化时userInfoMemo会重新计算[]表示依赖项当依赖项变化时useMemo会重新计算 const userInfoMemo useMemo(() userInfo, [name]); const onChange (e: React.ChangeEventHTMLInputElement) { console.log(onChange,e.target.value); } return ( div Child userInfo{userInfoMemo} onChange{(e: React.ChangeEventHTMLInputElement) onChange(e)} / button onClick{() setCount(count 1)}Count: {count}/button button onClick{() setName(name 1)}Name: {name}/button /div ) } export default App;2、useCallback的封装import React, { memo, useMemo, useState, useCallback } from react; //子组件 const Child memo(({ userInfo,onChange }: { userInfo: { name: string; age: number }, onChange: (e: any) void }) { console.log(Child组件渲染); return ( div pName: {userInfo.name}/p pAge: {userInfo.age}/p button onClick{onChange}Change/button /div ) }) //父组件 function App() { console.log(父组件渲染); const [count, setCount] useState(0); const [name, setName] useState(江停); const userInfo {name, age: 30}; //用useMemo缓存数据当name变化时userInfoMemo会重新计算[]表示依赖项当依赖项变化时useMemo会重新计算 const userInfoMemo useMemo(() userInfo, [name]); const onChange useCallback((e) { console.log(onChange,e.target.value); }, []); return ( div Child userInfo{userInfoMemo} onChange{onChange} / button onClick{() setCount(count 1)}Count: {count}/button button onClick{() setName(name 1)}Name: {name}/button /div ) } export default App;3、useCallback的总结useMemo缓存数据useCallback缓存函数但是传递的函数不要写成箭头函数这样可能后导致useCallback失效两者都是React Hooks的常见优化策略

相关新闻

老系统不敢动又必须用:零侵入数据对接是怎么做到的

老系统不敢动又必须用:零侵入数据对接是怎么做到的

2026/8/5 10:40:07

接触过一家做化工的企业,核心生产系统是2008年上的,原厂商早就找不到了。系统还在跑,但没人敢动——没有源代码,没有接口文档,数据库结构只有几个快退休的老员工还记得一部分。老板想做数据整合和智能分析,…

九大网盘直链提取终极指南:告别客户端束缚的浏览器脚本解决方案

九大网盘直链提取终极指南:告别客户端束缚的浏览器脚本解决方案

2026/8/5 10:40:07

九大网盘直链提取终极指南:告别客户端束缚的浏览器脚本解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…

指针:从入门到精通

指针:从入门到精通

2026/8/5 10:40:07

第二章:深入理解指针(2) 今天我们再来学习几个指针的知识点 目录 第二章:深入理解指针(2) 文章目录 二、野指针 1.概念 2.造成野指针的可能原因 1.未初始化 2.越界访问 3.指针指向的空间释放 3.如何避免野…

跳槽简历怎么写?夸克AI简历生成实测,指令直接抄作业

跳槽简历怎么写?夸克AI简历生成实测,指令直接抄作业

2026/8/5 11:30:09

上班经常吃这个亏: 想跳槽,但事情做了不少,简历上却写不出什么东西。 好不容易更新了简历投出去,HR一句「你的经历不够垂直」直接给你判了死刑。 现在的招聘市场就类似:肯德基要招炸薯条的,你在麦当劳炸薯…

视频下载不再困难:掌握Video Download Helper的5个实用技巧

视频下载不再困难:掌握Video Download Helper的5个实用技巧

2026/8/5 11:30:09

视频下载不再困难:掌握Video Download Helper的5个实用技巧 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经遇到过这样…

AI驱动的期权分析引擎:从波动率风险溢价到智能交易信号

AI驱动的期权分析引擎:从波动率风险溢价到智能交易信号

2026/8/5 11:30:09

摘要期权市场蕴含丰富的前瞻性信息,但其高维度、非线性特征使得传统分析方法难以充分挖掘价值。本文设计并实现了一套AI驱动的期权分析引擎,围绕波动率风险溢价(VRP)策略、隐含波动率(IV)压溃预测、Put/Cal…

抖音内容资产管理系统的架构演进:从批量下载到企业级数据管道

抖音内容资产管理系统的架构演进:从批量下载到企业级数据管道

2026/8/5 11:30:09

抖音内容资产管理系统的架构演进:从批量下载到企业级数据管道 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…

网工转行做安全,这份从基础到渗透的自学路线请收好

网工转行做安全,这份从基础到渗透的自学路线请收好

2026/8/5 11:30:09

从网工到安全:先夯实基础再谈攻防对于拥有网络运维背景的朋友来说,转行做网络安全其实有着天然的优势。你对 TCP/IP 协议、路由交换以及服务器架构的理解,是许多纯开发背景初学者难以企及的基石。但安全领域的学习逻辑必须明确:先…

Elasticsearch 8.x集群架构与分片机制深度解析

Elasticsearch 8.x集群架构与分片机制深度解析

2026/8/5 11:20:08

1. Elasticsearch集群架构核心设计解析 Elasticsearch的分布式架构设计是其能够处理海量数据的核心所在。在8.x版本中,集群架构进行了多项重要改进,使得系统在稳定性、扩展性和易用性方面都有显著提升。 1.1 节点角色精细化分工 8.x版本对节点角色划分…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/4 15:23:37

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/5 6:02:27

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/5 8:19:55

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

Go + 云原生微服务架构实战:2026 企业级开发完整指南

Go + 云原生微服务架构实战:2026 企业级开发完整指南

2026/8/5 0:09:22

Go 云原生微服务架构实战:2026 企业级开发完整指南 CNCF 最新数据显示,2026 年云原生相关岗位增速同比上涨 62%。Kubernetes、Docker、Etcd、Prometheus 等云原生基础设施全部由 Go 语言编写。Go 语言凭借简洁的语法、出色的并发模型、极快的编译速度和…

LangChain项目上线就翻车?团队接手的拦路虎从来不是代码

LangChain项目上线就翻车?团队接手的拦路虎从来不是代码

2026/8/5 0:09:22

聊《一个LangChain项目上线后,最先暴露的并不是代码问题》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。 摘要 摘要:我见过太多LangChain Demo能跑的项目,一交出去就崩。不是模…

3步轻松实现音乐格式自由:ncmdump网易云NCM解密完整指南

3步轻松实现音乐格式自由:ncmdump网易云NCM解密完整指南

2026/8/5 0:09:22

3步轻松实现音乐格式自由:ncmdump网易云NCM解密完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却发现只能在特定客户端播放?当你想在车载音响、…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/4 13:34:51

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/4 14:25:14

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/4 15:11:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…