React进阶:摘除对钩子的滤镜——什么时候不应该用useEffect?

我时常觉得一个人的进步不是他学到了什么,而是他反思总结了什么

由于业务需求的挤压,写代码的时候有时候完全靠直觉来写,后面干脆直接找Gpt帮我写了,这样对于自己很难有技术上的成长,对于代码的设计应该要更多地去考量。

定期时间记录自己对这个框架的理解

先来看看这一段代码

function Form() {
  const [firstName, setFirstName] = useState('Taylor');
  const [lastName, setLastName] = useState('Swift');

  const [fullName, setFullName] = useState('');
  useEffect(() => {
    setFullName(firstName + ' ' + lastName);
  }, [firstName, lastName]);
  // ...
}

这段代码的初衷是通过 firstName 和 lastName 的动态更新来计算出 fullName 的值,乍一看,似乎一切都很合理。

(二)性能问题分析

然而,当我们深入探究 React 的奥秘,特别是对于 useEffect 这个神奇的钩子时,会发现其中暗藏的波澜。在这里,其实存在一个不容忽视的性能问题,这个 useEffect 的使用就像在原本简洁的道路上设置了一个不必要的路障。

当 useState 钩子更新 firstName 和 lastName 的值时,组件的 UI 会触发重新渲染。而与此同时,useEffect 又会因为 firstName 和 lastName 的更新而再次被唤醒,造成了重复的操作。这不仅让代码变得冗余,还可能会影响性能。

正确例子:

function Form() {
  const [firstName, setFirstName] = useState('Taylor');
  const [lastName, setLastName] = useState('Swift');
  const fullName = firstName + ' ' + lastName;
  // ...
}

在这个优化后的代码中,我们巧妙地绕过了 useEffect,直接将 fullName 计算为 firstName 和 lastName 的组合,让代码变得更加简洁明了。

在下次写代码时,不妨多问自己一个问题:这个逻辑真的需要用到 useEffect 吗?
技术成长,往往就藏在这些小小的思考和总结中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值