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

Material-UI Select下拉选项颜色修改与选中状态异常问题

问题1:如何修改下拉选项的颜色?

修改下拉选项颜色分两种场景,对应不同的样式配置方式:

  1. 修改未选中选项的颜色
    通过makeStyles定义样式类,直接应用到MenuItem上:
const useStyles = makeStyles((theme) => ({
  select: {
    backgroundColor: "black", // 未选中时的背景色
    color: "white" // 未选中时的文字颜色
  },
  // 其他样式
}));

渲染MenuItem时绑定该类:

<MenuItem className={classes.select} value={option.value}>
  {option.value}
</MenuItem>
  1. 修改选中选项的颜色
    通过Select的MenuProps给下拉容器添加样式,针对.Mui-selected类配置选中状态样式:
const useStyles = makeStyles((theme) => ({
  menuItem: {
    "& .Mui-selected": {
      backgroundColor: "red", // 选中时的背景色
      color: "white" // 选中时的文字颜色
    }
  },
  // 其他样式
}));

在Select组件中配置该样式:

<Select
  MenuProps={{
    classes: {
      paper: classes.menuItem
    },
    // 其他MenuProps配置
  }}
  // 其他Select属性
>

问题2:选中状态样式异常排查及解决

异常原因

当前代码里的Select组件未绑定value属性,导致组件内部状态无法同步我们通过按钮修改的value变量。手动更新state后,Select仍保留之前用户选中项的Mui-selected标记,从而出现样式不匹配的问题。

解决思路

给Select组件添加value属性,绑定状态变量value,让Select根据当前状态自动更新选中项的样式标记。

修改后的完整代码

import React, { useState } from "react";
import {
  MenuItem,
  makeStyles,
  Select,
  Button,
  FormControl,
  Box
} from "@material-ui/core";

const useStyles = makeStyles((theme) => ({
  select: {
    backgroundColor: "black",
    color: "white"
  },
  menuItem: {
    "& .Mui-selected": {
      backgroundColor: "red",
      color: "white"
    }
  }
}));

export default function SimpleSelect() {
  const classes = useStyles();
  const [value, setValue] = useState("");

  const handleChange = (event) => {
    setValue(event.target.value);
  };

  const handleButtonClick = () => {
    setValue("Option 1");
  };

  const data = [
    { value: "Option 1" },
    { value: "Option 2" },
    { value: "Option 3" }
  ];

  return (
    <div>
      <Box>
        <FormControl style={{ display: "flex", flexDirection: "row" }}>
          <Select
            value={value} {/* 新增:绑定value属性 */}
            MenuProps={{
              classes: {
                paper: classes.menuItem
              },
              anchorOrigin: {
                vertical: "bottom",
                horizontal: "left"
              },
              transformOrigin: {
                vertical: "top",
                horizontal: "left"
              },
              getContentAnchorEl: null
            }}
            renderValue={() => <div>{value ? value : "Polygon"}</div>}
            onChange={handleChange}
          >
            <MenuItem value="" style={{ marginTop: "1px" }}>
              <em>(No Selection)</em>
            </MenuItem>

            {data.map((option) => {
              return (
                <MenuItem className={classes.select} value={option.value}>
                  {option.value}
                </MenuItem>
              );
            })}
          </Select>
          <Button onClick={handleButtonClick}>Option</Button>
        </FormControl>
      </Box>
    </div>
  );
}

添加value={value}后,Select会始终匹配当前状态值对应的MenuItem,自动维护.Mui-selected类的添加与移除,解决样式不同步的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:03:02