靠谱的定制软件开发公司
2026/5/13 5:15:28
—— 从「this 丢失」到「性能飙红」的实战手册
一句话总结:用「箭头函数 + useCallback + 传参模板」三件套,让事件绑定既安全又高性能!
React 事件绑定容易踩坑:
this丢失 → 控制台红线// ❌ this 丢失 class Btn extends React.Component { handleClick() { console.log(this); // undefined } render() { return <button onClick={this.handleClick}>Click</button>; } }修复:箭头函数属性
class Btn extends React.Component { handleClick = () => { // ✅ 箭头函数自动绑定 console.log(this); }; render() { return <button onClick={this.handleClick}>Click</button>; } }// ❌ 每次 render 都是新函数 return <Button onClick={() => handleClick(id)}>Click</button>;修复:useCallback 缓存
const handleClick = useCallback((id) => { // 逻辑 }, [id]); return <Button onClick={handleClick}>Click</button>;// ❌ 死循环:依赖自己 useEffect(() => { handleClick(id); }, [id, handleClick]); // handleClick 依赖 id → 死循环修复:传参模板
const handleClick = useCallback((id) => { // 逻辑 }, []); return <Button onClick={() => handleClick(id)}>Click</button>;// ❌ 循环里当场定义 items.map(item => ( <Button key={item.id} onClick={() => handleClick(item.id)}>Click</Button> ));修复:传参模板 + 白名单
const handleClick = useCallback((id) => { // 逻辑 }, []); items.map(item => ( <Button key={item.id} onClick={() => handleClick(item.id)}>Click</Button> ));// ❌ 事件未清理 useEffect(() => { const handleResize = () => setWidth(window.innerWidth); window.addEventListener('resize', handleResize); }, []);修复:返回清理函数
useEffect(() => { const handleResize = () => setWidth(window.innerWidth); window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize); // ✅ 清理 }, []);| 场景 | 模板 |
|---|---|
| 单事件 | const handleClick = useCallback(() => {逻辑}, [deps]); |
| 传参事件 | const handleClick = useCallback((id) => {逻辑}, [deps]); |
| 循环事件 | onClick={() => handleClick(item.id)} |
| 事件清理 | return () => cleanup(); |
| 策略 | 渲染次数 | 帧率 | 现象 |
|---|---|---|---|
| 内联函数 | 200+ | 15fps | 红点 |
| useCallback + 传参模板 | 5 | 60fps | 零红点 |
useCallback + 传参模板:渲染次数下降 90%,零红点。
「事件绑定错误」= this 丢失 + 内联函数 + 未清理。」
用「箭头函数 + useCallback + 传参模板」三件套,让事件绑定既安全又高性能,永远零红线!
最后问候亲爱的朋友们,并邀请你们阅读我的全新著作
📚 《 React开发实践:掌握Redux与Hooks应用 》