据我所知和阅读官方文档,只有在值不同的情况下才会触发更新.

该设置函数允许您将状态更新为不同的值并触发重新渲染.

然而,在我测试了18.2版之后,有一种情况会触发重复呈现.

enter image description here

演示:https://playcode.io/1796380

我想知道他的能力是什么,我是否需要关注这一点

推荐答案

每次点击按钮onClick回调时都会有一个控制台日志(log)发生,另一个是无意的副作用,因此与React组件渲染到DOM没有真正的关联.将其移动到一个useEffect钩子中以查看/判断渲染行为.

import { useState, useEffect } from 'react';

export function App(props) {
  const [count, setCount] = useState(1);

  useEffect(() => {
  console.log(count)
  });

  const clickHandle = () => {
    console.log('handle');
    setCount(1000);
  }
  return (
    <div onClick={clickHandle}>click me</div>
  );
}

有关说明,请参阅传统文档中的Bailing out of a state update条:

如果将状态挂钩更新为与当前状态相同的值, Reaction将在不渲染子元素或射击效果的情况下跳出. (Reaction使用Object.is comparison algorithm.)

请注意,Reaction可能仍需要再次呈现该特定组件 在跳伞之前.这不应该是一个问题,因为Reaction不会 不必要地"深入"这棵树.如果你做的是昂贵的 渲染时的计算,您可以用useMemo来优化它们.

基本上,如果您将与当前状态相同的值/引用的状态更新入队,它可能会触发一个额外的组件重现器,但不会超过这个值,并且不会更深入地呈现到ReactTree中.

Javascript相关问答推荐

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

如何在Angular中插入动态组件

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

在我的html表单中的用户输入没有被传送到我的google表单中

如何从Intl.DateTimeFormat中仅获取时区名称?

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

如何在.NET Core中将chtml文件链接到Java脚本文件?

为什么客户端没有收到来自服务器的响应消息?

DOM不自动更新,尽管运行倒计时TS,JS

将嵌套数组的元素乘以其深度,输出一个和

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

如何更改Html元素S的 colored颜色 ,然后将其褪色为原始 colored颜色

如何使用puppeteer操作所有选项

在Reaction Native中,ScrolltoIndex在结束时不一致地返回到索引0

Playwright:ReferenceError:browserContext未定义

已在EventListener中更新/更改异步的React.js状态对象,但不会导致组件重新呈现

使用重新 Select 和对象理解 Select 器备忘

打字脚本中的函数包装键入