大家好,我是小杨,一个摸爬滚打了6年的前端老司机。今天咱们来聊聊React里两个最常用的状态管理方式------setState
和useState
。虽然它们干的事儿差不多,但用起来可是有讲究的!
一、先说说setState
(Class组件版)
以前用Class组件写React的时候,setState
是我的好搭档。它有个特点: "异步更新" 。
举个🌰,我想记录点击按钮的次数:
jsx
class Counter extends React.Component {
state = { count: 0 };
handleClick = () => {
this.setState({ count: this.state.count + 1 });
console.log(this.state.count); // 🤦♂️ 这里打印的还是旧值!
};
render() {
return <button onClick={this.handleClick}>我点了 {this.state.count} 次</button>;
}
}
坑点注意:
-
setState
是"批量更新"的,连续调用多次可能会被合并 -
想拿到最新值?用回调函数形式:
jsthis.setState(prevState => ({ count: prevState.count + 1 }), () => { console.log('现在是最新值:', this.state.count); });
二、再聊聊useState
(函数组件Hook版)
自从Hook横空出世,函数组件也能有状态了!但useState
的玩法有点不一样:
js
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
console.log(count); // 😅 依然打印旧值!
};
return <button onClick={handleClick}>我点了 {count} 次</button>;
}
关键区别:
-
更新不会自动合并(需要用扩展运算符手动合并对象)
-
想拿到最新值?用函数式更新:
jssetCount(prevCount => prevCount + 1);
三、终极对比表格
特性 | setState (Class) | useState (Hook) |
---|---|---|
更新方式 | 自动合并对象 | 需要手动合并 |
获取最新值 | 用回调函数 | 用函数式更新 |
异步表现 | 批量更新 | 闭包问题(需要留意) |
代码量 | 啰嗦 | 简洁 |
四、我的实战建议
- 新项目直接用Hook:代码更简洁,未来趋势
- 老项目迁移别强求:Class组件还能再战500年
- 闭包问题要小心:在useEffect里用状态时,记得加依赖项
⭐ 写在最后
请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.
✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式
✅ 认为我部分代码过于老旧,可以提供新的API或最新语法
✅ 对于文章中部分内容不理解
✅ 解答我文章中一些疑问
✅ 认为某些交互,功能需要优化,发现BUG
✅ 想要添加新功能,对于整体的设计,外观有更好的建议
✅ 一起探讨技术加qq交流群:906392632
最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!