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

如何处理传递给依赖项数组的引用值?

苏品
2023-03-14

假设我有这个组件,带有以下钩子:

function SomeComponent(props) {
useEffect(
    () => {
        //....code
        if (props.propOne === ....) { .... }
        // ...code
        if (props.propTwo === ....) { .... }
    }, 
    [props.propOne]
)

return <Something />

}

上面的钩子将运行

  • 一旦第一次执行组件代码
  • 每次的值props.propOne更改

但是请注意,钩子回调还引用了pros.propTwo,而实际上没有将其传递给依赖项数组。

虽然props.propTwo永远不会考虑钩子是否被重新执行,但钩子回调在其主体中引用的值会发生什么变化?

例如

  • 在初始组件渲染期间props.propOne==Aprops.propTwo==B
  • 钩子被执行并引用值AB
  • 在随后的渲染过程中,props.propOne==Cprops.propTwo==D
  • 钩子被重新执行,因为props.propOne已更改。对于props.propOne它引用值C,但是对于props.propTwo值它引用了什么<代码>B或D

钩子引用值是基于组件执行时创建的闭包,还是React做了一些巫术,它只保留传递给依赖关系数组的值的更新值?

从文档中:

依赖项数组不会作为参数传递给回调。不过,从概念上讲,它们就是这样表示的:回调中引用的每个值也应该出现在dependencies数组中。

更新:

问了这个问题后,我想到了丹·阿布拉莫夫的这篇文章:

https://overreacted.io/a-complete-guide-to-useeffect/

我建议大家读一读。

共有1个答案

令狐泓
2023-03-14

React钩子严重依赖于闭包来利用值。钩子中引用的值将是上次调用useEffect时出现在其闭包中的值。

例如,在您的示例中,如果更改了props.propOne,并且在随后的渲染props.propTwo中更改了props.propTwo,则useffect回调中的props.propTwo的值将与以前的值相同,因为在props.propTwo更改时不执行useffect。

但是,如果同时更新props.propOneprops.propTwo,则useffect钩子中的值将是更新后的值。

考虑到props.propOneprops.propTwo一起更改并触发渲染的情况,props.propTwo的值将是D内部的use效应回调

 类似资料:
  • 我一直在读这方面的文章,原因是Bazel在二进制文件的中只添加了它的直接依赖项。因为是传递依赖项,所以二进制文件找不到它。 为了解决这个问题,我可以想到以下几个黑客: > 添加难看的链接器标志,告诉Bazel添加到而不是。但是,这被认为是一个坏主意,因为不推荐使用,并且不允许通过重写。 使用而不是 使用而不是. 谢了!

  • 问题内容: 由于缺乏对我想使用的某些库的支持,我将一些Python开发从Windows迁移到Linux开发。我整天的大部分时间都在搞弄依赖关系无所适从。 问题 每当我选择Linux时,无论是通过apt-get,easy_install还是pip进行安装,我通常都会遇到某种依赖问题,通常与开发库有关。我本可以将几天的时间浪费在应该是简单的任务上,而不是编写代码,而要花更长的时间使库工作。 在哪里可以

  • 我有一个maven模块化项目,其构建顺序如下。 每个模块都有自己的pom。xml和构建顺序包含在父pom中。因此,当我对进行任何更改时,我应该只构建common模块还是再次构建所有模块,以从common模块获取最新的更改?

  • 问题内容: 我试图将我的数据库对象传递给我的处理程序,而不是具有全局对象。但是我不知道这是否可行,我使用的是Gorilla Mux软件包,我可以看到它把闭包作为第二个参数。 然后定义了我可以使用的参数,理想情况下,我希望拥有这样的第三个参数。 有解决方法吗?还是我需要一个全局数据库对象?我是Go的新手,所以请详细说明可能的答案。 问题答案: 欢迎来到。 可以使用全局变量,特别是数据库对象。 但是,

  • 问题内容: 我希望一个长时间运行的进程通过一个队列(或类似的东西)返回其进度,该队列将被馈送到进度栏对话框。该过程完成后,我还需要结果。这里的测试示例以失败。 我已经能够得到这个使用单独的进程对象的工作(在这里我 很 alowed传递一个队列引用),但是我没有一个池来管理许多过程我想推出。有什么更好的模式建议吗? 问题答案: 以下代码似乎有效: 请注意,队列是从manager.Queue()而不是