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

MUI AutoComplete自定义Paper组件输入框无法获焦问题

MUI Autocomplete自定义Paper内输入框无法获焦的解决方案

问题场景

在MUI Autocomplete组件中,我们替换默认的Paper组件,在弹出层顶部添加了筛选输入框,但点击该输入框时无法正常获焦,无法输入内容。

问题原因

自定义Paper组件的根元素上绑定了onMouseDown={(e) => e.preventDefault()},这个操作阻止了鼠标按下事件的默认行为。而输入框获取焦点依赖于mousedown事件的默认行为触发,因此导致输入框无法正常获焦。

解决方法

移除Paper根元素上的onMouseDown阻止默认行为的代码,让输入框的mousedown事件可以正常触发默认的获焦逻辑。

修改后的自定义Paper组件

import TextField from "@mui/material/TextField";
import { Paper, FormControlLabel, Checkbox } from "@mui/material";
import { useRef, useState } from "react";

const SearchPaper = (props) => {
  const [searchText, setSearchText] = useState("");
  const searchTextRef = useRef<HTMLInputElement>(null);

  return (
    <Paper>
      <FormControlLabel
        control={<Checkbox defaultChecked />}
        label="Label"
        slotProps={{
          typography: {
            onClick: (e) => e.preventDefault(),
          },
        }}
      />
      <TextField
        sx={{ p: 1 }}
        size="small"
        fullWidth
        autoFocus
        placeholder="输入关键词筛选..."
        value={searchText}
        inputRef={searchTextRef}
        onChange={(e) => setSearchText(e.target.value)}
      />
      {props.children}
    </Paper>
  );
};

对应的Autocomplete配置

<Autocomplete
  disablePortal
  disableCloseOnSelect
  id="combo-box-demo"
  options={top100Films}
  sx={{ width: 300 }}
  renderInput={(params) => <TextField {...params} label="电影" />}
  slots={{ paper: SearchPaper }}
/>

额外说明

如果原本添加onMouseDown阻止默认行为是为了避免点击弹出层时关闭下拉框,Autocomplete已经提供了disableCloseOnSelect属性可以保留下拉框打开状态,无需通过阻止事件默认行为来实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:49:51