当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于React FC useState,如何解释以下console.log?

訾稳
2024-07-10

React代码如下, 前三次每次点击button都会打印不同的结果,苦思不得解,请大佬解惑。。

第一次点击button打印:click 1 2
第二次点击button打印:click 1
第三 ~ 第 N 次点击button打印:click

function A() {
  console.log(2)
  return null
}

const App: React.FC = () => {
  const [flag, setFlag] = useState(false)
  console.log(1)
  return (
    <div>
      <button
        onClick={() => {
          console.log("click")
          setFlag(true)
        }}
      >
        click me
      </button>
      <A />
    </div>
  )
}

如何解释第二次的打印结果呢???
我原以为第二次点击button,只会打印click,依据是状态的newValue === prevValue,不会触发re-render,但是想不通为什么还打印了“1”。然后奇怪的是,第三次往后,又没有“1”了

共有1个答案

劳星晖
2024-07-10

先把代码看明白就行了。你的三个打印分别为:

  1. 按钮每次被点击打印click(所以永远有效)
  2. state的值变化导致组件刷新打印2
  3. A组件渲染打印1

目前我怀疑你描述的打印顺序是错误,这个组件加载就会打印1,然后完成A加载,打印2;然后你才能点到button打印click,由于点击时修改了state的值,马上会再次打印1A组件应该不需要重新渲染,所以不会再次打印2;以后再点按钮因为state已经是true,所以不会再有啥反应了,这样就只能看到click了。

 类似资料:
  • 我一直试图理解以下术语:最初赋值的变量和最初未赋值的变量。但我不确定我对这些术语的解释是否正确。底部加粗的文字是我的解读。所以,如果我误解了什么,请随时纠正我。 在阅读了以下有关变量的C#Microsoft文档https://docs.Microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/variab

  • 问题内容: 是在运行时严格解释Python,还是可以将其用于开发作为后台应用程序运行的程序(例如Java应用程序或C程序)? 问题答案: 这里有多个问题: 不,不解释Python。标准实现编译为字节码,然后在虚拟机中执行。许多现代的JavaScript引擎也可以做到这一点。 不管实现方式(解释器,VM,机器代码)如何,任何您想要的东西都可以在后台运行。如果需要,可以在后台运行Shell脚本。

  • 本文向大家介绍PHP关于htmlspecialchars、strip_tags、addslashes的解释,包括了PHP关于htmlspecialchars、strip_tags、addslashes的解释的使用技巧和注意事项,需要的朋友参考一下 PHP的htmlspecialchars、strip_tags、addslashes是网页程序开发中常见的函数,今天就来详细讲述这些函数的用法: 1.函

  • 本文向大家介绍关于Linux下对于makefile的理解,包括了关于Linux下对于makefile的理解的使用技巧和注意事项,需要的朋友参考一下 什么是makefile呢?在Linux下makefile我们可以把理解为工程的编译规则。一个工程中源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件需要后编译,那些文件需要重新

  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:

  • 问题内容: 有两种通过play框架创建海关标签的方法。 通过在app / view / tags中定义一个Groovy模板 通过在类中直接扩展FastTag直接在纯Java中 没有最新的文件。 问题答案: 因此,类似于JavaExtensions通过扩展JavaExtensions类的工作方式,要创建FastTag,您需要创建一个扩展FastTags的类。您要作为标记执行的每个方法都必须符合以下方

  • 我不明白,当我为5分配内存时,它会打印出一个示例。我知道可以使用strncpy来完成,但有没有一种方法可以不使用strncpy来完成呢 它适用于strncpy,但有没有办法在没有strncpy的情况下做到这一点? 打印出一个示例 不应该打印OneE吗??有人能解释一下吗?

  • 问题内容: 我偶然发现了将DOM NodeList转换为常规数组的简洁捷径,但我必须承认,我并不完全了解它的工作原理: 因此,它以一个空数组开头,然后用于将结果转换为新数组,是吗? 我不明白的是。它如何从NodeList转换为常规数组? 问题答案: 这里发生的是,您调用它就像是使用的功能。在这种情况下,要做的是创建一个空数组,然后遍历其运行的对象(最初是一个数组,现在是一个数组),并将该对象的元素