You need to enable JavaScript to run this app. 如何为Material UI Multiselect弹出层添加不可选的自定义搜索头部
优惠活动
大模型
产品
解决方案
定价
更多

如何为Material UI Multiselect弹出层添加不可选的自定义搜索头部

方案1:通过MenuProps自定义Paper内容(推荐)

你可以直接利用MUI Select组件内置的MenuProps属性,自定义弹出层Paper容器的子元素结构,把搜索栏和选项列表平级放在Paper内部,这样搜索栏就不属于MenuItem所在的UL列表,自然不会被识别为可选项:

import { useState } from 'react';
import { Select, MenuItem, Input } from '@mui/material';

// 组件内部逻辑
const [searchValue, setSearchValue] = useState('');
const allOptions = ['1', '2', '3', '4']; // 你的原始选项列表
const filteredOptions = allOptions.filter(opt => opt.includes(searchValue));

<Select
  multiple
  // 其余你需要的Select参数
  MenuProps={{
    PaperProps: {
      children: (
        <>
          {/* 搜索栏直接放在Paper容器内,不属于下方选项列表 */}
          <Input
            placeholder="搜索选项"
            value={searchValue}
            onChange={(e) => setSearchValue(e.target.value)}
            sx={{ padding: '8px 16px', width: '100%', boxSizing: 'border-box' }}
          />
          {/* 筛选后的选项列表 */}
          <ul style={{ margin: 0, padding: 0, listStyle: 'none' }}>
            {filteredOptions.map(option => (
              <MenuItem key={option} value={option}>
                {option}
              </MenuItem>
            ))}
          </ul>
        </>
      )
    }
  }}
>
</Select>

方案2:禁用搜索栏所在MenuItem(兼容场景)

如果你不想改动Popover的整体结构,也可以给包裹搜索框的MenuItem添加禁用属性、自定义样式和事件拦截,避免它被当成可选项触发选中逻辑:

<Select multiple {...props}>
  <MenuItem 
    disabled
    sx={{
      opacity: 1, // 清除MUI禁用态默认的半透明效果
      '&:hover': { backgroundColor: 'transparent' } // 清除hover高亮效果
    }}
    onClick={(e) => e.stopPropagation()} // 阻止点击事件冒泡到Select,避免触发选中
  >
    <input value={value} id="search" onChange={/* 你的搜索逻辑 */} />
  </MenuItem>
  <MenuItem value="1">1</MenuItem>
  <MenuItem value="2">2</MenuItem>
</Select>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 13:36:07