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

React中修改Input默认值状态后输入框失焦问题解决

输入框输入字符后失去焦点的问题解决

问题说明

在开发的React应用中,通过Dialog.tsx统一生成的输入框,出现每输入一个字符就失去焦点的问题。根本原因是输入时调用setDocumentName更新了documentName状态,而该状态被作为input的defaultValue,同时input的key由defaultValue拼接生成——每次输入内容变化,key就跟着改变,React会判定这是一个新组件,销毁旧输入框并创建新的,最终导致焦点丢失。

相关代码

App.tsx

import { useState } from "react";
import "./App.css";
import * as React from "react";
import { Dialog } from "./Components/Dialog";

function App() {
  const [documentName, setDocumentName] = useState("");

  return (
    <>
      <Dialog
        id="documentName"
        defaultValue={documentName}
        onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
          setDocumentName(event.target.value);
        }}
      />
    </>
  );
}

export default App;

Dialog.tsx

import * as React from "react";

export interface DialogProps {
  id: string;
  defaultValue?: string;
  onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
}

export const Dialog: React.FC<DialogProps> = ({
  id,
  defaultValue,
  onChange,
}) => {
  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    if (onChange) {
      onChange(event);
    }
  };

  return (
    <>
      <input
        key={defaultValue + "-input"}
        id={id}
        defaultValue={defaultValue}
        onChange={handleChange}
      />
    </>
  );
};

解决方案

不再将defaultValue作为key的一部分,改为给Dialog组件传入一个固定的keyValue属性,将其赋值给input的key,确保组件不会因为输入内容变化而被重新创建。

修改后的代码

更新Dialog组件的Props定义与实现

import * as React from "react";

export interface DialogProps {
  id: string;
  defaultValue?: string;
  onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
  keyValue: string; // 新增固定key属性
}

export const Dialog: React.FC<DialogProps> = ({
  id,
  defaultValue,
  onChange,
  keyValue, // 接收传入的固定key
}) => {
  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    if (onChange) {
      onChange(event);
    }
  };

  return (
    <>
      <input
        key={keyValue} // 使用固定的key值
        id={id}
        defaultValue={defaultValue}
        onChange={handleChange}
      />
    </>
  );
};

在App组件中传入固定的keyValue

import { useState } from "react";
import "./App.css";
import * as React from "react";
import { Dialog } from "./Components/Dialog";

function App() {
  const [documentName, setDocumentName] = useState("");

  return (
    <>
      <Dialog
        id="documentName"
        defaultValue={documentName}
        keyValue="document-name-input" // 传入固定不变的key值
        onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
          setDocumentName(event.target.value);
        }}
      />
    </>
  );
}

export default App;

修改后,输入框的key保持固定,React不会频繁销毁重建组件,输入时就不会再出现焦点丢失的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:50:12