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

反应js将setState作为prop传递会导致对依赖项使用props发出警告

柏阳炎
2023-03-14

我通过道具将状态作为变量传递给组件,就像。。。

const [someState, setSomeState] = useState([])
PlaceDataInIndexDB({ setSomeState: setSomeState,
    user: props.user })

在PlaceDataInIndexDB中。js I有一个useEffect,它最终使用

useEffect(() => {
    props.setSomeState([array])
}), [props.user]
 

问题是,我收到一个警告,说我需要在我的依赖数组中使用道具,但是,我不希望每次道具更改时使用效果都运行,因为我有很多其他道具在那里。我能为此做些什么?这是我的代码的一个极其简化的版本。我可以发布确切的代码,但它是一个更多的看。

这是警告。。。

React Hook use效应有一个缺失的依赖项:道具。要么包含它,要么删除依赖数组。然而,当任何道具发生变化时,“道具”都会发生变化,因此首选的修复方法是将“道具”对象的结构分解为在use效应调用之外的对象,并指称在use效应反应挂钩/穷举deps中的那些特定道具

共有1个答案

左丘修齐
2023-03-14

它告诉你问题是什么。通常,useffect函数中引用的任何内容都需要存在于依赖项数组中,因此React知道在这些内容发生变化时再次运行它。如果您正在使用的对象是其他对象的属性(如道具),最好在引用它们之前从中取出值。

const PlaceDataInIndexDB = (props) => {
  const { setSomeState, user } = props

  useEffect(() => {
    setSomeState([array])
  }), [setSomeState, array] // <-- your example doesn't show where `array` comes from, but needed here as well

  // ...
}

事实上,您可以对props进行内嵌的结构化,这样您甚至永远不会引用整个props对象:

const PlaceDataInIndexDB = ({ setSomeState, user }) => {

请注意,setSomeState也必须位于依赖项数组中。如果(且仅当)useState在同一个组件中,linter就足够聪明,知道它永远不会改变,并允许您忽略它。然而,如果它是作为道具从其他地方传入的,它就没有办法知道。

挂钩的起毛规则很好。总的来说,除非你真的知道自己在做什么,否则你可以盲目地听从它的建议。Eslint实际上为此特定规则添加了一个完整的“建议”功能,例如,如果您将光标放在错误上并按ctrl键,vscode将为您更改

 类似资料:
  • 我正在创建构建一个jar,其中也将包括它的依赖关系。我正在使用maven阴影插件。但是获取错误。我试图排除传递依赖项,如下所示,仍然得到错误。

  • 当我为我的项目运行“mvn dependency:tree”时,它会显示以下内容: 正如您在标记行中看到的,xml API具有“编译”作用域,因此它被打包到。战争档案。为什么会这样? 更有趣的是,它只在使用Java5时发生,对于Java6,依赖项显示为“test”。 Maven版本:3.0.4

  • 问题内容: 我正在使用angularjs 1.4,在我的一个角度控制器中,我必须使用jQuery。但是当我尝试将其作为依赖项传递时,它无法正常工作。 我尝试下面的代码,但没有成功 我也尝试下面的代码,但没有成功 可以请一些指导我做错了什么。 问题答案: 您可以在应用程序模块内创建自己的常量,然后将依赖项注入到任何需要的地方。 我选择了常量,因为可以将其依赖项注入angular的配置阶段。 但是,当

  • 它一定是很明显的东西,但出于某种原因,我在仔细观察了几个小时后错过了它… 我正在用Gradle 5.1.1构建一个遵循六边形体系结构的多模块Spring Boot项目,因此我有几个适配器,比如,其文件如下: 我可以建造它,没有问题。 C:\users\vf\ideaprojects\hexagonal-spring-boot-java\accept-test\src\main\java\packa

  • 我正试图用Maven构建一个Java项目。我的pom。xml主要包括依赖项,其中一些依赖项有自己的可传递依赖项。 当我运行'mvn compile'时,大多数依赖项加载良好,但没有找到一些传递性依赖项,给出警告“[警告]artifact_name的POM丢失,没有可用的依赖项信息”。这导致Maven编译失败。 日志显示,已从Maven和Jboss公共存储库中搜索了依赖项。 > 在这种情况下,当没有

  • 我有一个库项目,我用它来为我的其他项目保存一些设置,这些项目有很多实用程序分类,也包括实用程序库。因此,我将库的build.gradle中的所有“实现”调用都改为“API”调用,这样我就不需要一次又一次地重新导入依赖项。在构建库并将jar从我的library文件夹移动到主项目中的lib文件夹后,我可以访问库中的所有类,但是传递依赖项在主项目中不可用。 我还尝试使用实现和transivive=tru