如果 useEffect 侦听非状态值,那么依赖项数组中包含非状态值会产生什么效果?

2024-04-12

每一次Comp重新渲染,rand将是不同的值。会不会触发useEffect?

function Comp({}) {
  const rand = Math.random();

  useEffect(() => {
    // do stuff
  }, [rand])
}

任何变量都可以放入依赖数组中,state或不。只要它在数组中并且它发生变化,useEffect的回调被重新执行。

现在怎么办useEffect注意到变化了吗?嗯,每当组件渲染时它都会进行比较。并且只有一个state改变与setState可以触发渲染(这里不讨论渲染,因为父组件渲染)。

如果你已经理解了这个机制,你可以停在这里,然后用 React 构建你令人惊叹的产品:)。否则,请继续阅读。我举了一个例子来解释更多。

假设我们有以下组件。我们本应该Hello Word当组件第一次渲染时和每次都在控制台中记录rand变化。点击那个button变化rand,但我们不会有新的日志,因为没有任何重新渲染,因为没有state已经改变了,所以useEffect没有做差异,所以它不知道变化。

export default function Comp() {
  let rand = Math.random();
  useEffect(() => {
    console.log("Hello Word");
  }, [rand]);
  return (
      <button onClick={() => { rand = Math.random() }}>
        New value
      </button>
  );
}

让我们对这个相同的组件进行一些更改,如下所示。现在,每次单击按钮时,组件都会重新渲染,因为我们正在设置state with setState,并且在重新渲染时如果rand与之前的日志相比发生变化,我们将得到一个新的日志。

