useState vs setState:React状态管理,你站哪一队?

大家好,我是小杨,一个摸爬滚打了6年的前端老司机。今天咱们来聊聊React里两个最常用的状态管理方式------setStateuseState。虽然它们干的事儿差不多,但用起来可是有讲究的!

一、先说说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>;
  }
}

坑点注意:

  1. setState是"批量更新"的,连续调用多次可能会被合并

  2. 想拿到最新值?用回调函数形式:

    js 复制代码
    this.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>;
}

关键区别:

  1. 更新不会自动合并(需要用扩展运算符手动合并对象)

  2. 想拿到最新值?用函数式更新:

    js 复制代码
    setCount(prevCount => prevCount + 1);

三、终极对比表格

特性 setState (Class) useState (Hook)
更新方式 自动合并对象 需要手动合并
获取最新值 用回调函数 用函数式更新
异步表现 批量更新 闭包问题(需要留意)
代码量 啰嗦 简洁

四、我的实战建议

  1. 新项目直接用Hook:代码更简洁,未来趋势
  2. 老项目迁移别强求:Class组件还能再战500年
  3. 闭包问题要小心:在useEffect里用状态时,记得加依赖项

⭐ 写在最后

请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

✅ 一起探讨技术加qq交流群:906392632

最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

相关推荐
毛骗导演13 分钟前
@tencent-weixin/openclaw-weixin 插件深度解析(四):API 协议与数据流设计
前端·架构
毛骗导演16 分钟前
@tencent-weixin/openclaw-weixin 插件深度解析(二):消息处理系统架构
前端·架构
IT_陈寒34 分钟前
深入理解JavaScript:核心原理与最佳实践
前端·人工智能·后端
MrGud39 分钟前
Cesium中的坐标系及其转换
前端·cesium
小付学代码40 分钟前
香港地图可编辑版
前端
兆子龙1 小时前
TypeScript高级类型编程:从入门到精通
前端·后端
SuperEugene1 小时前
Vue3 模板语法规范实战:v-if/v-for 不混用 + 表达式精简,避坑指南|Vue 组件与模板规范篇
开发语言·前端·javascript·vue.js·前端框架
IT_陈寒1 小时前
Python开发者的效率革命:这5个技巧让你的代码提速50%!
前端·人工智能·后端
Luna-player1 小时前
Vue 3 + Vue Router 的路由配置,简单示例
前端·javascript·vue.js
用户69371750013841 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能