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

React输入框输入字符时失焦求助:组件重渲染引发焦点丢失

问题原因

输入框失去焦点的核心原因是每次组件重渲染时,inputs数组里的每个元素的id都是通过Math.random()生成的新值。React依靠key来追踪列表中组件的身份,当key变化时,React会销毁旧的FormInput组件并重新挂载新的实例,这直接导致输入框丢失焦点。

另外,inputs数组定义在ContactForm组件内部,每次组件重渲染时都会重新创建这个数组,虽然这不是焦点丢失的直接原因,但也会带来不必要的性能开销。

解决方案

1. 替换动态生成的id为固定标识

你的每个输入项的name属性已经是唯一的,可以直接用name作为key,或者给每个输入项设置固定的字符串id,彻底避免使用Math.random()生成不稳定的key。

2. 将inputs数组移到组件外部

把inputs数组放在ContactForm组件函数外面,这样它只会在组件初始化时创建一次,不会随重渲染重复生成。

修改后的代码如下:

ContactForm.js

// 将inputs数组移到组件外部,避免重复创建
const inputs = [
  {
    id: 'name',
    name: 'name',
    type: 'text',
    placeholder: 'Name'
  },
  {
    id: 'lastname',
    name: 'lastname',
    type: 'text',
    placeholder: 'Last Name'
  },
  {
    id: 'email',
    name: 'email',
    type: 'email',
    placeholder: 'Email'
  },
  {
    id: 'confirmEmail',
    name: 'confirmEmail',
    type: 'email',
    placeholder: 'Confirm Email'
  },
  {
    id: 'message',
    name: 'message',
    type: 'text',
    placeholder: 'Message'
  }
]

const ContactForm = () => {
  const [values, setValues ] = useState({
    name: '',
    lastname: '',
    email: '',
    confirmEmail: '',
    message: ''
  });

  const handleSubmit = (e) => {
    e.preventDefault();
  }

  const onChange = (e) => {
    setValues({...values, [e.target.name]: e.target.value}); 
  }

  console.log(values);
  
  return (
    <form className='contactForm' onSubmit={handleSubmit}>
      {inputs.map((input) => (
        <FormInput 
          key={input.name} // 使用唯一的name作为稳定key
          {...input} 
          value={values[input.name]} 
          onChange={onChange}
        />
      ))}
      <SubmitBtn/>
    </form>
  )
}

FormInput.js(无需修改)

import React from 'react'
import './FormInput.css';

const FormInput = (props) => {
  const { id, onChange, ...inputProps } = props;

  return (
    <div className='formInput'>
      <input {...inputProps} onChange={onChange} />
    </div>
  )
}

export default FormInput
额外说明

不需要刻意阻止组件重渲染——React的重渲染是正常机制,只要保证key稳定,组件就不会被不必要地卸载/挂载,输入框自然能保持焦点。上述修改既解决了焦点丢失问题,也优化了组件的渲染性能。

内容的提问来源于stack exchange,提问作者mateo ghidini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:48:32