打开网易新闻 查看精彩图片

React开发者最近发现一个规律:只要项目里用了AI写代码,几乎都能搜到同一组模式——useStateuseEffect,把本该直接计算的值存进状态。

GitHub Copilot写这段代码时毫无犹豫,零警告,零报错。组件能跑,测试能过,直到生产环境出现那种"刷新两次才显示正确数字"的诡异bug。

AI的默认答案,是人的思维盲区

AI的默认答案,是人的思维盲区

Copilot生成的典型代码长这样:

const [total, setTotal] = useState(0)useEffect(() => {  setTotal(items.reduce((sum, i) => sum + i.price, 0))}, [items])

表面看没毛病。但total根本不是状态——它是items的派生值(derived state,派生状态)。每次items变化,total本来就要重新算,强行塞进useState再用useEffect同步,等于凭空造出第二个真相来源。

打开网易新闻 查看精彩图片

后果很具体:组件渲染两次而非一次,状态永远慢一帧,useEffect的存在理由仅仅是"AI没被禁止这么写"。

正确的写法只有3行:

const total = items.reduce((sum, i) => sum + i.price, 0)

没有状态,没有副作用,每次渲染直接计算。一次渲染,一个真相来源,零冗余状态。

为什么AI偏爱"复杂答案"?

为什么AI偏爱"复杂答案"?

Copilot没坏,它只是在做模式匹配。它见过成千上万份代码里useStateuseEffect成对出现,于是默认伸手就拿这对组合——不管场景需不需要。

打开网易新闻 查看精彩图片

AI没有"派生状态"的概念。它不判断某样东西该存还是该算,只生成看起来合理的代码。

合理不等于正确。这是AI编程的核心陷阱:它模仿的是代码的形状,而非代码的意图。

原作者Avery Labs统计,useEffect的误用是React项目中最常见的AI编码错误。不是因为这种模式少见,而是因为Copilot对派生状态、同步逻辑、本不该成为副作用的东西,会条件反射式地套用useEffect

你的代码库正在积累"AI债务"

你的代码库正在积累"AI债务"

每个AI没有明确约束的领域,都是它即兴发挥的空间。而即兴的useEffect逻辑在真实代码库里会指数级蔓延——一个组件多渲染一次,十个组件就是十次,用户感知到的卡顿没有堆栈 trace 可查。

原作者为此做了份20项检查清单,专门定位这类结构性弱点:AI输出为何不可预测,你的应用为何脆弱。不是让你猜,不是让你 endless prompt(无限追问提示词),而是把"该修什么"列清楚,再开下一轮生成。

同一套AI,规则不同,输出完全不同。

你最近一次 review AI写的React代码时,有没有扫过一眼useEffect的依赖数组?还是说,只要没报错就过了?