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

UseState仅在第二次单击时显示

窦宏旷
2023-03-14

我正在使用React-useState钩子更新状态。单击表单提交按钮时,状态直到第二次单击才更新。我相信我需要使用useffect,但不确定如何使用onClick实现。

const files = [
  {
    id: 'foo'
  }
]

const [fieldName, setName] = useState({});


const onSubmit = () => {
    files.map((file) => {
      if (!fieldName[file.id]?.value) {
        setName(() => ({
          ...fieldName,
          [file.id]: {
            value: test[file.id]?.value,
            error: true
          },
        }));
      }
    });

    console.log(fieldName);
    // Output = {}
    // Expected Output = { foo: { error: true } }
    
    if (fieldName) // simply to show i need access to updated fieldName at this point

  };

共有2个答案

逄兴昌
2023-03-14

我实现了一个useEffect来设置hasError状态

useEffect(() => {
    const hasErrors = Object.keys(fieldName).filter(
      (key) => fieldName[key].error
    );
    if (!hasErrors.length) {
      setFormHasError(() => true);
    }
  }, [fieldName]);

然后我可以在代码中使用以下内容

if (formHasError) {
      return;
    }
胡野
2023-03-14

正如在注释中提到的;useState是一个异步函数,因此不保证您将在再次检索其值时获得新值。这是出于允许批处理多个状态更改的性能原因。

在同一方法中继续使用新值的最简单方法是将其保存到变量中,如下所示:

const [clicked, setClicked] = useState(false);

function onclick(e) {
  setClicked(true);
  if (clicked) { //this goes wrong as clicked likely isn't updated yet
    //do something
  }
}
const [clicked, setClicked] = useState(false);

function onclick(e) {
  const newClicked = true;
  setClicked(newClicked);
  if (newClicked) { //using the variable garantuees you'll get the value you want
    //do something
  }
}
 类似资料:
  • 问题内容: 我正在开发我的第一个android计算器应用程序。我陷入一个单一的缺陷。我添加了几个按钮,然后单击这些按钮,它将把各自的文本放在“ 字段”上。主要问题描述如下:在运行项目时,必须单击两次按钮才能将相应的文本首次放置在字段上。例如,单击时将“ 1”放在字段上。在运行时,首先单击该按钮无效。仅在第二次单击时,它将“ 1”放在字段上。 该守则如下: XML按钮和EditField, Main

  • 任何人都知道当用户第二次单击按钮时如何显示间隙广告。我的意思是,当用户单击一次按钮时,广告不应出现,但每当用户再次单击同一按钮时,广告必须显示。。 这里显示了我在不同活动中调用的中间代码。

  • 为什么第一次点击时状态没有改变? 控制台日志总是在第一次单击时返回“0”,而不是预期的“1”。我该怎么解决这个问题?

  • 在我的应用程序中,当我点击RecyclerView中的一个项目(问题)时,该项目使用Firebase RecyclerPagingAdapter从Firebase实时数据库中分页数据,它会显示在另一个片段中点击的项目的详细信息(使用导航组件)。第一次点击时效果很好,但是当我返回到前一个片段并在RecyclerView上第二次点击相同的项目时,项目的详细信息不会显示。 因为我使用安全args来将项目

  • 我正在使用ComboBox在JavaFX中编写一个程序,并为布局加载一个FXML。 当我第一次在一个只有几个项目(例如只有两个)的组合框中单击时,滚动条显示在右侧。再次打开后,滚动条不再显示。 我尝试了一些解决方案。一种有效的方法是直接在FXML中应用CSS,将单元格大小设置为固定值。但是代码中的解决方案(例如,在控制器中的初始化函数中)更适合我的情况。 谢谢你的帮助。

  • 我有一个非常简单的react应用程序。我试图设置一个状态变量,然后在console.log之后立即设置该变量,但得到一个空值。 我希望在第一次渲染时,它会在控制台中显示“Test”,但它会显示空字符串。这是怎么回事?