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

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

相关推荐
gnip2 小时前
Jst执行上下文栈和变量对象
前端·javascript
excel2 小时前
🐣 最简单的卷积与激活函数指南(带示例)
前端
醉方休3 小时前
npm/pnpm软链接的优点和使用场景
前端·npm·node.js
拉不动的猪3 小时前
简单回顾下Weakmap在vue中为何不能去作为循环数据源,以及替代方案
前端·javascript·vue.js
How_doyou_do3 小时前
数据传输优化-异步不阻塞处理增强首屏体验
开发语言·前端·javascript
奇舞精选3 小时前
超越Siri的耳朵:ASR与Whisper零代码部署实战指南
前端·人工智能·aigc
奇舞精选3 小时前
Nano Banana 如何为前端注入 AI 控制力
前端·aigc
一支鱼3 小时前
基于 Node.js 的短视频制作神器 ——FFCreator
前端·node.js·音视频开发
DT——3 小时前
前端登录鉴权详解
前端·javascript
李姆斯3 小时前
复盘上瘾症:到底什么时候该“复盘”,什么时候不需要“复盘”
前端·后端·团队管理