材质UI-选择带有装饰的菜单

时间:2020-07-23 05:49:30

标签: material-ui react-select

是否可以在MaterialUI的Select菜单中添加endAdornment?

我想在选择菜单上的向下指针的右侧添加内容。

endAdornment={
   <InputAdornment position="end">
        <Insights />
   </InputAdornment>

<Select
   labelId="demo-mutiple-name-label"
   id="demo-mutiple-name"
   multiple
   value={fieldName}
   onChange={handleChange}
   input={<Input id="select-multiple-chip" />}
   renderValue={(selected) => (
     <div className={classes.chips}>
     {selected.map((value) => (
        <Chip key={value} label={value} className={classes.chip} />
        ))}
     </div>
     )}
     MenuProps={MenuProps}
   >
   {field.map((field) => (
    <MenuItem key={field} value={field} >
        {field}
    </MenuItem>
   ))}
                        
</Select>
                    

5 个答案:

答案 0 :(得分:2)

我接受了 Javier 的回答,但样式略有不同。正如他所提到的,Material UI Select 组件支持 endAdornment,但是,它不能很好地与 Select 箭头配合使用。主要问题是,无论你放在哪里,它都会重叠。 这是我如何做到的一个例子。

首先,定义一个将应用于 InputAdornment 元素的类。你只需要给它一些正确的填充,这样它就不会呈现在箭头的顶部:

const useStyles = makeStyles((theme) =>
  createStyles({
    selectAdornment: {
        marginRight: theme.spacing(3),
    },
  }));

然后只需将类添加到 InputAdornment 中的 Select

<FormControl className={classes.rowInputRoot} error={!!error}>
  <Select
    labelId="id"
    value={selectValue}
    endAdornment={<InputAdornment className={classes.selectAdornment} position="end">
                    <CircularProgress size={20}/></InputAdornment>}>
    <MenuItem value="" selected>
        <em>Select</em>
    </MenuItem>
    {rowData.listValues?.map((value: any, i: any) => {
        return <MenuItem value={value[idPropName]}>{value.label}</MenuItem>;
    })}
  </Select>
</FormControl>

这将使装饰带有一点右边距,以避免与选择箭头重叠。

答案 1 :(得分:1)

当前材料Ui选择组件支持endAdornment,但是,与选择箭头配合使用效果不佳。

我要做的是添加一个startAdornment并添加一个makeStyles类以将装饰置于绝对位置,makeStyle类具有以下内容:

const useStyles = makeStyles((theme) => ({
  selectAdornment: {
    "& .MuiButtonBase-root": {
      position: "absolute",
      padding: 0,
      right: "32px",
      top: "calc(50% - 12px)",
    },
  },
}));

选择如下所示:

<Select
  {...props}
  onChange={handleChange}
  startAdornment={
    <InputAdornment position="start" className={classes.selectAdornment}>
      <IconButton>
        <Tooltip title="tooltip text">
          <HelpIcon
            color="primary"
          />
        </Tooltip>
      </IconButton>
    </InputAdornment>
  }
/>

答案 2 :(得分:1)

我们可以使用带有 <Select><TextField>,而不是使用 <MenuItem>

<TextField
      style={{ width: "100%" }}
      name="cls"
      select
      label="Items"
      helperText="Please select Class"
      margin="normal"
      variant="outlined"
      InputProps={{
        endAdornment: (
          <InputAdornment position="start">something</InputAdornment>
        )
      }}
    >
      <MenuItem>Item 1</MenuItem>
      <MenuItem>Item 2</MenuItem>
      <MenuItem>Item 3</MenuItem>
    </TextField>
  );

查看示例沙盒示例 https://codesandbox.io/s/material-demo-forked-9vqb3?file=/demo.js

答案 3 :(得分:0)

这项工作可以吗?

<FormControl>
    <Select {...props}>
        {values.map((value) => (
            <MenuItem
                key={value}
                value={value}
            >
                <Typography variant="inherit">{value}</Typography>
                <ListItemSecondaryAction>
                    <IconButton edge="end" aria-label="delete">
                        <Check />
                    </IconButton>
                </ListItemSecondaryAction>
            </MenuItem>
        ))}
    </Select>
</FormControl>

答案 4 :(得分:-1)

对于其他尝试执行此操作的人-我还没有弄清楚该怎么做,但是一种可行的解决方法是将所需的所有内容放入endAdornment中正确对齐的FormHelper中-因此出现在表单字段中输入框的下方。