React Hooks 的优势和使用场景

30 阅读2分钟
# React Hooks 的优势和使用场景

## 1. React Hooks 的核心优势

### 1.1 逻辑复用更简单
- 传统方案:高阶组件(HOC)和render props会导致"嵌套地狱"
- Hooks方案:自定义Hook可提取组件逻辑,实现干净复用
```javascript
// 自定义Hook示例
function useWindowSize() {
  const [size, setSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight
  });

  useEffect(() => {
    const handleResize = () => setSize({
      width: window.innerWidth,
      height: window.innerHeight
    });
    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return size;
}

1.2 代码组织更清晰

  • 传统class组件:相关逻辑分散在不同生命周期
  • Hooks组件:按功能组织代码,相关逻辑集中处理
function UserProfile({ userId }) {
  // 用户数据相关逻辑
  const [user, setUser] = useState(null);
  useEffect(() => {
    fetchUser(userId).then(setUser);
  }, [userId]);

  // 用户偏好设置相关逻辑
  const [preferences, setPreferences] = useState({});
  useEffect(() => {
    fetchPreferences(userId).then(setPreferences);
  }, [userId]);

  // 渲染逻辑
  if (!user) return <Loading />;
  return <Profile user={user} preferences={preferences} />;
}

1.3 学习成本更低

  • 无需掌握class的this绑定问题
  • 无需理解复杂的生命周期方法
  • 函数式编程思维更符合现代JS发展趋势

2. 常用Hooks使用场景

2.1 useState - 状态管理

适用场景:

  • 组件内部状态管理
  • 表单控件状态
  • 简单的UI状态切换
function Counter() {
  const [count, setCount] = useState(0);
  return (
    <button onClick={() => setCount(c => c + 1)}>
      Clicked {count} times
    </button>
  );
}

2.2 useEffect - 副作用处理

适用场景:

  • 数据获取
  • 事件监听
  • DOM操作
  • 定时器管理
function DataFetcher({ url }) {
  const [data, setData] = useState(null);
  
  useEffect(() => {
    let isMounted = true;
    fetch(url)
      .then(res => res.json())
      .then(data => isMounted && setData(data));
    
    return () => { isMounted = false };
  }, [url]);

  return data ? <DataView data={data} /> : <Loading />;
}

2.3 useContext - 跨组件通信

适用场景:

  • 主题切换
  • 用户认证信息
  • 多语言支持
  • 全局配置
const ThemeContext = createContext('light');

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Toolbar() {
  const theme = useContext(ThemeContext);
  return <div style={{ background: theme === 'dark' ? '#333' : '#FFF' }}>
    Current theme: {theme}
  </div>;
}

2.4 useReducer - 复杂状态逻辑

适用场景:

  • 状态逻辑复杂
  • 下一个状态依赖前一个状态
  • 需要可预测的状态更新
function todosReducer(state, action) {
  switch (action.type) {
    case 'add':
      return [...state, { text: action.text, completed: false }];
    case 'toggle':
      return state.map((todo, i) => 
        i === action.index ? {...todo, completed: !todo.completed} : todo
      );
    default:
      return state;
  }
}

function TodoList() {
  const [todos, dispatch] = useReducer(todosReducer, []);
  
  function handleAdd(text) {
    dispatch({ type: 'add', text });
  }

  // 渲染逻辑...
}

3. 高级Hooks应用场景

3.1 useMemo - 性能优化

适用场景:

  • 计算昂贵的值
  • 避免子组件不必要的重渲染
function ExpensiveComponent({ a, b }) {
  const result = useMemo(() => {
    // 复杂计算
    return computeExpensiveValue(a, b