export default function Comp() {
  const [state, setState] = useState(true); // new line added
  let rand = Math.random();
  useEffect(() => {
    console.log("Hello Word");
  }, [rand]);
  // notice that the click handler has changed
  return (
      <button onClick={() => setState(!state)}>
        New value
      </button>
  );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 useEffect 侦听非状态值,那么依赖项数组中包含非状态值会产生什么效果? 的相关文章

  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • 有没有办法让 React 为孩子自动定义“键”?

    我正在学习 React 我偶然发现了 动态儿童 的这个怪癖 带有代码示例的序言 Render Pass 1
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 限制文本区域中每行的字符数

    我整个周末都在寻找解决这个难题的方法 但尚未找到一个可以正常工作的解决方案 我想要实现的是限制文本区域中每行的字符数 不是相同地限制它们 而是我选择的每行不同的字符数 例如 我只想在我的文本区域中包含 4 行 第 1 2 和 3 行将限制为
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 将一个文本框的内容复制到另一个文本框

    假设在文本框中输入了一个条目 是否可以在第二个文本框中保留相同的输入文本 如果是这样 这是如何完成的
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 d3 js 中突出显示从根到选定节点的路径?

    我使用 d3 js 创建了一棵树 现在我创建了一个下拉菜单 其中包含树中所有节点的列表 现在 从下拉菜单中选择一个节点时 我想突出显示从根到该特定节点的路径 这个怎么做 首先创建一个 flatten 函数 它将分层数据变成一个 n 数组 f
  • iframe 重新加载按钮

    我浏览了很多网站 但似乎没有一个能正常工作 或者我不明白它们 我想要一个刷新某个 iframe 的简单按钮 该按钮将位于父页面上 并且 iframe 名称为 Right 有很多方法可以做到这一点 假设这个iframe markup 我们可以
  • 如何滚动到div内的元素?

    我有一个滚动的div我想在点击它时发生一个事件 它会强制执行此操作div滚动以查看内部元素 我写的JavasCript是这样的 document getElementById chr scrollIntoView true 但这会在滚动时滚
  • Flux + React.js - 操作中的回调是好还是坏?

    让我解释一下我最近遇到的问题 我有 React js Flux 驱动的应用程序 有一个列表显示文章数量 注意 应用程序中有多个不同的列表 和文章详情查看在里面 但每个列表只有一个 API 端点 它返回文章数组 为了显示我需要的详细信息fin
  • 使水平滚动条始终可见,即使底部不在视图中

    我将用一个片段来开始这个问题 该片段几乎显示了我想要完成的任务 wrapper overflow hidden display flex sidebar min width 200px background 333 color FFF co
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • ES6 模板文字的延迟执行

    我正在玩新的ES6 模板文字 http tc39wiki calculist org es6 template strings 我首先想到的是String format对于 JavaScript 所以我开始实现一个原型 String pro
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • Express.js Passport认证自动失败跳过策略

    UPDATE 我已将代码从护照本地注册内部移至单独的处理程序 并且运行良好 问题在于 Passport 和本地注册的使用 但我不知道为什么 我使用 Node js Express Passport 进行身份验证和注册设置 这是以前使用过的标
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing

随机推荐

  • Zend_Db:如何从表中获取行数?

    我想知道一个表中有多少行 我使用的数据库是MySQL数据库 我已经有一个 Db Table 类 用于像这样的调用fetchAll 但我不需要表中的任何信息 只需要行数 如何在不调用的情况下获得表中所有行的计数fetchAll count d
  • 重写大型 IN 子句的最高效方法是什么?

    我使用 go 和 gorm 编写了一个 API 它在我们的数据库上运行计算并返回结果 我刚刚达到了参数限制IN使用聚合时的条件 查询示例 SELECT SUM total amount from Table where user id in
  • 使用 While() 结构时 Gridview 不会填充。 C# ASP.Net

    我在使用此网格视图时遇到问题 我正在用查询填充它 但是 如果我使用 while reader Read 结构 它就不会填充甚至不会出现 没有 while 结构 它工作得很好 但是 我需要访问两个特定字段 代码如下 SqlDataReader
  • getLastknownLocation() 在 nexus 上返回 null 值

    我正在开发基于位置的项目 我使用以下代码 我正在为该项目使用 google api 8 lm requestLocationUpdates LocationManager GPS PROVIDER 0 0 this currloc lm g
  • 为什么我们应该总是从函数返回值?

    我不是一个编程高手 但多次听程序员说我们应该始终从函数返回值 我想知道原因 函数不需要返回任何内容 如果您查看 C 函数 您会发现其中许多函数不需要返回任何内容 好吧 不是明确地 void nonReturningFunction cons
  • Python:有限制的非线性优化(Gekko?)

    我希望能够用Python解决以下问题 给定观测数据 x 1 x n 和已知的固定目标 B 和公差 E 求解参数 a0 a1 和 a2 从而最小化 总和 w i 2 其中 w i exp a0 a1x i a2x i 2 具有以下两个限制 s
  • 拆分包含两者的字符串中的数字和字母

    我正在尝试分割以下 或类似 字符串 08 27 2015 07 25 00AM 目前我使用 var parts date split 0 9a zA Z g 这导致 02 27 2012 03 25 00AM 问题在于00AM部分 我也想分
  • 在 Visual Studio 中的项目之间共享预编译头

    我有一个包含许多 Visual C 项目的解决方案 所有项目都使用 PCH 但有些项目打开了特定的编译器开关以满足项目特定的需求 这些项目中的大多数在各自的 stdafx h 中共享相同的标头集 STL boost 等 我想知道是否可以在项
  • 网页抓取、屏幕抓取、数据挖掘技巧? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Python (2.7) 中比较两个相同的对象返回 False

    我在Python中有一个函数叫做object from DB 该定义并不重要 只是它采用 ID 值作为参数 使用sqlite3库从 db 文件中的表中提取匹配值 然后在对象初始化时使用这些值作为参数 使用此函数不会改变数据库 鉴于此 这个示
  • 有向加权图的邻接表

    我使用邻接表来表示有向加权图 并基于以下提供的示例代码this https stackoverflow com questions 58306 graph algorithm to find all connections between
  • 使用 ggplot2 绘制“序列徽标”?

    是否 合理 可能绘制一个序列标志图 http en wikipedia org wiki Sequence logo使用ggplot2 有一个基于 网格 的包可以做到这一点 称为 seqLogo http www bioconductor
  • 使用枚举对结构进行分组

    在 Rust 中 应该如何对相关结构进行分组 以便函数签名可以接受多种不同类型 同时引用方法体内的具体类型 为了简单起见 设计了以下示例 enum Command Increment quantity u32 Decrement quant
  • 使用CreateProcess调用exe文件?

    一直尝试从我的 Visual Studio C 应用程序调用 Truecrypt exe 但是CreateProcess只是不工作 GetLastError shows 127 目的是调用exe不显示命令窗口 请帮忙 我尝试过搜索并阅读Cr
  • 读取 XML 节点的值

    我需要获取 XML 文件中节点的值 我的 XML 文件如下所示
  • 嵌入可编辑的 Google 文档电子表格,无需标题和工具栏

    我需要在网页上嵌入 Google 文档电子表格 但它只需是可编辑的单元格 顶部没有 Google 导航和工具栏 我找不到用于在任何地方嵌入 Google 文档的查询字符串变量的引用 但似乎删除工具栏等的唯一方法是在查询字符串中添加 outp
  • 如何将 Win32 异常代码转换为字符串?

    我很不情愿地再次处理 Win32 结构化异常 我正在尝试生成一个描述异常的字符串 大部分都很简单 但我坚持一些基本的事情 如何转换异常代码 GetExceptionCode 或者ExceptionCode的成员EXCEPTION RECOR
  • vim命令模式下单引号和双引号有区别吗?

    在我的 vim 中 我可以使用 sed s 当我使用时得到错误的输出 sed s sed e expression 1 char 0 no previous regular expression vim命令模式下单引号和双引号有区别吗 在我
  • 如何在SWT文本组件中实现自动隐藏滚动条

    我有一个 SWT Text 组件 我为其设置了SWT MULTI SWT V SCROLL and SWT H SCROLL需要时显示滚动条 我发现即使内容小于文本组件 滚动条在禁用状态下也可见 有什么办法可以自动隐藏滚动条吗 就像java
  • 如果 useEffect 侦听非状态值,那么依赖项数组中包含非状态值会产生什么效果?

    每一次Comp重新渲染 rand将是不同的值 会不会触发useEffect function Comp const rand Math random useEffect gt do stuff rand 任何变量都可以放入依赖数组中 sta