自定义/更改下拉菜单文本?

Posted

技术标签:

【中文标题】自定义/更改下拉菜单文本?【英文标题】:customizing/changing the drop-down menu text? 【发布时间】:2020-10-21 00:00:45 【问题描述】:

我不确定这是否可行,但我想调整下拉菜单文本的位置和字体颜色。

我的目标是让数组的“标题”部分为黑色文本并位于下拉菜单的左侧,而数组的“类型”部分位于右侧并成为灰色文本。

现在我所有的文字都是黑色的,在左边。

下面是我想要达到的目标的图片:

这是我当前的代码:

import React from "react";
import TextField from "@material-ui/core/TextField";
import Autocomplete from "@material-ui/lab/Autocomplete";
import 
  makeStyles,
  withStyles,
  ThemeProvider,
  createMuiTheme,
 from "@material-ui/core/styles";
import  Chip  from "@material-ui/core";
import  emphasize  from "@material-ui/core/styles/colorManipulator";
import lime from "@material-ui/core/colors/lime";
import orange from "@material-ui/core/colors/orange";

const useStyles = makeStyles(
  textField: 
    "& input::placeholder": 
      color: "#a2a1a1",
      fontStyle: "italic",
    ,
  ,
);

const theme = createMuiTheme(
  palette: 
    tertiary: lime,
    quaternary: orange,
  ,
);
// This is a step that Material-UI automatically does for the standard palette colors.
theme.palette.tertiary = theme.palette.augmentColor(theme.palette.tertiary);
theme.palette.quaternary = theme.palette.augmentColor(theme.palette.quaternary);

const getCustomChip = (color) =>
  withStyles((theme) => (
    colorPrimary: 
      backgroundColor: theme.palette[color].main,
      color: theme.palette[color].contrastText,
    ,
    deletableColorPrimary: 
      "&:focus": 
        backgroundColor: emphasize(theme.palette[color].main, 0.2),
      ,
    ,
  ))(Chip);

const typeToChip = 
  song: Chip,
  artist: getCustomChip("secondary"),
  film: getCustomChip("tertiary"),
  show: getCustomChip("quaternary"),
;

export default function Tags() 
  const [selectedOptions, setSelectedOptions] = React.useState([]);

  const classes = useStyles();

  return (
    <ThemeProvider theme=theme>
      <div style= width: 500 >
        <Autocomplete
          disableClearable="true"
          filterSelectedOptions="true"
          multiple
          id="tags-standard"
          options=final
          value=selectedOptions
          onChange=(event, newValue) => 
            setSelectedOptions(newValue);
          
          getOptionSelected=(o, v) => o.title === v.title && o.type === v.type
          getOptionLabel=(o) => o.title + " " + o.type
          renderTags=(value, getTagProps) => []
          renderInput=(params) => (
            <TextField
              ...params
              className=classes.textField
              variant="standard"
              placeholder="Favorites"
              margin="normal"
              //color="blue"
              fullWidth
            />
          )
        />

        <div>
          selectedOptions.map((option, index) => 
            const ChipForType = typeToChip[option.type];
            return (
              <ChipForType
                key=index
                color="primary"
                label=`$option.title`
                onDelete=() =>
                  setSelectedOptions([
                    ...selectedOptions.slice(0, index),
                    ...selectedOptions.slice(index + 1),
                  ])
                
              />
            );
          )
        </div>
      </div>
    </ThemeProvider>
  );


const top10Songs = [
   title: "Song A", type: "Song" ,
   title: "Song B", type: "Song" ,
   title: "Song C", type: "Song" ,
   title: "Song D", type: "Song" ,
   title: "Song E", type: "Song" ,
   title: "Song F", type: "Song" ,
   title: "Song G", type: "Song" ,
   title: "Song H", type: "Song" ,
   title: "Song I", type: "Song" ,
   title: "Song J", type: "Song" ,
];

const top10Artists = [
   title: "Artist A", type: "Artist" ,
   title: "Artist B", type: "Artist" ,
   title: "Artist C", type: "Artist" ,
   title: "Artist D", type: "Artist" ,
   title: "Artist E", type: "Artist" ,
   title: "Artist F", type: "Artist" ,
   title: "Artist G", type: "Artist" ,
   title: "Artist H", type: "Artist" ,
   title: "Artist I", type: "Artist" ,
   title: "Artist J", type: "Artist" ,
];

const top10Shows = [
   title: "Show A", type: "Show" ,
   title: "Show B", type: "Show" ,
   title: "Show C", type: "Show" ,
   title: "Show D", type: "Show" ,
   title: "Show E", type: "Show" ,
   title: "Show F", type: "Show" ,
   title: "Show G", type: "Show" ,
   title: "Show H", type: "Show" ,
   title: "Show I", type: "Show" ,
   title: "Show J", type: "Show" ,
];

const top10Films = [
   title: "Film A", type: "Film" ,
   title: "Film B", type: "Film" ,
   title: "Film C", type: "Film" ,
   title: "Film D", type: "Film" ,
   title: "Film E", type: "Film" ,
   title: "Film F", type: "Film" ,
   title: "Film G", type: "Film" ,
   title: "Film H", type: "Film" ,
   title: "Film I", type: "Film" ,
   title: "Film J", type: "Film" ,
];

const final = [
  ...top10Songs.map((entry) => ( ...entry, type: "song" )),
  ...top10Artists.map((entry) => ( ...entry, type: "artist" )),
  ...top10Films.map((entry) => ( ...entry, type: "film" )),
  ...top10Shows.map((entry) => ( ...entry, type: "show" )),
];

我从回答我之前问题的每个人那里学到了很多东西,所以如果您能提供帮助,请提前感谢您!

【问题讨论】:

【参考方案1】:

您可以通过 MUI CSS 自定义点自定义 MUI Autocomplete。请查看以下链接:

    Autocomplete CSS API。 How to override styles with styles object。 How to override styles with global class names。 How to override styles with simple css。 您还可以阅读有关 renderOption 属性的信息,该属性允许您重写 Option 视图。您可以找到信息here。

如果还不够,可以查看我的sandbox with an example。

【讨论】:

以上是关于自定义/更改下拉菜单文本?的主要内容,如果未能解决你的问题,请参考以下文章

自定义下拉菜单的自定义默认值

Android自定义下拉菜单/弹出菜单

如何进行活动菜单文本颜色更改导航下拉项子菜单? [复制]

更改下拉菜单中项目的文本

Handsontable:更改下拉菜单宽度

使用 Google 表格下拉菜单更改单元格背景颜色而不是文本