# React Hooks 的优势和使用场景
## 1. 代码复用性提升
- **自定义Hook封装逻辑**:可将组件逻辑提取到可重用的函数中
```javascript
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;
}
// 在任何组件中使用:const { width, height } = useWindowSize();
- 替代HOC和Render Props:避免组件嵌套地狱
withRouter(connect(MyComponent))
const router = useRouter()
const store = useStore()
2. 逻辑关注点分离
function FriendStatus({ friendId }) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
const handleStatusChange = (status) => setIsOnline(status.isOnline);
ChatAPI.subscribe(friendId, handleStatusChange);
return () => ChatAPI.unsubscribe(friendId, handleStatusChange);
}, [friendId]);
return isOnline ? 'Online' : 'Offline';
}
3. 性能优化更精细
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]);
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
4. 生命周期简化
useEffect(() => {
}, []);
useEffect(() => {
});
useEffect(() => {
return () => {
};
}, []);
5. 状态管理更灵活
- useReducer处理复杂状态:类似Redux的reducer模式
function todosReducer(state, action) {
switch (action.type) {
case 'add':
return [...state, action.payload];
default:
return state;
}
}
function Todos() {
const [todos, dispatch] = useReducer(todosReducer, []);
}
6. 使用场景指南
- 表单处理:useState + useEffect
function Form() {
const [values, setValues] = useState({});
const handleChange = (e) => {
setValues({
...values,
[e.target.name]: e.target.value
});
};
}
- 数据获取:useEffect + useState
function useFetch(url) {
const [data, setData] = useState(null);
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(setData);
}, [url]);
return data;
}
- 动画效果:useRef + useEffect
function FadeIn({ children }) {
const ref = useRef(null);
useEffect(() => {
const node = ref.current;
node.style.transition = 'opacity 1s';
node.style.opacity = 1;
}, []);
return <div ref={ref} style={{opacity: 0}}>{children}</div>;
}
- 全局状态共享: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' }}>
}
7. 注意事项