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

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

相关推荐
AlienZHOU7 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
刺客码10 小时前
Layui 表格固定列行高错位问题解决方案
前端框架·layui·jquery·web
Captaincc10 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
计算机魔术师12 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen12 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒12 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
前端snow13 小时前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
竹林81813 小时前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器
JamesZhang8007813 小时前
页面内存只涨不跌? 一次泄漏排查, 牵出 WeakMap 的诞生
前端
Z小明13 小时前
第 6 章 组件进阶
前端·vue.js