状态未按预期在事件侦听器之间更新

麦克洛萨

我有两个输入。

Email Address

First Name

在初始加载时,名字是隐藏的。

单击电子邮件地址输入,将隐藏一个 div 并显示名字输入。它还将在输入上方隐藏一个 div,输入将填充该空间。

现在,我正在寻找的功能是在用户单击电子邮件地址输入后,然后用户单击名字,名字不应消失,div 应返回。

为此,目前,我在onBlur事件侦听器上添加了 lodash 去抖动延迟,以等待用户是否关注名字输入。

我有一个状态变量onBlurWait当用户专注于名字输入时,该变量默认为false并更新为true

关注名字输入,调用onBlur事件监听器来检查onBlurWait状态这个监听器现在只返回一个console.logor onBlurWait

onBlur上的电子邮件地址输入似乎之前获得所谓onFocus的第一个名字输入。如此看来,在onBlurWait国家没有更新,因此console.logonBlur事件侦听器将返回false。

这是一个CodeSandbox,可以帮助您玩弄它,因此您希望能够理解我上面提到的内容。

下面是我的组件

import React, { useState } from "react";
import ReactDOM from "react-dom";
import _ from "lodash";

import InputControl from "./InputControl";

import "./styles.css";

const App = () => {
  const [hideContent, setHideContent] = useState(false);
  const [emailSignUpRef, setEmailSignUpRef] = useState(null);
  const [firstNameSignUpRef, setFirstNameEmailSignUpRef] = useState(null);
  const [onBlurWait, setOnBlurWait] = useState(false);

  let registerEmailInput = null;
  let firstNameInput = null;

  // If you click on email address then on first name, I would expect the console.log below to return true
  // due to when a user focuses on the first name input the handleInputFocus function gets called
  // inside that function, setOnBlurWait(true); is ran updating the value of onBlurWait to true
  // But it seems like it has not actually been updated
  // Now when you click on email address to first name, back to email address and first name again, the console log now returns true?
  const waitOnUpdateState = _.debounce(() => console.log(onBlurWait), 2000);
  const hideContentAfterState = _.debounce(
    () =>
      setHideContent(
        emailSignUpRef.length > 0 || firstNameSignUpRef.length > 0 || onBlurWait
      ),
    2000
  );

  const handleOnFocus = event => {
    setEmailSignUpRef(registerEmailInput.value);
    setFirstNameEmailSignUpRef(firstNameInput.value);
    setHideContent(true);
  };

  const handleOnInput = () => {
    setEmailSignUpRef(registerEmailInput.value);
    setFirstNameEmailSignUpRef(firstNameInput.value);
  };

  const handleInputFocus = () => {
    console.log("clicked on first name, onBlurWait should be set as true");
    setOnBlurWait(true);
  };

  const handleOnBlur = () => {
    console.log("clicked away from email address");
    // waitOnUpdateState is just a test function to return a console log, hideContentAfterState is what is going to be used
    waitOnUpdateState();
    hideContentAfterState();
  };

  return (
    <div className="App">
      <div className={hideContent ? "hidden" : "visible"} />
      <InputControl
        autoComplete="off"
        refProp={input => {
          registerEmailInput = input;
        }}
        onInput={handleOnInput}
        onFocus={handleOnFocus}
        onBlur={handleOnBlur}
        type="text"
        name="emailAddressRegister"
        placeholder="Email address"
        label="Email Address"
      />
      <InputControl
        className={
          !hideContent ? "InputControl--hidden" : "InputControl--visible"
        }
        autoComplete="off"
        refProp={input => {
          firstNameInput = input;
        }}
        onInput={handleOnInput}
        onFocus={handleInputFocus}
        type="text"
        name="firstName"
        placeholder="First Name"
        label="First Name"
      />
      <input type="submit" value="Submit" />
    </div>
  );
};

export default App;
贾亚乔

考虑让它更简单,你想多了。

onFocus并且onBlurrelatedTarget作为SyntheticEvent中的属性之一接收在 的情况下onBlurrelatedTarget焦点离开DOM 元素target

您可以做的是处理blur事件并将事件的relatedTarget属性与输入引用进行比较。然后您将能够确定焦点是离开页面上的另一个表单元素还是其他某个 DOM 元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

表事件侦听器

从Vaadin事件侦听器更新组件

事件侦听器的范围

事件,侦听器,作业,队列之间的Laravel差异

重构以减少多个事件侦听器之间的重复

使用事件侦听器切换状态类的活动/非活动状态

如何删除事件侦听器,以便在卸载组件时不尝试更新状态?

JavaScript mousemove事件侦听器无法按预期工作

事件侦听器和处理程序之间的关系

如果检查事件的状态然后添加侦听器,是否有可能错过事件?

使用事件侦听器进行反应的自定义钩子在更新状态时不起作用

Node JS事件侦听器无法按预期工作

为什么更新状态未反映在事件侦听器中:React Native,Hooks

canvas事件侦听器切换参数状态

如何在会话和路由器侦听器之间注册事件侦听器?

更新或更改或删除/重置Javascript事件侦听器

从按钮输入事件侦听器更新

反应组件未按预期更新状态

Javascript事件侦听器

基于 Redux 状态更改的 React 事件侦听器

网络的 Lottie 事件侦听器和状态 - javascript

来自 Firebase 事件侦听器的 Java 异步更新

React:与事件侦听器相关的批处理状态更新

Doctrine - 事件侦听器(preUpdate)不更新相关实体

JavaScript 和 HTML:事件侦听器未按预期生成文本警报;参考错误:按钮未定义

调用链接事件侦听器后,Formik 状态返回 OLD NOT RECENT 或 CURRENT 值

套接字侦听器未从 React 状态获取更新

反应导航焦点事件侦听器返回旧状态

为什么反应事件侦听器正在保存状态?