MUI KeyboardDatePicker 更改日期输入框的样式

IT技术 css reactjs date material-ui styles
2021-05-09 04:20:20

目前,我正在尝试修改KeyboardDatePicker板的颜色、大小、字体、填充,但不幸的是,所有方法都不起作用。到目前为止我尝试过:

1 . 使用样式:

const useStyles = (params: any) =>
  makeStyles(() =>
    createStyles({
      componentStyle: {
        width: params.width ? params.width : 'auto',
        color: params.color ? params.color : 'inherit',
        verticalAlign: 'middle',
        fontSize: '12px',
        border: 'solid 2px #0070D8',
      },
    })
  );

不覆盖并且当前KeyboardDatePicker边框上出现边框,大小也不会改变。

2 . 主题提供,它覆盖日历主题,但不覆盖KeyboardDatePicker日期框。

<ThemeProvider theme={theme}>

3 . 将样式添加到 KeyboardDatePicker,这是唯一的工作方法

style={{width:"246px",height:"44px"}}

您如何建议修改 的样式KeyboardDatePicker,并且是 style={} 方法,这不是更改样式的正确方法。ps 我正在使用 Material-UI 4

我的键盘日期选择器:

    <KeyboardDatePicker
      format="MM/dd/yyyy"
      margin="normal"
      id="date-picker-inline"
      defaultValue={props.value}
      value={selectedDate}
      required={props.required}
      showTodayButton={true}
      disableToolbar
      inputVariant="outlined"
      variant="inline"
      onChange={(selectedDate) => setSelectedDate(selectedDate)}
      KeyboardButtonProps={{
        "aria-label": "change date",
      }}
      keyboardIcon={<Icon icon={ICONS.Cool_icon} />}
      className={classes.componentStyle} // do not overide , but puts on top
    />
2个回答

makeStyles是一个钩子工厂,它返回一个样式钩子(通常称为useStyles),这是它的使用方式:

const useStyles = makeStyles(...);

在您的代码中,您定义useStyles了一个返回的函数,makeStyles而不是告诉makeStyles创建一个在这里没有意义的新钩子,因此将您的代码更改为上述内容。我也为你固定了样式。文本颜色样式应放置在InputBase组件中:

const useStyles = makeStyles(() =>
  createStyles({
    componentStyle: {
      verticalAlign: "middle",
      fontSize: "12px",
      width: (params) => (params.width ? params.width : "auto"),

      "& fieldset": {
        border: "solid 2px #0070D8"
      },
      "& .MuiInputBase-root": {
        height: (params) => (params.height ? params.height : "auto"),
        color: (params) => (params.color ? params.color : "inherit")
      }
    }
  })
);
const classes = useStyles({
  color: "red",
  width: 400,
  height: 80,
});
<KeyboardDatePicker
  onChange={() => {}}
  inputVariant="outlined"
  InputProps={{
    className: classes.componentStyle
  }}
/>

如果你想通过样式设置样式createMuiTheme,这里是等效的代码。请注意,与上述useStyles方法不同,您不能通过组件props来创建动态样式

const theme = createMuiTheme({
  overrides: {
    MuiTextField: {
      root: {
        verticalAlign: "middle",
        fontSize: "12px",
        width: 150,
        "& fieldset": {
          border: "solid 2px #0070D8"
        }
      }
    }
  }
});

它应该再次起作用。作为参考,请参阅节以了解如何使用makeStyles组件props。

代码沙盒演示

看起来你不需要像这样编写自定义钩子useStyles = (params: any) => ...,返回的钩子makeStyles已经接受了一个props param

在为 MUI 组件设置样式时,您需要检查每个组件的 API 以定义您传递给的对象makeStyles,在这种情况下,日期选择器组件是一组其他 MUI 组件,如果您转到 API,您将看到不同的props传递给每个单独的组件。要设置输入的样式,您通过 InputProps 中的 useStyle 钩子返回的类,使用Input API中的根规则,如果您需要更具体的样式,请应用其他规则。

const useInputStyles = makeStyles({
  root: {
    width: (props) => (props.width ? props.width : "auto"),
    color: (props) => (props.color ? props.color : "inherit"),
    verticalAlign: "middle",
    fontSize: "12px",
    border: "solid 2px #0070D8"
  }
});
...
    const inputClasses = useInputStyles()
...
      <KeyboardDatePicker
        ...
        InputProps={{ classes: inputClasses }}
      />

并为“板”设置样式,不确定您是否指的是 popover,因为您使用了inline变体,因此您在 PopoverProps 中传递样式paper,按照Popover API 中的描述定义规则中的样式

const usePopoverStyles = makeStyles({
  paper: {
    backgroundColor: "green"
  }
});
...
    const popoverClasses = usePopoverStyles();
      ...
      <KeyboardDatePicker
        ...
        PopoverProps={{ classes: popoverClasses }}
      />

你可以看到它在这里工作https://codesandbox.io/s/mui-keyboarddatepicker-styles-sueqd?file=/src/App.tsx