React Hooks 完全指南
· React, 前端, JavaScript
React Hooks 是 React 16.8 引入的新特性,它让你在不编写类组件的情况下使用 state 和其他 React 特性。
useState
useState 是最基础的 Hook,用于在函数组件中添加状态。
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
点击了 {count} 次
</button>
);
}
useEffect
useEffect 用于处理副作用,如数据获取、订阅、DOM 操作等。
import { useEffect, useState } from 'react';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
async function fetchUser() {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
setUser(data);
}
fetchUser();
}, [userId]); // 依赖数组
return user ? <div>{user.name}</div> : <div>加载中...</div>;
}
useCallback 和 useMemo
这两个 Hook 用于性能优化:
useCallback缓存函数useMemo缓存计算结果
import { useCallback, useMemo } from 'react';
function TodoList({ todos, filter }) {
// 缓存过滤后的结果
const filteredTodos = useMemo(() => {
return todos.filter(todo => todo.completed === filter);
}, [todos, filter]);
// 缓存回调函数
const handleToggle = useCallback((id) => {
// ...
}, []);
return (
<ul>
{filteredTodos.map(todo => (
<TodoItem key={todo.id} todo={todo} onToggle={handleToggle} />
))}
</ul>
);
}
自定义 Hook
你可以将重复的逻辑提取到自定义 Hook 中:
function useWindowSize() {
const [size, setSize] = useState({ width: 0, height: 0 });
useEffect(() => {
const handleResize = () => {
setSize({ width: window.innerWidth, height: window.innerHeight });
};
handleResize();
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return size;
}
总结
React Hooks 让函数组件变得更加强大和灵活。掌握这些 Hook 是成为优秀 React 开发者的必经之路。