我有下面的代码片段,我预计它会导致无限循环,因为在不使用"useint"的情况下,组件体内的获取回调中的状态更新.然而,它的表现并没有如预期的那样.代码如下:

function App() {
  const [cartContent, setCartContent] = useState(null);

  fetch("https://fakestoreapi.com/carts/6")
    .then((resp) => resp.json())
    .then((data) => {
      setCartContent("test");
    });

  console.log(cartContent);

  return <div className="cartContent">{cartContent}</div>;
}

export default App;

我的理解是,console.log(cartContent)应该记录cartContent的初始值,然后当在获取回调中调用setCartContent("test")时,它应该记录"测试",并且这个过程应该无限期重复,从而创建一个无限循环.

有人能帮助我理解为什么此代码没有像预期的那样导致无限循环吗?任何见解或解释都将不胜感激.谢谢!

推荐答案

你的期望有点误导.您共享的代码alwayscartContent状态更新为字符串文本"test",但字符串有点像基元,因为它们始终等于自己,即使保存这些字符串的变量是不同的引用.处理第二次排队状态更新后,React see的状态值相同,并且不会触发任何额外的重新渲染.

Bailing out of a State update:

如果将状态挂钩更新为与当前状态相同的值, React将在不影响子元素或射击效果的情况下摆脱困境. (React使用Object.is comparison algorithm.)

请注意,React可能仍然需要再次渲染该特定组件 然后再保释.这不应该是一个问题,因为React不会 不必要地"更深"地进入树中.

Javascript相关问答推荐

使用事件监听器在JavaScript中重新分配全局变量

想要检测字符串中的所有单词

在shiny 模块中实现JavaScript

reaction useEffect KeyDown for each 条目配音输出

获取表格的左滚动位置

如何在JavaScript中在文本内容中添加新行

我无法在NightWatch.js测试中获取完整的Chrome浏览器控制台日志(log)

切换时排序对象数组,切换不起作用

阿波罗返回的数据错误,但在网络判断器中是正确的

这个值总是返回未定义的-Reaction

在WordPress中使用带有WPCode的Java代码片段时出现意外令牌错误

在forEach循环中获取目标而不是父对象的属性

连接到游戏的玩家不会在浏览器在线游戏中呈现

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

在画布中调整边上反弹框的大小失败

<;img>;标记无法呈现图像

如何找到带有特定文本和测试ID的div?

JWT Cookie安全性

如果NetSuite中为空,则限制筛选

rxjs在每次迭代后更新数组的可观察值