函数组件没有实例与混入机制,逻辑复用全靠自定义 Hook。约定以 use 开头的函数,内部调用其他 hooks,把状态与操作返回给调用方。它不是 API,只是一种代码组织方式:useFetch、useDebounce、useLocalStorage 这类轮子每天都在救场,且天然没有 Provider 嵌套地狱问题。
写好自定义 Hook 有两条底线:每次渲染必须以相同顺序调用 hooks(遵守规则即可),返回值设计要稳定——返回函数优先用 useCallback 包裹,否则调用方配合 memo 优化时会失效。命名一定用 use 开头,否则 eslint 插件无法帮你做规则校验。
import { useState, useEffect } from 'react'; function useOnline() { // 自定义 Hook:监听网络状态 const [online, setOnline] = useState(navigator.onLine); useEffect(() => { const on = () => setOnline(true); const off = () => setOnline(false); window.addEventListener('online', on); window.addEventListener('offline', off); return () => { window.removeEventListener('online', on); window.removeEventListener('offline', off); }; }, []); return online; } function StatusBar() { const online = useOnline(); return <p>{online ? '网络正常' : '已断网,请检查连接'}</p>; }