删除 Material-UI 上的标签选择文本字段

Jus*_*ane 6 reactjs material-ui

我有一个性别选择字段,它的标签位于选择的中心,这是所需的布局。

性别字段,未选择任何内容

当用户选择此字段时,标签会飞到左上角,如图所示。我想要做的是完全删除标签并用蓝色边框替换它。

性别字段,男性选择

这是我的代码:

          <TextField
            id='gender-select'
            select
            label="Gender"
            className={classes.textField}
            value={gender}
            onChange={data => setGender(data.target.value)}
            margin='normal'
            variant='outlined'>
            {genders.map(option => (
              <MenuItem key={option.value} value={option.value}>
                {option.label}
              </MenuItem>
            ))}
          </TextField>

Run Code Online (Sandbox Code Playgroud)

这是我的样式代码:

const useStyles = makeStyles(theme => ({
  textField: {
    marginLeft: theme.spacing(1),
    marginRight: theme.spacing(1),
    marginTop: theme.spacing(1),
    '& .MuiOutlinedInput-root': {
      '& fieldset': {
        borderColor: '#CACACA'
      },
      '&:hover fieldset': {
        borderColor: '#007AFF'
      },
      '&.Mui-focused hover': {
        borderColor: '#007AFF'
      },
      '&.Mui-focused fieldset': {
        borderColor: '007AFF'
      }
    }
  }
})) 
Run Code Online (Sandbox Code Playgroud)

我曾尝试在标签道具上添加一个条件来使其无效,例如:

label={gender== "" ? "Gender": null}

但这只是给了我一个空白行来代替标签。

当字段处于焦点时,如何更改蓝线的标签?

Rya*_*ell 12

您的解决方案不太有效的原因是因为 TextField 不会监视标签的更改。它计算出初始渲染后效果中的标签宽度。

幸运的是,有一种简单的方法可以避免出现缺口。您可以防止标签“缩小” InputLabelProps={{shrink: false}}

这是一个完整的工作示例:

import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import MenuItem from '@material-ui/core/MenuItem';
import TextField from '@material-ui/core/TextField';

const genders = [
  {
    value: 'M',
    label: 'Male',
  },
  {
    value: 'F',
    label: 'Female',
  },
  {
    value: 'O',
    label: 'Other',
  },
];

const useStyles = makeStyles(theme => ({
  container: {
    display: 'flex',
    flexWrap: 'wrap',
  },
  textField: {
    marginLeft: theme.spacing(1),
    marginRight: theme.spacing(1),
    width: 100
  },
  dense: {
    marginTop: theme.spacing(2),
  },
  menu: {
    width: 100,
  },
}));

export default function OutlinedTextFields() {
  const classes = useStyles();
  const [gender, setGender] = React.useState("");

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

  return (
    <form className={classes.container} noValidate autoComplete="off">
      <TextField
        id="outlined-select-gender"
        select
        label={gender=== "" ? "Gender": ""}
        className={classes.textField}
        value={gender}
        onChange={handleChange}
        InputLabelProps={{shrink: false}}
        SelectProps={{
          MenuProps: {
            className: classes.menu,
          },
        }}
        margin="normal"
        variant="outlined"
      >
        {genders.map(option => (
          <MenuItem key={option.value} value={option.value}>
            {option.label}
          </MenuItem>
        ))}
      </TextField>
    </form>
  );
}
Run Code Online (Sandbox Code Playgroud)

编辑轮廓选择不收缩

  • 这可行,但会产生另一个错误,其中标签永远不会离开,并且您最终将文本写在标签上。 (9认同)
  • @HarshPhoujdar 不,在我的示例中不是(您可以在沙箱中使用它)。当值(示例中的“gender”)不为空时,通过“label={gender==””将标签更改为空字符串?“性别”:“”}`。 (2认同)

小智 12

尝试这个 -

<TextField
 sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 },}} 
/>
Run Code Online (Sandbox Code Playgroud)