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

如何让MUI Select选中项与MenuItem展示样式不同

问题描述

需要将MUI Select的选中项展示样式与下拉MenuItem的样式分离。当前选中值时,Select会显示带有按钮的布局,点击Select时的下拉列表展示正常。我需要修改选中状态的默认展示,仅显示纯文本标签,不显示按钮,现有代码如下,期望仅显示名称的效果,但暂未找到解决方案。

现有代码

<FormControl ...>
        <InputLabel htmlFor = "select-device-group">
            Device Group
        </InputLabel>
        <Select
            value = {props.deviceGroup.selected} label={props.deviceGroup.selected.name}
            onChange = {props.selectDeviceGroup}
            input = {<Input id = "select-device-group"/>}>
            {props.deviceGroup.types.map(device => {
                return <MenuItem key = {device.id} value = {device} component='div'>
                    <div className='container p-0'>
                        <div className='row'>
                            <div className='col align-self-center'>
                        {device.name}
                            </div>
                            <div className='col'>
                    <a
                        title = {device.name}
                        onClick = {...}
                    >
            <span ...>
              <SVG .../>
            </span>
                    </a>
                            </div>
                        </div>
                    </div>
                </MenuItem>
            })}
        </Select>
        <FormHelperText>{props.deviceGroup.validationMessage}</FormHelperText>
    </FormControl>
解决方案

方法一:用renderValue自定义选中项展示

MUI的Select组件自带renderValue属性,能完全自定义选中值的渲染内容,和下拉MenuItem的结构彻底分开:

<Select
    value={props.deviceGroup.selected}
    label={props.deviceGroup.selected.name}
    onChange={props.selectDeviceGroup}
    input={<Input id="select-device-group"/>}
    // 自定义选中项仅显示名称
    renderValue={(selected) => selected?.name || ''}
>
    {/* 原MenuItem代码保持不变 */}
    {props.deviceGroup.types.map(device => {
        return <MenuItem key={device.id} value={device} component='div'>
            <div className='container p-0'>
                <div className='row'>
                    <div className='col align-self-center'>
                        {device.name}
                    </div>
                    <div className='col'>
                        <a
                            title={device.name}
                            onClick={...}
                        >
                            <span ...>
                                <SVG .../>
                            </span>
                        </a>
                    </div>
                </div>
            </div>
        </MenuItem>
    })}
</Select>

这个方法最直接,renderValue接收当前选中的value,直接返回要显示的纯文本即可,完全不影响下拉列表里的MenuItem结构。

方法二:通过CSS隐藏默认按钮样式(不推荐)

如果不想用renderValue,也可以通过自定义CSS覆盖默认的Select按钮样式,隐藏按钮相关元素:

/* 隐藏Select默认的下划线 */
#select-device-group.MuiInput-root::after,
#select-device-group.MuiInput-root::before {
    display: none;
}
/* 去掉输入框边框和内边距 */
#select-device-group.MuiInput-root {
    border: none;
    padding: 0;
}
/* 隐藏下拉箭头图标 */
.MuiSelect-icon {
    display: none;
}

但这种方法容易受MUI版本更新影响,且无法灵活控制选中内容的结构,优先推荐方法一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:25:35