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

Material UI自定义Styled TextField触发onChange时丢失焦点求助

解决Material UI自定义Styled组件输入时失去焦点的问题

问题根源

你遇到的焦点丢失问题,核心原因是在CustomField组件内部定义了StyledField。每次CustomField重新渲染(比如父组件触发onChange更新状态时),都会重新创建一个全新的StyledField组件类型。React会判定这是完全不同的组件,会卸载旧组件再挂载新的,输入框自然就失去了焦点。你之前尝试加key没用,因为key是用来区分同一类型组件的不同实例,而这里是组件类型本身每次都在变,key解决不了这个问题。

修复方案

把styled(TextField)的定义移到CustomField组件外部,让它只被创建一次,不会随组件渲染重复生成:

import { TextField } from '@mui/material';
import styled from '@mui/material/styles/styled';

// 将styled定义移到组件外部,确保组件类型稳定
const StyledField = styled(TextField)(({ theme }) => ({
  width: "70%",
  margin: theme.spacing(1),
})); 

export default function CustomField(props) {
  const { name, label, value, onChange, ...others } = props

  return (
    <StyledField
      variant="outlined"
      label={label}
      name={name}
      onChange={onChange}
      value={value}
      {...others}
    />
  );
}

额外优化(非焦点问题,但避免后续bug)

你的useForm里返回的是setvalues,但表单页面调用时用的是setValues(大小写不一致),建议统一命名:

修改useForm.js的返回值:

return {
  values,
  setValues: setvalues, // 对齐调用处的命名
  handleChange,
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:35:25