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

React input中的Onchange导致输入在每个字母上重新排序

舒俊雄
2023-03-14

所以我在两个函数中创建了输入,在OnChange上,它获取输入到它们中的值。但是每当我输入输入时,我只能在它不聚焦之前一次输入一个字母,我相信这是因为组件一直在渲染。我还意识到,每当我删除OnChange和value道具时,一切都会恢复正常,我可以轻松地键入一切。我该怎么解决这个问题?

一个pp.js

import style from "./auth.module.css";
import { useEffect, useRef, useState } from "react";
import { useAuthState } from 'react-firebase-hooks/auth';
import { auth, signInWithEmailAndPassword, signInWithGoogle, registerWithEmailAndPassword } from "../../firebase";
import { CSSTransition } from "react-transition-group";


function Auth() {
  const [activeMenu, setActiveMenu] = useState("main");
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [user, loading, error] = useAuthState(auth);

  const Emailform = () => {
    return (
      <div className={style.formBox}>
        <label className={style.label}>Email:</label>
        <form className={style.input}>
          <input 
            type="email" 
            name="email" 
            required="true"
            value={email} 
            onChange={(e) => setEmail(e.target.value)} />
        </form>
      </div>
    );
  }
  
  const Passform = () => {
    return (
      <div className={style.formBox}>
        <label className={style.label}>Password:</label>
  
        <form className={style.input}>
          <input 
            type="password" 
            name="password" 
            required="true"
            value={password} 
            onChange={(e) => setPassword(e.target.value)} />
        </form>
      </div>
    );
  }

  let domNode = useClickOutside(() => {
    setActiveMenu(false);
  });

  return (
    <div className={style.container}>
      <Login />
      <Signup />
    </div>
  );

  function AuthType(props) {
    return (
      <a
        href={props.link}
        className={style.menuItem}
        onClick={() => props.goToMenu && setActiveMenu(props.goToMenu)}
      >
        {props.children}
      </a>
    );
  }


/* Login */
  function Login() {
    return (
      <CSSTransition in={activeMenu === "main"} unmountOnExit timeout={500}>
        <div ref={domNode}>
          <div className={style.login}>
            <h1 className={style.title}>Clip It</h1>
            {/* Email and Password */}
            <Emailform/>
            <Passform/>

            <div className={style.button}>
              <input 
                type="submit" 
                value="Login"
                onClick={() => signInWithEmailAndPassword(email, password)} />
              <input 
                type="submit" 
                value="Login with Google"
                onClick={signInWithGoogle} />
            </div>
            <div className={style.text}>
              <p className={style.plink}>Forgot Password</p>
              <div>
                Need an account?&nbsp;
                <AuthType goToMenu="Signup">click here</AuthType>
              </div>
            </div>
          </div>
        </div>
      </CSSTransition>
    );
  }


  function Signup() {
    return (
      <CSSTransition in={activeMenu === "Signup"} unmountOnExit timeout={500}>
        <div ref={domNode}>
          <div className={style.signUp}>
            <div className={style.title}> Clip It</div>
            <Form label="First Name" type="text" />
            <Form label="Last Name" type="Text" />
            <Form label="Email" type="email"/>
            <Form label="Date of Birth" type="date" />
            <Form label="Password" type="password"/>
            <Form label="Confirm Password" type="password" />
            <div className={style.button}>
              <input type="submit" value="Sign Up" />
            </div>
            <div className={style.text}>
              have an&nbsp;
              <AuthType goToMenu="main"> account</AuthType>
            </div>
          </div>
        </div>
      </CSSTransition>
    );
  }
}
let useClickOutside = (handler) => {
  let domNode = useRef();

  useEffect(() => {
    let clickListener = (event) => {
      if (domNode.current && !domNode.current.contains(event.target)) {
        handler();
      }
    };

    document.addEventListener("mousedown", clickListener);

    return () => {
      document.removeEventListener("mousedown", clickListener);
    };
  });
  return domNode;
};

function Form(props) {
  return (
    <div className={style.formBox}>
      <label className={style.label}>{props.label}:</label>

      <form className={style.input}>
        <input 
          type={props.input} 
          name={props.input} 
          required="true" />
      </form>
    </div>
  );
}

export default Auth;

共有1个答案

施自明
2023-03-14

可能重复:在React ES6中,为什么输入字段在键入字符后失去焦点?

一种解决方案是将Emailform移到父组件之外。

js prettyprint-override">const Emailform = ({ onChange }) => {
  return (
    <div>
      <label>Email:</label>
      <form>
        <input
          type="email"
          name="email"
          required="true"
          onChange={onChange}
        />
      </form>
    </div>
  );
};

const App = () => {
  const [email, setEmail] = useState("");
  return (
    <div>
        <Emailform onChange={(e) => setEmail(e.target.value)} />
    </div>
  );
};
 类似资料:
  • 我一直在像这样限制我的编辑文本的输入; 但是任何使用过这种方法的人都会知道,当它与自动更正和退格键混合使用时,会导致重复字符。为了解决这个问题,我像这样从键盘上删除了自动更正栏; 现在,这在现有的Android键盘上运行良好,但问题是在替代键盘上(来自Google play),它不禁用自动更正,因此我再次遇到重复字符的问题。有人遇到过这个问题吗/知道如何解决吗?

  • 问题内容: 在我的react和typescript应用程序中,我使用:。 我如何正确定义类的类型,这样我就不必用来绕过类型系统了? 如果我把我得到: 问题答案: 通常,事件处理程序应使用,例如: 您可以在这里阅读原因(还原“使SyntheticEvent.target通用,而不是SyntheticEvent.currentTarget。”)。 UPD:如@ roger-gusmao所述,它更适合于

  • 我有mysql数据库。在我的页面上,当我点击一个按钮时,我从数据库中检索数据。所有数据都显示在页面上。我得到一行id、一行名称和一行数字(在输入字段中)。举个例子,我得到: 51 桌子 200 52 头 320 53 玻璃 456个 因为所有值编号(第3行)都在输入字段中,所以可以更改它们。我创建了提交按钮,所以我可以提交更改的值。这是我的js代码: 所以在控制台中,我得到了所有必要的字段。它们为

  • 问题内容: 我有一个带有输入字段的html页面。每次在此字段中键入内容时,都会使用jQuery调用php脚本。 该php脚本根据输入字段返回一个JSON,其中包含特定查询的结果。 这工作正常,我将输出记录在中。 现在的问题是,我需要将其与twitter bootstrap合并在一起,而不是登录到typeahead.js中的第一个示例,以便每次使用php脚本计算包含以下内容的json(在下面的代码中

  • ⚠️ 警告: 这个函数的执行时间随着每个字符呈指数级增长。 超过8到10个字符的任何内容都会导致浏览器挂起,因为它试图解决所有不同的组合。 生成一个颠倒字母顺序的字符串,返回一个排列组合数组(包含重复)。 使用递归。 颠倒给定字符串中的每个字母,创建所有排列组合数组。 使用 Array.map() 将字母与每个部分字母组合在一起,然后使用 Array.reduce() 将所有字母组合到一个数组中。

  • 问题内容: 我有以下html5输入元素: 为什么此输入允许在输入字段中输入字符“ e”?没有其他字母字符可以输入(按预期方式) 使用chrome v.44.0.2403.107 问题答案: 因为这正是规范所说的应该工作的方式。输入的数字可以接受浮点数,包括负号和或字符(其中指数是或后面的数字): 浮点数按以下顺序由以下部分组成: 可选地,第一个字符可以是“ ”字符。 “ ” 范围内的一个或多个字符