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

Formik切换至第二个字段时立即失焦的问题排查求助

解决Formik表单切换字段时立即失焦的问题

我仔细看了你的问题描述和相关代码片段,这个焦点丢失的问题和你自定义的customHandleBlur函数关系不大,核心根源是你在Formik的<Field>组件中使用了内联定义的输入组件,导致每次组件渲染时都会生成全新的组件类型,React会卸载旧的输入框并重新挂载新的实例,自然就丢失了焦点。

具体原因分析

当你在<Field>里采用内联函数定义组件时(类似下面的写法,结合你的沙箱场景):

<Field
  name="email"
  component={() => <input type="email" />}
/>

或者把自定义输入组件的定义放在了父组件的渲染函数内部,每一次状态更新(比如输入内容触发Formik的值变化、验证逻辑执行)都会让React重新创建这个组件的引用。旧的输入框组件被销毁,新的输入框组件被挂载,焦点自然无法保持。

解决方案

你需要把输入组件提取成一个独立的、稳定的组件,而非内联定义:

  1. 先定义一个可复用的输入组件:
const InputField = ({ field, form, ...props }) => {
  return <input {...field} {...props} />;
};
  1. 然后在<Field>中直接引用这个稳定的组件:
<Field
  name="email"
  component={InputField}
  type="email"
/>
<Field
  name="password"
  component={InputField}
  type="password"
/>

这样组件的引用在每次渲染时都是固定的,React只会更新组件的props,而不会卸载重建输入框实例,切换字段时焦点就能正常保持了。

关于你的customHandleBlur

这个函数本身的逻辑没有问题,它只是在blur事件触发时执行reCAPTCHA,再调用Formik原生的handleBlur,不会导致焦点丢失,你可以放心保留它。

内容的提问来源于stack exchange,提问作者Murilo Sitonio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:02:37