React 为什么要自定义 Hooks?

历史相关文章2024年:
React 为什么引入 Hooks ?
React 中,Hook 是一个特定的概念

自定义 Hook(Custom Hook)在 React 中相当于:

✅ 一个可以复用的逻辑片段,封装了多个内置 Hooks 的组合和行为

1.类比理解

自定义 Hook 相当于 说明
🔁 可复用的逻辑函数 封装了 useState / useEffect / useRef 等逻辑,用来复用状态、事件、生命周期
🧩 逻辑组件(但没有 UI) 和组件很像,但它不返回 JSX,只处理逻辑
🧰 React 的逻辑工具函数 让你把组件逻辑分离出来,避免重复和臃肿

2. 为什么用自定义 Hook?

在实际开发中,组件里状态管理 + 副作用处理容易混乱和重复。自定义 Hook 可以让你:

  • 分离逻辑:把复杂逻辑提取成独立的函数。

  • 复用逻辑:多个组件共用同样的逻辑(如登录检测、滚动监听、节流防抖等)。

  • 减少重复:避免 copy-paste 多段 useEffect/useState。

3. demo

React 组件中经常会出现 很多状态(useState) 和 副作用(useEffect)

比如你一个页面组件:

c 复制代码
function UserPage() {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  useEffect(() => {
    setLoading(true);
    fetchUserData()
      .then(res => setUser(res))
      .catch(err => setError(err))
      .finally(() => setLoading(false));
  }, []);
  
  return (
    <div>
      {loading && <p>加载中...</p>}
      {error && <p>出错了: {error.message}</p>}
      {user && <p>欢迎,{user.name}</p>}
    </div>
  );
}
  • 问题一:代码堆积,逻辑不清晰

    useState 很多,变量之间关联不直观。

    useEffect 中网络请求逻辑、异常处理混在组件里,影响可读性。

  • 问题二:多个组件中写了重复逻辑

    假设你还有另一个组件也需要请求用户数据,就得复制那堆 useState + useEffect 逻辑

  • 怎么解决?

    💡 用 自定义 Hook 把这些状态管理和副作用逻辑封装起来:

c 复制代码
function useUserData() {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  useEffect(() => {
    setLoading(true);
    fetchUserData()
      .then(setUser)
      .catch(setError)
      .finally(() => setLoading(false));
  }, []);

  return { user, loading, error };
}

在组件中调用

c 复制代码
function UserPage() {
  const { user, loading, error } = useUserData();
  ...
}

4. 总结

自定义 Hook 本质是 用途
function useXXX() { ... } 把多个 Hook 组合封装为复用逻辑
不返回 JSX,只返回数据或方法 用于组件中调用
让组件更干净、逻辑更清晰 提高可维护性、可读性
相关推荐
泯泷4 小时前
第 2 篇:设计第一套字节码:Opcode、Instruction 与 Constant Pool
前端·javascript·安全
泯泷4 小时前
第 1 篇:从 1 + 2 开始:亲手写出第一台 JSVM
前端·javascript·安全
朦胧之5 小时前
页面白屏卡住排查方法
前端·javascript
Ruihong5 小时前
Vue withDefaults 转 React:VuReact 怎么处理?
vue.js·react.js·面试
犇驫聊AI5 小时前
Chrome DevTools MCP + Claude Code 自定义skills生成接口代码生成器
前端·javascript
kyriewen6 小时前
别再这样写 async/await 了:我在 Code Review 中见过最多的 8 个错误
前端·javascript·面试
用户2986985301410 小时前
在 React 中使用 JavaScript 将 Excel 转换为 SVG
前端·javascript·react.js
labixiong11 小时前
手写Promise--微任务、静态方法、async/await 全搞懂(三)
前端·javascript
铁皮饭盒12 小时前
3行代码搞定页面截图,Bun.WebView真的简单
javascript
kyriewen1 天前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试