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

如何在Material UI Date Picker中为特定日期(如法定节假日)设置样式?

给Material UI Date Picker的特定日期(法定节假日)自定义样式

嘿,这个需求其实在Material UI Date Picker里很好实现,核心是利用自定义日期渲染函数来判断目标日期并应用样式。我根据主流的MUI版本给你拆解步骤:

一、准备你的节假日数据

首先把需要特殊样式的日期整理成列表,如果你需要不同日期用不同样式,也可以把样式配置一起存进去:

// 基础版:仅日期列表
const holidays = [
  new Date(2024, 0, 1), // 元旦
  new Date(2024, 1, 10), // 春节
  // 更多节假日...
];

// 进阶版:带自定义样式的日期列表
const holidaysWithStyles = [
  { date: new Date(2024, 0, 1), style: { backgroundColor: "#ffcccc", color: "#d32f2f" } },
  { date: new Date(2024, 1, 10), style: { backgroundColor: "#e3f2fd", color: "#1976d2" } },
];

二、MUI v5+(@mui/x-date-pickers)实现方法

MUI v5的Date Picker使用slotProps来自定义各个组件,我们需要针对day slot配置renderDay函数:

方法1:统一样式的节假日

先自定义一个带样式的Day组件,再通过渲染函数判断应用:

import { DatePicker } from "@mui/x-date-pickers/DatePicker";
import { Day } from "@mui/x-date-pickers/Day";
import { styled } from "@mui/material/styles";

// 自定义节假日日期的样式组件
const HolidayDay = styled(Day)(({ theme }) => ({
  backgroundColor: theme.palette.error.light,
  color: theme.palette.common.white,
  "&:hover": {
    backgroundColor: theme.palette.error.main,
    color: theme.palette.common.white,
  },
}));

// 判断日期是否为节假日的工具函数
const isHoliday = (date) => {
  return holidays.some(holiday => 
    holiday.getDate() === date.getDate() &&
    holiday.getMonth() === date.getMonth() &&
    holiday.getFullYear() === date.getFullYear()
  );
};

// 在DatePicker中配置
<DatePicker
  label="选择日期"
  slotProps={{
    day: {
      renderDay: (date, selectedDate, dayProps) => {
        // 如果是节假日,渲染自定义样式的Day组件,否则用默认组件
        return isHoliday(date) ? <HolidayDay {...dayProps} /> : <Day {...dayProps} />;
      },
    },
  }}
/>

方法2:不同节假日用不同样式

如果每个节假日需要独特样式,可以在渲染函数中动态获取样式并应用:

import { DatePicker } from "@mui/x-date-pickers/DatePicker";
import { Day } from "@mui/x-date-pickers/Day";

// 获取对应日期的自定义样式
const getHolidayStyle = (date) => {
  const matchedHoliday = holidaysWithStyles.find(item => 
    item.date.getDate() === date.getDate() &&
    item.date.getMonth() === date.getMonth() &&
    item.date.getFullYear() === date.getFullYear()
  );
  return matchedHoliday?.style || {};
};

<DatePicker
  label="选择日期"
  slotProps={{
    day: {
      renderDay: (date, selectedDate, dayProps) => {
        const customStyle = getHolidayStyle(date);
        // 把自定义样式合并到组件的sx属性中
        return <Day {...dayProps} sx={{ ...customStyle }} />;
      },
    },
  }}
/>

三、MUI v4版本实现方法

如果你还在使用MUI v4的Date Picker,直接给组件传入renderDay prop即可:

import { DatePicker } from "@material-ui/pickers";
import { Button } from "@material-ui/core";

<DatePicker
  label="选择日期"
  renderDay={(date, selectedDate, dayInCurrentMonth) => {
    // 过滤掉非当前月份的日期
    if (!dayInCurrentMonth) return null;
    
    const isHoliday = holidays.some(holiday => 
      holiday.getDate() === date.getDate() &&
      holiday.getMonth() === date.getMonth() &&
      holiday.getFullYear() === date.getFullYear()
    );

    // 根据是否为节假日返回不同样式的按钮
    return (
      <Button
        variant={isHoliday ? "contained" : "text"}
        color={isHoliday ? "error" : "default"}
        size="small"
      >
        {date.getDate()}
      </Button>
    );
  }}
/>

注意事项

  • 时区问题:比较日期时建议统一使用UTC时间,避免本地时区差异导致判断错误。比如可以把日期转换为UTC时间后再比较:
    const isHoliday = (date) => {
      const targetDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
      return holidays.some(holiday => {
        const holidayUTC = new Date(Date.UTC(holiday.getFullYear(), holiday.getMonth(), holiday.getDate()));
        return targetDate.getTime() === holidayUTC.getTime();
      });
    };
    
  • 样式优先级:如果自定义样式不生效,可以检查是否被组件默认样式覆盖,尝试用!important或者调整styled组件的优先级。

这样就能轻松给指定日期加上你想要的样式啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:51:30