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

在useEffect内改变多个状态会导致react挂钩/详尽的deps警告

云文栋
2023-03-14

我在胡闹。单击按钮时,我想增加一个计数器。计数器递增后,在clicked重置为false之前,应用程序不应允许进一步递增。

我想到了这个:

function App() {
  const [counter, setCounter] = useState(0);
  const [clicked, setClicked] = useState(false);

  useEffect(() => {
    if (clicked) {
      setCounter(counter + 1);
      setTimeout(() => {
        setClicked(false);
      }, 2000);
    }
  }, [clicked]);

  return (
    <div className="App">
      <p>Clicked: {String(clicked)}</p>
      <p>Counter: {counter}</p>
      <button type="button" onClick={() => setClicked(true)}>
        Click me
      </button>
    </div>
  );
}

它确实有效。但是,React发出以下警告:

React Hook use效应缺少一个依赖项:计数器。要么包含它,要么删除依赖数组。你也可以做一个函数更新set计数器(c=

当我将计数器添加到依赖项时,use效应将进入一个无限循环,因为单击为true,而set计数器是从use效应中调用的。

我希望计数器只能递增,当点击从假变为真。如果依赖项列表只包含单击,则可以工作,但React会对此进行抱怨。

自己尝试一下:https://codesandbox.io/s/dreamy-shadow-7xesm

共有2个答案

伏德义
2023-03-14
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";

import "./styles.css";

function App() {
  const [counter, setCounter] = useState(0);
  const [clicked, setClicked] = useState(false);

  useEffect(() => {
    if (clicked) {
      setClicked(false);
      setCounter(counter + 1);
    }
  }, [clicked, counter]);

  return (
    <div className="App">
      <p>Clicked: {String(clicked)}</p>
      <p>Counter: {counter}</p>
      <button type="button" onClick={() => setClicked(true)}>
        Click me
      </button>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

如果删除超时,无限循环的问题将消失(顺便问一下,它是用于什么的?)你是想实施去盎司还是节流?我可以编辑此答案以达到您的要求

蓝苗宣
2023-03-14

尝试用以下内容替换setCounter(计数器1):

setCounter(counter => counter + 1)

就像警告说的那样。我们应该解决它。

 类似资料:
  • 问题内容: 可以说我有一些状态依赖于其他状态(例如,当A更改时,我希望B更改)。 创建一个观察A并将B设置在useEffect钩内的钩子是否合适? 效果是否会级联,从而在我单击按钮时会触发下一个效果,从而导致b发生变化,从而导致第二个效果在下一次渲染之前触发?这样构造代码是否有性能下降? 问题答案: 效果始终在渲染阶段完成后执行,即使您将setState放在一个效果中,另一个效果也将读取更新后的状

  • 我正在试用新的反应挂钩,并有一个时钟组件,计数器应该每秒钟增加一次。但是,该值不增加超过1。

  • 我正在尝试使用状态将一个表单输入值复制到另一个表单输入值,但状态没有更新 我创建了一个带有按钮的表单,其中左侧表单输入的值应复制到右侧表单输入。这是我的代码: 无论我做什么,dbSecName的状态都不会改变。我试着设置一个新的常量。我尝试使onclick函数异步并等待。如果我为我试图设置的变量的值添加,我可以正确地看到它,但是dbSecName的console.log总是显示原始值。 我真的不知

  • 我有一个小的井字游戏,一切都很好,除了我正在努力寻找在代码中放置完成功能的位置。让我给你看; 这基本上是整个游戏,我在另一个文件中有一个整理函数,就像这样; 完成功能也可以正常工作,但是由于useState是异步工作的,我知道这一点,我正在努力把它放在哪里。如果我把点击功能放在里面,它就不能对新的状态做出反应,只能对之前的状态做出反应。如果我把外面加上只是if语句,它会说渲染太多,因为我正在设置获

  • 我有一个React函数组件,沿着遗留的JQuery应用程序运行。在JQuery元素上调用事件处理程序时,传递当前React状态默认值为初始状态值,而不是更新后的状态值。 已验证的x状态正在通过useEffect钩子更改,但在调用事件侦听器时,x设置为初始状态值,而不是更新后的状态值。 不会显示任何错误消息。在本文的上述代码中,我希望onXSave方法调用中的x状态为true,但它一直显示为fals

  • 我试图创建一个简单的组件,从Apollo GraphQL服务器(查询)返回我的所有组织。我想从一个上下文状态呈现所有这些组织,在这个上下文状态下,在组件挂载(由useEffect挂钩处理)之后,可以使用分派方法放置这些组织。 如果状态结果(organizations数组)为空,useEffect钩子应该调用函数getOrganizations,然后调用自定义钩子useGetOrganization