React Hooks 性能优化实战:useCallback vs useEffect 解析

useCallback vs useEffect 的区别

1. useCallback 的作用

javascript 复制代码
const doFaceAuth = useCallback(() => {
  // 函数体
}, [dependencies]);
  • 目的缓存函数引用,避免每次渲染都创建新函数
  • 返回值 :返回一个函数
  • 执行时机不会自动执行,需要手动调用
  • 使用场景:作为事件处理器、传递给子组件的 props

2. useEffect 的作用

javascript 复制代码
useEffect(() => {
  // 副作用代码
}, [dependencies]);
  • 目的执行副作用(API调用、DOM操作、订阅等)
  • 返回值无返回值
  • 执行时机自动执行(组件挂载、依赖变化时)
  • 使用场景:数据获取、事件监听、清理工作

什么时候用 useEffect

✅ 适合 useEffect 的场景

javascript 复制代码
// 1. 数据获取
useEffect(() => {
  const fetchData = async () => {
    const res = await http.post('/api/wx/register/info/checkPharmacist');
    setPharmacist(res.data?.info);
  };
  fetchData();
}, []);

// 2. 事件监听
useEffect(() => {
  const handleResize = () => console.log('窗口大小变化');
  window.addEventListener('resize', handleResize);
  return () => window.removeEventListener('resize', handleResize);
}, []);

// 3. 定时器
useEffect(() => {
  const timer = setInterval(() => {
    console.log('定时执行');
  }, 1000);
  return () => clearInterval(timer);
}, []);

什么时候用 useCallback

✅ 适合 useCallback 的场景

javascript 复制代码
// 1. 事件处理器
const handleClick = useCallback(() => {
  console.log('用户点击了');
}, [someState]);

// 2. 传递给子组件的函数
const handleSubmit = useCallback((data) => {
  submitData(data);
}, [submitData]);

// 3. 依赖其他状态的函数
const calculateResult = useCallback(() => {
  return value1 + value2;
}, [value1, value2]);

总结

特性 useCallback useEffect
目的 缓存函数引用 执行副作用
执行 手动调用 自动执行
返回值 函数
适用场景 事件处理器、props传递 数据获取、监听、清理
相关推荐
benbenAItalk5 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885726 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12346 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
陈随易8 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周8 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师9 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing989 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
Highcharts.js9 小时前
常见报错排雷指南2:导出失败的官方解法
javascript·react.js·ecmascript·highcharts·可视化图表·导出模块失败·导出服务
EatFan9 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
梦想平凡10 小时前
百游棋牌源代码开发搭建教程(五):房间创建、座位分配与请求幂等实现
前端·javascript·数据库·源代码管理