reactjs Material-UI -将最大高度应用于Select children

o4tp2gmn  于 2023-11-18  发布在  React
关注(0)|答案(4)|浏览(143)

我正在使用Material-UI react库来渲染一些下拉菜单,使用<FormControl><Select><MenuItem>组件。这个下拉菜单的选项数组非常大,我想在下拉菜单上设置一个max-height,这样它就不会变得太大。我目前正在努力做到这一点,我将在下面解释。
使用Material-UI的基本配置:

const MenuValidNotes = ({
  schedule,
  indexTrack,
  indexSchedule,
  actionSetTrackScheduleItemNote,
}) => {

  const listNotesMenu = () => (
    ARRAY_VALID_NOTES.map((noteObj, i) => (
      <MenuItem
        value={noteObj.note}
        key={`track-item-${indexTrack}-schedule-${indexSchedule}-note-${i}`}
        onClick={() => actionSetTrackScheduleItemNote(indexTrack, indexSchedule, noteObj.midiNumber)}
      >{noteObj.note}</MenuItem>
    ))
  )

  return(
    <div>
      <FormControl>
        <InputLabel>Note</InputLabel>
        <Select
          defaultValue={noteValueToNoteObject(schedule.noteValue).note}
        >
          {listNotesMenu()}
        </Select>
      </FormControl>
    </div>  
  )
}

字符串
我发现的一种设置max-height的方法是在div中呈现<Select>的子元素,给予一个类名并对其应用一些CSS。
但是,<Select>组件要求其子组件是<MenuItem>s,因此周围有<div>会破坏value属性,这意味着它不会显示正确的值。(在阅读Material-UI Select e.target.value is undefined时发现此问题)

const listNotesMenu = () => (
    ARRAY_VALID_NOTES.map((noteObj, i) => (
      <div className="..."> // this div will break the 'value' of the Select component 
         <MenuItem ... />
      </div>
    ))
  )


所以,理想情况下,我希望能够控制它的孩子的值和max-height。这可能吗?关于select的Material-UI文档没有这样的例子,<Select组件的props列表不包括任何控制高度的字段。谢谢你的帮助。
(The上面的屏幕截图显示了这个问题。一个屏幕截图显示可以使用div Package 器控制max-height,但这会破坏值;另一个屏幕截图显示了没有div Package 器的控件,这意味着我们不能设置max-height)。
x1c 0d1x的数据



ftf50wuq

ftf50wuq1#

要控制的高度是Paper元素,该元素由Menu中的Popover元素呈现。
默认样式为maxHeight: 'calc(100% - 96px)'
下面是一个如何在Material-UI的v4中覆盖此内容的示例(v5示例更下方):

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import Select from "@material-ui/core/Select";

const useStyles = makeStyles(theme => ({
  formControl: {
    margin: theme.spacing(1),
    minWidth: 120
  },
  selectEmpty: {
    marginTop: theme.spacing(2)
  },
  menuPaper: {
    maxHeight: 100
  }
}));

const VALID_NOTES = [
  "C",
  "C#",
  "D",
  "D#",
  "E",
  "F",
  "F#",
  "G",
  "G#",
  "A",
  "A#",
  "B"
];
export default function SimpleSelect() {
  const classes = useStyles();
  const [note, setNote] = React.useState("");

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

  return (
    <div>
      <FormControl className={classes.formControl}>
        <InputLabel id="demo-simple-select-label">Note</InputLabel>
        <Select
          labelId="demo-simple-select-label"
          id="demo-simple-select"
          value={note}
          onChange={handleChange}
          MenuProps={{ classes: { paper: classes.menuPaper } }}
        >
          {VALID_NOTES.map(validNote => (
            <MenuItem value={validNote}>{validNote}</MenuItem>
          ))}
        </Select>
      </FormControl>
    </div>
  );
}

字符串
x1c 0d1x的数据
关键的方面是MenuProps={{ classes: { paper: classes.menuPaper } }}menuPaper样式的定义,
下面是一个类似的示例,但针对的是Material-UI的v5。此示例利用了新的sx属性进行样式设置。

import React from "react";
import InputLabel from "@mui/material/InputLabel";
import MenuItem from "@mui/material/MenuItem";
import FormControl from "@mui/material/FormControl";
import Select from "@mui/material/Select";

const VALID_NOTES = [
  "C",
  "C#",
  "D",
  "D#",
  "E",
  "F",
  "F#",
  "G",
  "G#",
  "A",
  "A#",
  "B"
];
export default function SimpleSelect() {
  const [note, setNote] = React.useState("");

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

  return (
    <div>
      <FormControl sx={{ m: 1, minWidth: 120 }} variant="standard">
        <InputLabel id="demo-simple-select-label">Note</InputLabel>
        <Select
          labelId="demo-simple-select-label"
          id="demo-simple-select"
          value={note}
          onChange={handleChange}
          MenuProps={{ PaperProps: { sx: { maxHeight: 100 } } }}
        >
          {VALID_NOTES.map((validNote) => (
            <MenuItem value={validNote}>{validNote}</MenuItem>
          ))}
        </Select>
      </FormControl>
    </div>
  );
}


gr8qqesn

gr8qqesn2#

2022使用MUI 4.12应答

如果这对你有帮助,上面的答案都不是正确的结构为我们的用例。我发现你只需要访问Select组件上的MenuProps。像这样:

<Select
...
   MenuProps={{
      style: {
         maxHeight: 400,
            },
      }}
>
</Select>

字符串

yzuktlbb

yzuktlbb3#

在MUI文档中有一个部分,其中有Select的高度有限的示例。您可以设置Paper的高度,这是Menu中所有可扩展项的容器,这是使用MenuPropsSelect的弹出窗口,如下所示:

// the MenuItem height is a bit different between xs and larger breakpoints
const ITEM_HEIGHT = 36;
const MOBILE_ITEM_HEIGHT = 48;

const ITEM_PADDING_TOP = 8;
const MENU_ITEMS = 3; // change this to your preference.

个字符

现场演示


的数据

gstyhher

gstyhher4#

我还想补充一点,如果你直接使用TextField而不是Select,你可以这样做:

<TextField
    select
    SelectProps={{
        MenuProps: {
            style: {
                maxHeight: 400,
            },
        },
    }}
/>

字符串

相关问题