You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MUI X Date Picker v6:如何通过Slots修改默认图标及其位置

MUI X Date Pickers 6.x 自定义输入框样式方案

在6.x版本中,原renderInput被替换为Slots API,核心是通过slots和slotProps配置项实现输入框及面板的自定义。以下是适配你需求的具体实现步骤:

1. 核心思路

通过重写textField slot,自定义输入框的结构与样式,替代原renderInput的功能。你可以复用MUI的TextField组件修改样式,也可以完全自定义输入框结构。

2. 代码示例:自定义内嵌图标输入框样式

以下示例实现类似目标样式(圆角边框、日历图标内嵌右侧、简洁输入框):

import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import TextField from '@mui/material/TextField';
import CalendarTodayIcon from '@mui/icons-material/CalendarToday';
import { styled } from '@mui/material/styles';

// 自定义输入框样式
const StyledTextField = styled(TextField)(({ theme }) => ({
  '& .MuiOutlinedInput-root': {
    borderRadius: 8,
    paddingRight: 8,
    '& fieldset': {
      borderColor: theme.palette.grey[300],
    },
    '&:hover fieldset': {
      borderColor: theme.palette.primary.main,
    },
    '&.Mui-focused fieldset': {
      borderColor: theme.palette.primary.main,
      borderWidth: 2,
    },
  },
  '& .MuiInputAdornment-positionEnd': {
    marginLeft: 0,
  },
}));

function CustomDatePicker() {
  return (
    <DatePicker
      label="选择日期"
      slots={{
        // 重写textField slot,使用自定义样式的TextField
        textField: ({ inputRef, inputProps, ...props }) => (
          <StyledTextField
            {...props}
            inputRef={inputRef}
            inputProps={inputProps}
            InputProps={{
              endAdornment: (
                <CalendarTodayIcon
                  sx={{ color: 'grey.500', cursor: 'pointer' }}
                />
              ),
            }}
          />
        ),
      }}
      // 通过slotProps传递通用属性
      slotProps={{
        textField: {
          variant: 'outlined',
          size: 'small',
        },
      }}
    />
  );
}

3. 完全自定义输入框结构

如果需要更灵活的结构(脱离TextField组件),可直接在textField slot中编写自定义DOM,只需绑定inputRef和inputProps保证交互逻辑正常:

slots={{
  textField: ({ inputRef, inputProps, value, onClick }) => (
    <div 
      sx={{
        border: '1px solid #e0e0e0',
        borderRadius: 8,
        padding: '8px 12px',
        display: 'flex',
        alignItems: 'center',
        gap: 1,
        cursor: 'pointer',
        '&:hover': { borderColor: '#1976d2' }
      }}
      onClick={onClick}
    >
      <input
        ref={inputRef}
        {...inputProps}
        value={value}
        sx={{ border: 'none', outline: 'none', flex: 1 }}
        readOnly
      />
      <CalendarTodayIcon sx={{ color: '#9e9e9e' }} />
    </div>
  ),
}}

4. 自定义日历面板样式(可选)

若需调整弹出的日历面板样式,可通过calendar、day等slot修改,例如:

slots={{
  calendar: styled('div')(({ theme }) => ({
    borderRadius: 12,
    boxShadow: theme.shadows[4],
    overflow: 'hidden',
  })),
}}

内容的提问来源于stack exchange,提问作者Serafim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:35:17