React 自定义 Hook

假如有两个组件都需要获取网络状态,我们可以取逻辑到自定义 Hook 中,避免代码重复

js 复制代码
import { useOnlineStatus } from './useOnlineStatus.js';

function StatusBar() {
  const isOnline = useOnlineStatus();
  return <h1>{isOnline ? '✅ Online' : '❌ Disconnected'}</h1>;
}

function SaveButton() {
  const isOnline = useOnlineStatus();
  function handleSaveClick() {
    console.log('✅ Progress saved');
  }
  return (
    <button disabled={!isOnline} onClick={handleSaveClick}>
      {isOnline ? 'Save progress' : 'Reconnecting...'}
    </button>
  );
}

export default function App() {
  return (
    <>
      <SaveButton />
      <StatusBar />
    </>
  );
}

// useOnlineStatus.js 自定义 Hook
import { useState, useEffect } from 'react';

export function useOnlineStatus() {
  const [isOnline, setIsOnline] = useState(true);
  useEffect(() => {
    function handleOnline() {
      setIsOnline(true);
    }
    function handleOffline() {
      setIsOnline(false);
    }
    window.addEventListener('online', handleOnline);
    window.addEventListener('offline', handleOffline);
    return () => {
      window.removeEventListener('online', handleOnline);
      window.removeEventListener('offline', handleOffline);
    };
  }, []);
  return isOnline;
}
Hook 的名称必须以 use 开头,然后紧跟一个大写字母,就像内置的 useState 或者示例 useOnlineStatus 一样。Hook 可以返回任意值。
自定义 Hook 共享的是状态逻辑,而不是状态本身 。对 Hook 的每个调用完全独立于对同一个 Hook 的其他调用。
每当组件重新渲染,自定义 Hook 中的代码就会重新运行。所以自定义 Hook 可以一直接收到最新的 props 和 state。
相关推荐
小陈工3 分钟前
Python Web开发入门(十二):使用Flask-RESTful构建API——让后端开发更优雅
开发语言·前端·python·安全·oracle·flask·restful
木斯佳4 分钟前
前端八股文面经大全:字节前端一面(2026-04-03)·面经深度解析
前端·面试题·面经
xiaotao13110 分钟前
第八章:实战项目案例
前端·vue.js·vite·前端打包
GISer_Jing11 分钟前
Electron 全场景调试实战指南
javascript·electron·状态模式
We་ct13 分钟前
JS手撕:性能优化、渲染技巧与定时器实现
开发语言·前端·javascript·面试·性能优化·定时器·性能
taWSw5OjU22 分钟前
vue对接海康摄像头-H5player
开发语言·前端·javascript
huwuhang33 分钟前
跨平台电子书阅读器 | Readest最新版 安卓版+PC版全平台
android·前端·javascript
C澒34 分钟前
AI 生码:RAG 检索优化实现可评估、可回溯工程化
前端·ai编程
Shirley~~34 分钟前
力扣hot100:每日温度
开发语言·javascript·ecmascript
条tiao条35 分钟前
不止语法糖:TypeScript Set 与 Map 深度解析
前端·javascript·typescript