You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React自定义表单处理Hook useForm输入框输入即失焦问题求助

问题根源

  • 核心原因是你在fields.map遍历渲染InputGroup时,使用了动态生成的随机值作为key属性。每次输入触发values状态更新后,Form组件会重渲染,此时每一个InputGroup的key都会生成全新的值,React会判定所有表单项都是新组件,直接销毁旧组件并挂载新组件,自然就会出现输入框失焦的情况。
  • 次要问题:你给InputGroup传递的value是整个values对象,而非对应字段的取值,会导致输入框绑定值错误。

解决方案

  1. 删除动态生成随机id的逻辑,使用每个表单项唯一固定的name属性作为key
  2. 给每个InputGroup传递对应字段的value:values[field.name]

修正后的Form.js代码

import InputGroup from "./InputGroup";
import useForm from "./useForm";
const Form = () => {
  const fields = [
    {
      label: "First Name",
      className: "input-group",
      name: "firstName",
      placeholder: "John",
      type: "text"
    },
    {
      label: "Last Name",
      className: "input-group",
      name: "lastName",
      placeholder: "Doe",
      type: "text"
    },
    {
      label: "Email",
      className: "input-group",
      name: "email",
      placeholder: "JohnDoe@example.com",
      type: "email"
    },
    {
      label: "Phone Number",
      className: "input-group",
      name: "Phone",
      placeholder: "+234 (0)81 234 5678",
      type: "text"
    },
    {
      label: "Comments",
      className: "input-group",
      name: "comment",
      placeholder: "Message",
      type: "textarea"
    }
  ];

  const { values, handleChange, handleSubmit } = useForm();

  return (
    <form onSubmit={handleSubmit}>
      {fields.map((field) => (
        <InputGroup
          key={field.name}
          value={values[field.name] || ''}
          onChange={handleChange}
          {...field}
        />
      ))}
      <button>submit</button>
    </form>
  );
};

export default Form;

其他注意点

你的useForm和Input组件逻辑本身没有问题,不需要修改,修正后输入失焦的问题就会消失。

内容的提问来源于stack exchange,提问作者Daniel Nduka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:36:07