React Hooks完全指南:从基础到进阶

React Hooks完全指南:从基础到进阶

大家好,我是蔓蔓。React Hooks是React 16.8引入的一个革命性特性,它让我们能够在函数组件中使用状态和其他React特性。今天我来和大家分享React Hooks的完整用法。

基础Hooks

useState

javascript 复制代码
import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);
  const [name, setName] = useState('蔓蔓');

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      <input 
        value={name} 
        onChange={(e) => setName(e.target.value)} 
      />
    </div>
  );
}

useEffect

javascript 复制代码
import { useState, useEffect } from 'react';

function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchUser = async () => {
      setLoading(true);
      const response = await fetch(`/api/users/${userId}`);
      const data = await response.json();
      setUser(data);
      setLoading(false);
    };

    fetchUser();

    // 清理函数
    return () => {
      console.log('Cleanup');
    };
  }, [userId]); // 依赖数组

  if (loading) return <div>Loading...</div>;
  
  return <div>{user.name}</div>;
}

useContext

javascript 复制代码
import { createContext, useContext } from 'react';

const ThemeContext = createContext('light');

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

function Toolbar() {
  const theme = useContext(ThemeContext);
  return <div>Theme: {theme}</div>;
}

进阶Hooks

useReducer

javascript 复制代码
import { useReducer } from 'react';

const initialState = { count: 0 };

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    case 'reset':
      return initialState;
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
      <button onClick={() => dispatch({ type: 'reset' })}>Reset</button>
    </div>
  );
}

useCallback和useMemo

javascript 复制代码
import { useState, useCallback, useMemo } from 'react';

function expensiveCalculation(num) {
  console.log('Calculating...');
  return num * 2;
}

function App() {
  const [count, setCount] = useState(0);
  const [name, setName] = useState('');

  // useMemo - 缓存计算结果
  const doubled = useMemo(() => expensiveCalculation(count), [count]);

  // useCallback - 缓存函数引用
  const handleClick = useCallback(() => {
    console.log('Clicked:', count);
  }, [count]);

  return (
    <div>
      <p>Count: {count}</p>
      <p>Doubled: {doubled}</p>
      <button onClick={() => setCount(c => c + 1)}>Increment</button>
      <input 
        value={name} 
        onChange={(e) => setName(e.target.value)} 
        placeholder="Name"
      />
      <button onClick={handleClick}>Log</button>
    </div>
  );
}

useRef

javascript 复制代码
import { useRef, useEffect } from 'react';

function FocusInput() {
  const inputRef = useRef(null);

  useEffect(() => {
    inputRef.current.focus();
  }, []);

  return <input ref={inputRef} />;
}

// 存储可变值
function Timer() {
  const intervalRef = useRef(null);
  const [count, setCount] = useState(0);

  useEffect(() => {
    intervalRef.current = setInterval(() => {
      setCount(c => c + 1);
    }, 1000);

    return () => {
      clearInterval(intervalRef.current);
    };
  }, []);

  return <div>Count: {count}</div>;
}

自定义Hooks

javascript 复制代码
// useLocalStorage.js
import { useState, useEffect } from 'react';

export function useLocalStorage(key, initialValue) {
  const [storedValue, setStoredValue] = useState(() => {
    try {
      const item = window.localStorage.getItem(key);
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      console.error(error);
      return initialValue;
    }
  });

  useEffect(() => {
    try {
      window.localStorage.setItem(key, JSON.stringify(storedValue));
    } catch (error) {
      console.error(error);
    }
  }, [key, storedValue]);

  return [storedValue, setStoredValue];
}

// 使用
function App() {
  const [name, setName] = useLocalStorage('name', '蔓蔓');
  
  return (
    <input 
      value={name} 
      onChange={(e) => setName(e.target.value)} 
    />
  );
}

Hooks规则

javascript 复制代码
// ✅ 正确:在函数顶层调用
function GoodComponent() {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    console.log(count);
  });
  
  return <div>{count}</div>;
}

// ❌ 错误:在条件语句中调用
function BadComponent() {
  if (someCondition) {
    const [count, setCount] = useState(0); // ❌
  }
  
  return <div>Hello</div>;
}

// ✅ 正确:依赖数组包含所有依赖
function GoodEffect() {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    const timer = setInterval(() => {
      console.log(count);
    }, 1000);
    
    return () => clearInterval(timer);
  }, [count]);
  
  return <div>{count}</div>;
}

总结

React Hooks让函数组件更强大:

  1. useState管理状态
  2. useEffect处理副作用
  3. useContext跨组件传递数据
  4. useReducer管理复杂状态
  5. useCallback和useMemo优化性能
  6. 自定义Hooks复用逻辑

技术应当有温度,好的Hooks使用能让代码更简洁优雅。

相关推荐
Agent手记1 小时前
生产环节费用智能管控与超支预警方案:基于AGI智能体的精细化治理实践
运维·服务器·人工智能·ai·agi
中电金信1 小时前
中电金信智能数据挖掘助手,让数据分析像聊天一样简单
人工智能
AI浩1 小时前
UAV-DETR:面向反无人机目标检测的 DETR 框架
人工智能·目标检测·无人机
byte轻骑兵1 小时前
【LE Audio】CAP精讲[8]:CCID绑定术,打通音频流与控制的任督二脉
网络·人工智能·音视频·le audio·音视频控制
Artech1 小时前
[对比学习LangChain和MAF-01]基本编程模式的差异(上篇)
ai·langchain·agent·maf
smilejingwei1 小时前
智能问数(Text2SQL)工业级落地,纯 AI 黑盒方案都没戏
ai·text2sql·智能问数
晚霞的不甘1 小时前
CANN ATB 加速库深度解析:Transformer 模型的加速引擎
人工智能·pytorch·transformer
Gradpaper41 小时前
做PPT?不存在的。AI,上!
人工智能·论文·答辩
梵得儿SHI1 小时前
(第四篇)Spring AI 架构设计与优化:真实生产环境复盘,从 100ms 到 10ms 的响应提速全流程
人工智能·缓存·性能优化·milvus·向量检索·rag·spring ai