为什么我的 useState 会无限循环

2022-01-02 00:01:13 +08:00
 hxse

先用 npx create-react-app my-app 创建了一个 react app
然后把 ./src/App.js 改成

import React, { useState } from "react";

function App() {
  const [count, setCount] = useState(0);
  setCount(0);
  return <div>{count}</div>;
}

export default App;

这个代码,count 的初始值是 0, setCount 的值也是 0, 按理说0===0的值是 true, 这个 setCount 不应该触发渲染才对啊, 结果发现它无限循环了, 报错: Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
百思不得其解

1838 次点击
所在节点    React
4 条回复
hlwjia
2022-01-02 01:00:50 +08:00
virtual dom 的渲染是你每次触发 setState 都会发生的;只是因为什么都没有变,所以 native dom 就没有重新渲染。

可以看看 PureComponent 或者 memo 是可以解决这个问题;只是你这个写法根本就不应该在实际代码中出现。
yyfearth
2022-01-02 03:07:12 +08:00
很简单 因为 setState 比并不会判断值是否变化
只要 setState 就会重新渲染 并且再调用 setState 导致死循环

想要判断值变化来避免死循环 要在 setState 我们套一个 useEffect
dany813
2022-01-02 16:14:18 +08:00
setCount 每次更新,组件都会渲染,然后渲染后又更新,死循环了。。。
Posuker
2022-01-10 13:28:34 +08:00
0 === 0 是没错,但是 setCount 并不是设置 count 值,他是修改了整个 state 。
简单理解的话,setCount 是,setState({ ...state, count: newCount}),整个 state 产生了变化,然后触发更新……
触发更新就会重新渲染视图,然后触发 setCount ,无限循环。。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX