2026/5/13 18:03:35
网站建设
项目流程
教育局建设网站的必要性,网页布局分析,中国的网站做欧美风,电子商务网站建设前的分析你想解决React开发中使用Hooks时触发Uncaught Error: Invalid hook call. Hooks can only be called的经典错误#xff0c;该问题是React Hooks推出后的高频入门错误#xff0c;核心原因是违背了React官方规定的Hooks「仅函数组件/自定义Hooks顶层调用、不跨React实例使用、R…你想解决React开发中使用Hooks时触发Uncaught Error: Invalid hook call. Hooks can only be called的经典错误该问题是React Hooks推出后的高频入门错误核心原因是违背了React官方规定的Hooks「仅函数组件/自定义Hooks顶层调用、不跨React实例使用、React与React DOM版本匹配」的三大核心调用规则或是在类组件、条件判断、循环、异步回调中调用Hooks导致React无法追踪Hooks的状态关联关系。该问题在React 16.8Hooks首次推出至React 18的所有版本中核心规则完全一致仅版本校验、项目构建配置的细微差异解决思路通用且固定。文章目录一、核心认知Hooks的工作原理与核心调用规则1.1 Hooks的核心工作原理1.2 Hooks的三大必守核心调用规则规则1仅在**React函数组件**中调用Hooks规则2仅在**自定义Hooks的顶层作用域**调用Hooks规则3确保Hooks在**同一个React实例**中使用且React与React DOM版本严格匹配1.3 Hooks合法/非法调用场景对比表二、典型错误场景按出现频率排序附错误修复代码2.1 在条件/循环/嵌套函数中调用Hooks最高频错误表现错误代码三大非法调用位置示例核心原因修复代码将Hooks移至顶层逻辑内聚到Hooks内部2.2 在类组件中调用Hooks高频错误表现错误代码类组件中调用useState/useEffect核心原因修复代码二选一类组件改用状态/生命周期 | 类组件重构为函数组件方案1类组件使用原生state/生命周期移除Hooks方案2将类组件重构为函数组件使用Hooks推荐2.3 自定义Hooks未以use开头内部调用Hooks高频错误表现错误代码普通函数中调用Hooks未按use命名核心原因修复代码自定义Hooks严格以use开头遵循命名规范2.4 React与React DOM版本不匹配/项目存在多个React实例中高频错误表现错误代码无代码错误环境配置问题核心原因修复代码环境配置修复无业务代码修改步骤1检查并统一React与React DOM版本步骤2解决项目多React实例问题步骤3清除依赖缓存重新安装依赖2.5 在异步回调/定时器/外部请求中调用Hooks中高频错误表现错误代码异步回调/定时器中调用useState/useEffect核心原因修复代码Hooks移至顶层异步逻辑内聚到Hooks内部2.6 将函数组件当作普通函数调用而非组件渲染低频错误表现错误代码将函数组件当作普通函数调用核心原因修复代码通过JSX语法正常渲染函数组件三、系统化排查步骤从简单到复杂一键定位问题步骤1查看控制台**完整报错信息**提取关键线索步骤2检查Hooks的**调用位置**是否违背顶层调用规则步骤3检查Hooks的**调用环境**是否为合法载体步骤4检查**自定义Hooks命名**是否遵循use开头规范步骤5验证**组件渲染方式**是否通过JSX语法渲染步骤6检查**React与React DOM版本**是否严格一致步骤7清除依赖缓存重新安装依赖步骤8排查第三方组件库是否引入不兼容的库四、永久避坑技巧遵循编码规范从源头杜绝错误4.1 牢记Hooks三大核心调用规则刻入编码习惯4.2 开启ESLint的React Hooks校验规则编码阶段拦截错误快速配置步骤4.3 自定义Hooks严格遵循**use开头**命名规范4.4 统一管理React版本锁定依赖版本示例锁定18.2.0版本4.5 异步逻辑/条件逻辑**内聚到Hooks内部**不包裹Hooks4.6 类组件与函数组件**严格分离**不混用状态体系五、总结一、核心认知Hooks的工作原理与核心调用规则要解决Hooks的无效调用错误必须先理解React Hooks的底层工作原理这是所有解决方案的基础该错误的本质是违背了Hooks的调用规则导致React的Hooks调用栈追踪机制失效无法将Hooks状态与对应的组件实例绑定。1.1 Hooks的核心工作原理React Hooks的本质是为函数组件提供状态管理和生命周期能力的函数集合其底层依赖有序的调用栈和Fiber节点实现状态追踪核心执行逻辑如下函数组件开始渲染 ↓ React为当前组件实例创建专属的Fiber节点初始化Hooks调用栈 ↓ 按**从上到下的顺序**执行组件顶层的Hooks调用如useState、useEffect ↓ React将每个Hooks的状态、依赖、回调等信息**按调用顺序**存储到Fiber节点中 ↓ 组件重渲染时再次按相同顺序执行Hooks调用React通过调用栈匹配对应状态 ↓ 状态更新触发组件重新渲染Hooks状态与组件实例保持一一对应核心结论React Hooks的状态管理完全依赖固定的调用顺序一旦调用顺序被破坏如条件判断中调用或调用环境错误如类组件、普通函数React就无法匹配Hooks与组件实例的关联直接抛出Invalid hook call错误。1.2 Hooks的三大必守核心调用规则这是React官方明确规定的Hooks使用准则100%的Invalid hook call错误都是因为违背了其中一条或多条React 16.8所有版本完全通用是开发中必须刻入习惯的基础规则规则1仅在React函数组件中调用HooksHooks是为函数组件设计的特性禁止在类组件class Component中调用任何Hooks如useState、useEffect类组件需通过state、生命周期方法实现对应功能两者无法混用。规则2仅在自定义Hooks的顶层作用域调用Hooks自定义Hooks必须以use开头React官方命名规范用于标识这是一个可调用其他Hooks的特殊函数无论是函数组件还是自定义Hooks所有Hooks必须在顶层作用域调用禁止在条件判断、循环、嵌套函数、try/catch中调用确保组件每次渲染时Hooks的调用顺序完全一致。规则3确保Hooks在同一个React实例中使用且React与React DOM版本严格匹配项目中若存在多个React实例如npm包重复安装ReactHooks会因跨实例调用无法绑定组件Fiber节点触发错误React与React DOM的版本必须严格一致如均为18.2.0版本不匹配会导致底层Hooks执行机制冲突引发无效调用。1.3 Hooks合法/非法调用场景对比表为快速区分Hooks的正确与错误使用方式以下表格清晰对比合法调用场景与非法调用场景覆盖99%的开发场景可直接作为开发参考调用场景合法/非法示例React函数组件顶层合法function App() { const [count, setCount] useState(0); return div / }以use开头的自定义Hooks顶层合法function useRequest() { const [data, setData] useState(null); return { data } }类组件的render/生命周期中非法class App extends Component { render() { useState(0); return div / } }条件判断if/else中非法function App() { if (true) { useState(0); } return div / }循环for/forEach中非法function App() { [1,2].forEach(() { useState(0); }); return div / }嵌套函数/事件处理函数中非法function App() { const handleClick () { useEffect(() {}, []); }; return button onClick{handleClick} / }异步回调/定时器/axios请求中非法function App() { setTimeout(() { useState(0); }, 1000); return div / }普通工具函数非use开头中非法function requestData() { const [loading, setLoading] useState(false); }组件渲染之外的全局作用域非法const [count, setCount] useState(0); function App() { return div / }核心原则判断Hooks调用是否合法只需看调用环境和调用位置——是否为函数组件/自定义Hooks是否在顶层作用域满足则合法否则必然触发错误。二、典型错误场景按出现频率排序附错误修复代码Invalid hook call错误的场景按新手出现频率从高到低排序覆盖所有常见的Hooks误用场景每个场景标注错误表现、错误代码、核心原因、通用修复代码适配React 16.8所有版本你可直接对号入座快速修复。2.1 在条件/循环/嵌套函数中调用Hooks最高频错误表现浏览器控制台直接抛出Uncaught Error: Invalid hook call. Hooks can only be called inside of the body of a function component.组件无法渲染页面白屏报错栈指向条件判断/循环/嵌套函数中的Hooks调用行。错误代码三大非法调用位置示例import React, { useState, useEffect } from react; function App() { const [flag, setFlag] useState(true); // 错误1在条件判断中调用Hooks if (flag) { const [count, setCount] useState(0); } // 错误2在循环中调用Hooks for (let i 0; i 2; i) { useEffect(() { console.log(循环中调用useEffect); }, []); } // 错误3在嵌套函数/事件处理函数中调用Hooks const handleClick () { const [msg, setMsg] useState(hello); }; return ( div button onClick{handleClick}点击/button /div ); } export default App;核心原因React Hooks依赖固定不变的调用顺序实现状态追踪条件判断、循环会导致组件每次渲染时Hooks的调用数量/顺序不一致嵌套函数/事件处理函数中的Hooks调用会脱离组件的顶层调用栈React无法将这些Hooks与组件Fiber节点绑定直接判定为无效调用。修复代码将Hooks移至顶层逻辑内聚到Hooks内部核心方案所有Hooks一律移至函数组件/自定义Hooks的顶层作用域若需要根据条件执行Hooks逻辑如条件渲染、条件请求将条件判断写在Hooks内部而非包裹Hooks调用。import React, { useState, useEffect } from react; function App() { // 正确所有Hooks移至组件顶层保证调用顺序固定 const [flag, setFlag] useState(true); const [count, setCount] useState(0); const [msg, setMsg] useState(hello); // 正确将条件逻辑写在useEffect内部而非包裹useEffect useEffect(() { if (flag) { console.log(根据条件执行useEffect逻辑); } }, [flag]); // 依赖flag实现条件触发 // 事件处理函数仅使用Hooks定义的状态不调用Hooks const handleClick () { setMsg(hello React); setCount(prev prev 1); }; return ( div p{count} - {msg}/p button onClick{handleClick}点击/button button onClick{() setFlag(!flag)}切换flag/button /div ); } export default App;2.2 在类组件中调用Hooks高频错误表现控制台抛出Invalid hook call错误组件无法渲染报错栈指向类组件的render方法或生命周期如componentDidMount中的Hooks调用行是Vue开发者转React的高频习惯错误。错误代码类组件中调用useState/useEffectimport React, { Component, useState, useEffect } from react; // 错误在类组件中调用Hooks class App extends Component { render() { // 类组件中调用useState直接触发错误 const [count, setCount] useState(0); return ( div p{count}/p button onClick{() setCount(count 1)}1/button /div ); } componentDidMount() { // 类组件生命周期中调用useEffect同样触发错误 useEffect(() { console.log(组件挂载); }, []); } } export default App;核心原因React的Hooks和类组件是两套相互独立的状态管理体系类组件通过this.state管理状态通过componentDidMount、componentDidUpdate等生命周期方法实现副作用Hooks是为函数组件设计的特性底层未实现与类组件Fiber节点的绑定逻辑类组件中调用Hooks会被React直接判定为无效调用。修复代码二选一类组件改用状态/生命周期 | 类组件重构为函数组件提供两种修复方案按项目开发规范选择方案2为React官方推荐函数组件Hooks是React未来的开发趋势方案1类组件使用原生state/生命周期移除Hooks保留类组件写法将Hooks替换为类组件的原生特性实现相同功能import React, { Component } from react; class App extends Component { // 类组件使用this.state定义状态替代useState state { count: 0 }; // 类组件使用componentDidMount实现副作用替代useEffect componentDidMount() { console.log(组件挂载); } render() { const { count } this.state; return ( div p{count}/p {/* 类组件使用this.setState更新状态 */} button onClick{() this.setState({ count: count 1 })}1/button /div ); } } export default App;方案2将类组件重构为函数组件使用Hooks推荐重构为React函数组件使用Hooks实现状态管理和副作用符合现代React开发规范import React, { useState, useEffect } from react; // 正确函数组件中调用Hooks function App() { const [count, setCount] useState(0); useEffect(() { console.log(组件挂载); }, []); return ( div p{count}/p button onClick{() setCount(count 1)}1/button /div ); } export default App;2.3 自定义Hooks未以use开头内部调用Hooks高频错误表现控制台抛出Invalid hook call错误报错栈指向普通工具函数中的Hooks调用行组件无法渲染若工具函数被多次调用还可能导致Hooks状态混乱。错误代码普通函数中调用Hooks未按use命名import React, { useState, useEffect } from react; // 错误普通工具函数非use开头中调用Hooks function requestData() { const [data, setData] useState(null); const [loading, setLoading] useState(false); const fetch async () { setLoading(true); const res await fetch(/api/list); setData(res.data); setLoading(false); }; useEffect(() { fetch(); }, []); return { data, loading }; } function App() { // 调用普通函数内部Hooks触发无效调用错误 const { data, loading } requestData(); return ( div {loading ? 加载中 : JSON.stringify(data)} /div ); } export default App;核心原因React通过函数名是否以use开头来标识自定义Hooks这是官方强制的命名规范而非单纯的约定。非use开头的函数会被React判定为普通工具函数普通函数中调用Hooks会脱离组件的调用栈React无法追踪Hooks的状态触发无效调用错误。修复代码自定义Hooks严格以use开头遵循命名规范核心方案所有内部调用Hooks的函数必须以use开头命名成为合法的自定义Hooks可在函数组件/其他自定义Hooks中自由调用import React, { useState, useEffect } from react; // 正确自定义Hooks以use开头内部可合法调用Hooks function useRequest() { const [data, setData] useState(null); const [loading, setLoading] useState(false); const fetchData async () { setLoading(true); // 模拟接口请求 const res { data: [{ id: 1, name: 测试数据 }] }; setData(res.data); setLoading(false); }; useEffect(() { fetchData(); }, []); return { data, loading }; } function App() { // 正确函数组件中调用自定义Hooks const { data, loading } useRequest(); return ( div {loading ? 加载中 : JSON.stringify(data)} /div ); } export default App;补充自定义Hooks的核心价值是状态逻辑复用多个组件调用同一个自定义Hooks时各自的状态相互独立不会互相影响。2.4 React与React DOM版本不匹配/项目存在多个React实例中高频错误表现控制台抛出Invalid hook call错误且报错信息中包含Hooks can only be called when React is rendering a component或Multiple instances of React found组件无法渲染项目本地开发正常打包部署后触发错误或引入第三方组件库后触发错误是易被忽略的环境配置错误。错误代码无代码错误环境配置问题// 代码无任何问题函数组件顶层合法调用Hooks import React, { useState } from react; import ReactDOM from react-dom/client; function App() { const [count, setCount] useState(0); return p{count}/p; } // 若React和React DOM版本不一致此处渲染会触发错误 const root ReactDOM.createRoot(document.getElementById(root)); root.render(App /);核心原因该错误是环境配置问题非代码写法问题核心原因有两个React与React DOM版本不匹配如React为18.2.0React DOM为16.8.0底层Hooks的执行机制、Fiber节点设计不一致导致Hooks调用失败项目存在多个React实例如项目根目录和第三方组件库各自安装了ReactHooks在一个React实例中定义却在另一个实例中调用跨实例无法绑定组件Fiber节点触发错误。修复代码环境配置修复无业务代码修改提供针对性的修复步骤按顺序执行可彻底解决版本/多实例问题步骤1检查并统一React与React DOM版本打开项目根目录的package.json查看react和react-dom的版本确保两者完全一致若不一致执行以下命令统一版本以18.2.0为例可根据项目需求修改# 卸载现有版本npmuninstall react react-dom# 安装指定版本的React和React DOM确保版本一致npminstallreact18.2.0 react-dom18.2.0# yarn用户执行yarnremove react react-domyarnaddreact18.2.0 react-dom18.2.0步骤2解决项目多React实例问题若版本一致仍报错说明项目存在多个React实例通过npm link将第三方组件库的React指向项目根目录的React消除多实例# 进入项目根目录将React链接到全局cd你的项目根目录npmlink./node_modules/react# 若使用React DOM同时链接npmlink./node_modules/react-dom步骤3清除依赖缓存重新安装依赖# 清除npm缓存npmcache clean --force# 删除node_modules和锁文件rm-rf node_modules package-lock.json# 重新安装依赖npminstall2.5 在异步回调/定时器/外部请求中调用Hooks中高频错误表现控制台抛出Invalid hook call错误报错栈指向setTimeout、setInterval、axios/fetch异步回调中的Hooks调用行是新手对Hooks调用时机的常见误解。错误代码异步回调/定时器中调用useState/useEffectimport React from react; import axios from axios; function App() { // 错误1在定时器中调用useState setTimeout(() { const [count, setCount] useState(0); setCount(1); }, 1000); // 错误2在axios异步回调中调用useEffect const fetchData async () { const res await axios.get(/api/list); if (res.data) { useEffect(() { console.log(数据请求成功); }, []); } }; return ( div button onClick{fetchData}请求数据/button /div ); } export default App;核心原因Hooks的调用时机必须与组件的渲染周期同步只能在组件渲染/重渲染的顶层作用域调用而异步回调、定时器的执行时机脱离了组件的渲染周期此时React的Hooks调用栈已销毁无法将Hooks与组件实例绑定触发无效调用错误。修复代码Hooks移至顶层异步逻辑内聚到Hooks内部核心方案将Hooks移至组件顶层定义异步逻辑写在Hooks内部或事件处理函数中仅在Hooks/事件处理函数中使用Hooks定义的状态/方法不调用新的Hooks。import React, { useState, useEffect } from react; import axios from axios; function App() { // 正确Hooks移至组件顶层提前定义 const [count, setCount] useState(0); const [data, setData] useState(null); // 正确定时器逻辑写在useEffect内部仅使用已定义的setCount useEffect(() { const timer setTimeout(() { setCount(1); // 仅调用Hooks的更新方法不创建新Hooks }, 1000); // 清除定时器避免内存泄漏 return () clearTimeout(timer); }, []); // 正确异步请求中仅使用已定义的setData不调用新Hooks const fetchData async () { try { const res await axios.get(/api/list); setData(res.data); // 使用Hooks的更新方法 console.log(数据请求成功); } catch (err) { console.error(请求失败, err); } }; return ( div pcount: {count}/p pdata: {JSON.stringify(data)}/p button onClick{fetchData}请求数据/button /div ); } export default App;2.6 将函数组件当作普通函数调用而非组件渲染低频错误表现控制台抛出Invalid hook call错误组件无法渲染报错栈指向普通函数调用的行项目中存在组件嵌套调用时易触发是对React组件渲染规则的误解。错误代码将函数组件当作普通函数调用import React, { useState } from react; // 函数组件内部合法调用Hooks function Child() { const [msg, setMsg] useState(子组件消息); return p{msg}/p; } function App() { // 错误将函数组件当作普通函数调用而非通过JSX渲染 const child Child(); // 直接调用函数触发Hooks无效调用 return ( div {child} /div ); } export default App;核心原因React函数组件只有通过JSX语法Child /或React.createElement(Child)渲染时才会被React识别为组件创建对应的Fiber节点并初始化Hooks调用栈若将函数组件当作普通函数直接调用Child()其内部的Hooks会在普通函数环境中执行脱离React的组件渲染机制触发无效调用错误。修复代码通过JSX语法正常渲染函数组件核心方案所有React函数组件必须通过JSX语法渲染禁止当作普通函数直接调用这是React组件的基础渲染规则import React, { useState } from react; function Child() { const [msg, setMsg] useState(子组件消息); return p{msg}/p; } function App() { // 正确通过JSX语法渲染函数组件React会自动初始化Hooks调用栈 return ( div Child / /div ); } export default App;三、系统化排查步骤从简单到复杂一键定位问题如果你的Invalid hook call错误场景不在上述典型错误中可按从简单到复杂、先查代码写法再查环境配置、先看控制台完整报错再验调用规则的步骤逐一排查适配React 16.8所有版本快速定位问题根源步骤1查看控制台完整报错信息提取关键线索React的Invalid hook call错误会给出详细的错误原因提示如“Multiple instances of React found”“Hooks called inside conditional”优先根据报错提示定位问题这是最高效的排查方式。步骤2检查Hooks的调用位置是否违背顶层调用规则全局搜索项目中的Hooks调用useState、useEffect、useRef等确认是否在条件判断、循环、嵌套函数、异步回调中调用若有则直接移至组件/自定义Hooks的顶层作用域。步骤3检查Hooks的调用环境是否为合法载体确认Hooks的调用环境是否为函数组件或以use开头的自定义Hooks若在类组件、普通工具函数、全局作用域中调用则直接修改调用环境。步骤4检查自定义Hooks命名是否遵循use开头规范确认所有内部调用Hooks的函数是否严格以use开头命名若未遵循则修改函数名成为合法的自定义Hooks。步骤5验证组件渲染方式是否通过JSX语法渲染检查是否存在将函数组件当作普通函数直接调用的情况若有则改为JSX语法Component /渲染。步骤6检查React与React DOM版本是否严格一致打开package.json查看react和react-dom的版本号若不一致则执行统一版本命令若版本一致仍报错按2.4节步骤解决多React实例问题。步骤7清除依赖缓存重新安装依赖若以上步骤均无问题执行npm cache clean --force清除缓存删除node_modules和锁文件后重新安装依赖解决依赖包损坏/冲突问题。步骤8排查第三方组件库是否引入不兼容的库若在引入某第三方组件库后触发错误说明该组件库可能存在Hooks误用或版本不兼容问题可更换组件库版本或替换为其他兼容的库。四、永久避坑技巧遵循编码规范从源头杜绝错误掌握以下React Hooks专属编码规范彻底摒弃错误的使用习惯从编码阶段就拦截Invalid hook call错误适配所有React 16.8项目开发4.1 牢记Hooks三大核心调用规则刻入编码习惯将**“仅函数组件/自定义Hooks顶层调用、React与React DOM版本一致”** 作为开发准则开发时先判断调用环境/位置是否合法再编写Hooks代码而非先写代码再报错修改。4.2 开启ESLint的React Hooks校验规则编码阶段拦截错误在项目中配置eslint-plugin-react-hooks插件开启Hooks调用规则校验在VSCode等编辑器中实时提示错误避免运行时报错这是React官方推荐的必配插件。快速配置步骤# 安装插件npminstalleslint-plugin-react-hooks --save-dev在.eslintrc.js中添加规则module.exports{plugins:[react-hooks],rules:{// 强制Hooks在顶层调用禁止在条件/循环中调用react-hooks/rules-of-hooks:error,// 强制Hooks依赖数组完整避免遗漏依赖react-hooks/exhaustive-deps:warn}};4.3 自定义Hooks严格遵循use开头命名规范无论自定义Hooks的功能多简单只要内部调用了Hooks必须以use开头命名不仅是为了符合React规范也是为了让团队其他开发者快速识别这是一个自定义Hooks避免当作普通函数调用。4.4 统一管理React版本锁定依赖版本在package.json中锁定react和react-dom的版本避免使用^~等版本通配符确保团队所有成员、开发/测试/生产环境的React版本完全一致避免因版本不一致导致的Hooks调用错误。示例锁定18.2.0版本{dependencies:{react:18.2.0,react-dom:18.2.0}}4.5 异步逻辑/条件逻辑内聚到Hooks内部不包裹Hooks开发时若需要实现条件渲染、异步请求、定时器等功能始终将Hooks移至顶层将业务逻辑写在Hooks如useEffect、useCallback内部或事件处理函数中仅在其中使用Hooks定义的状态/方法不创建新的Hooks。4.6 类组件与函数组件严格分离不混用状态体系项目开发中建议统一技术栈要么使用类组件state/生命周期要么使用函数组件Hooks避免在一个项目中混用两套体系减少因习惯问题导致的Hooks误用。React官方推荐优先使用函数组件Hooks。五、总结React报Uncaught Error: Invalid hook call的错误100%并非React自身的缺陷而是违背了Hooks「仅函数组件/自定义Hooks顶层调用、React与React DOM版本匹配」的核心调用规则React 16.8至React 18的所有版本中Hooks的核心调用规则、底层工作原理完全一致仅环境配置的细微差异。核心根源Hooks调用环境错误类组件、普通函数、调用位置错误条件/循环/异步、自定义Hooks命名不规范、React版本不匹配/多实例导致React无法追踪Hooks的调用栈和组件实例关联高频错误点在条件/循环/嵌套函数中调用Hooks、在类组件中调用Hooks、自定义Hooks未以use开头、React与React DOM版本不匹配核心排查思路先看控制台完整报错→检查Hooks调用位置/环境→验证自定义Hooks命名→校验React版本→排查组件渲染方式按步骤缩小排查范围核心解决方案将Hooks移至组件/自定义Hooks顶层、类组件改用state/生命周期或重构为函数组件、自定义Hooks以use开头、统一React与React DOM版本、通过JSX语法渲染函数组件源头避坑牢记Hooks三大调用规则、开启ESLint Hooks校验、锁定React版本、异步/条件逻辑内聚到Hooks内部、类组件与函数组件严格分离。遵循以上规则和方案能彻底解决React Hooks的无效调用错误同时让Hooks代码更规范、更易维护适配所有React 16.8的开发场景充分发挥Hooks在状态逻辑复用、组件简化开发中的优势。【专栏地址】更多 JS实战BUG调试、前端性能优化、工程化解决方案欢迎订阅我的 CSDN 专栏全栈BUG解决方案