Implementing DatePicker
Component Overview
The DatePicker is a Syncfusion React component for date selection with powerful features:
- Calendar popup - Visual date selection with navigation
- Flexible formatting - Display and input formats with pattern support
- Masked input -
enableMaskfor segment-by-segment date entry withmaskPlaceholder - Range validation - Min/max dates with
strictModeautomatic correction - Multiple views - Month, year, and decade views via
startanddepthproperties - Day cell customization - Disable weekends, highlight special dates via
renderDayCellevent - Full globalization - 150+ cultures, RTL (
enableRtl), locale-specific formatting,firstDayOfWeek - WCAG 2.2 compliant - Full accessibility with keyboard navigation and ARIA attributes
- Form ready - Controlled components, React hooks, form validation integration
- Programmatic control -
show(),hide(),focusIn(),focusOut(),navigateTo(),currentView()
Complete API Summary
Key Properties
| Property | Type | Default | Description | |
|---|---|---|---|---|
value | Date | null | Selected date | |
min | Date | 1900-01-01 | Minimum selectable date | |
max | Date | 2099-12-31 | Maximum selectable date | |
format | string \ | FormatObject | null | Display format (e.g., "dd/MM/yyyy") |
inputFormats | string[] \ | FormatObject[] | null | Accepted input formats array |
placeholder | string | null | Placeholder text for the input | |
enabled | boolean | true | Enable or disable the component | |
readonly | boolean | false | Readonly state | |
allowEdit | boolean | true | Allow editing the input textbox | |
strictMode | boolean | false | Auto-correct out-of-range dates | |
showClearButton | boolean | true | Show/hide the clear button | |
showTodayButton | boolean | true | Show/hide today button | |
start | CalendarView | Month | Initial view: "Month", "Year", "Decade" | |
depth | CalendarView | Month | Deepest navigation level | |
enableMask | boolean | false | Enable masked date input | |
maskPlaceholder | MaskPlaceholderModel | {...} | Segment placeholders for masked input | |
enableRtl | boolean | false | Right-to-left rendering | |
locale | string | '' | Culture/locale code | |
firstDayOfWeek | number | 0 | First day of week (0=Sunday) | |
weekNumber | boolean | false | Show week numbers | |
weekRule | WeekRule | FirstDay | Rule for first week of year | |
calendarMode | CalendarType | Gregorian | Calendar type (Gregorian or Islamic) | |
dayHeaderFormat | DayHeaderFormats | Short | Day name format in header | |
floatLabelType | FloatLabelType | Never | Floating label behavior | |
fullScreenMode | boolean | false | Full screen popup on mobile | |
openOnFocus | boolean | false | Open popup on input focus | |
serverTimezoneOffset | number | null | Server timezone offset | |
cssClass | string | null | Custom CSS class | |
htmlAttributes | {[key: string]: string} | {} | Additional HTML attributes | |
keyConfigs | {[key: string]: string} | null | Custom key action mappings | |
width | number \ | string | null | Component width |
zIndex | number | 1000 | Popup z-index | |
enablePersistence | boolean | false | Persist state between reloads |
Methods
| Method | Returns | Description |
|---|---|---|
show() | void | Opens the calendar popup |
hide() | void | Closes the calendar popup |
focusIn() | void | Sets focus to the component |
focusOut() | void | Removes focus from the component |
navigateTo(view, date) | void | Navigates to a specific view and date |
currentView() | string | Returns the current calendar view name |
getPersistData() | string | Gets persisted state data |
removeDate(dates) | void | Removes date(s) from the values |
destroy() | void | Destroys the component |
Events
| Event | Args Type | Description | |
|---|---|---|---|
change | ChangedEventArgs | Fires when the selected date changes | |
focus | FocusEventArgs | Fires when input gains focus | |
blur | BlurEventArgs | Fires when input loses focus | |
open | PreventableEventArgs \ | PopupObjectArgs | Fires when the popup opens |
close | PreventableEventArgs \ | PopupObjectArgs | Fires when the popup closes |
cleared | ClearedEventArgs | Fires when value is cleared | |
created | Object | Fires when component is created | |
destroyed | Object | Fires when component is destroyed | |
navigated | NavigatedEventArgs | Fires when calendar view is navigated | |
renderDayCell | RenderDayCellEventArgs | Fires when each day cell is rendered |
Documentation & Navigation Guide
When the user needs help with DatePicker, guide them to the appropriate reference:
Getting Started
📄 Read: references/getting-started.md
- Installation via npm (@syncfusion/ej2-react-calendars)
- CSS theme imports (material3, bootstrap, fluent, tailwind)
- Component imports and setup
- Basic JSX implementation with DatePickerComponent
- Functional vs class component examples
- Running your first application
Date Formats & Input
📄 Read: references/date-formats-and-input.md
- Display format property and patterns (yyyy-MM-dd, dd/MM/yyyy, etc.)
- Custom format specifiers (# and 0 patterns)
- Input formats for flexible date entry (accepting multiple formats)
- Format examples with real-world scenarios
- Parsing and converting user input automatically
- Culture-based default formatting
Date Range & Validation
📄 Read: references/date-range-and-validation.md
- Min and max date properties for range restriction
- Range validation and error states
- strictMode for automatic out-of-range correction
- Out-of-range behavior and error handling
- Disabling dates outside valid range
- Edge cases and gotchas
Date Views & Navigation
📄 Read: references/date-views-and-navigation.md
- Start property (month, year, decade initial view)
- Depth property for restricting view levels
- Calendar navigation and user interactions
- Month and year selection shortcuts
- Navigating between different views
- Default behavior and best practices
Customization & Styling
📄 Read: references/customization-and-styling.md
- CSS classes for styling (e-datepicker, e-calendar, e-day, etc.)
- renderDayCell event for day customization
- Disabling specific dates and weekends
- Placeholder, disabled, and readonly states
- Custom CSS and theme customization
- Day cell appearance and behavior
Globalization & Localization
📄 Read: references/globalization-and-localization.md
- Culture and locale configuration (German, French, Arabic, etc.)
- Loading CLDR data for internationalization
- Date format by culture (different countries, different formats)
- Locale text customization (today button, placeholder)
- Right-to-Left (RTL) support for Arabic, Hebrew, Urdu
- Week start day by culture
- Number formatting and calendar adjustments
Accessibility & Keyboard Navigation
📄 Read: references/accessibility-and-keyboard.md
- WCAG 2.2 compliance and accessibility standards
- Keyboard navigation shortcuts (Alt+Down, arrow keys, Esc)
- ARIA attributes (aria-expanded, aria-disabled, aria-activedescendant)
- Screen reader support and announcements
- Focus management and visible focus indicators
- Color contrast and visual accessibility
- Mobile device support
Date Masking & Advanced Validation
📄 Read: references/date-masking-and-strict-mode.md
enableMaskproperty for structured segment-by-segment date inputmaskPlaceholderfor custom segment placeholder text- Date masking patterns for input guidance
strictModeproperty behavior and enforcement- Date parsing rules and validation logic
- Input validation and format enforcement
- Edge cases (leap years, month boundaries, etc.)
- Troubleshooting common validation issues
- Best practices for date input
Quick Start Example
Here's a minimal working example to get started:
import React, { useState } from 'react';
import { DatePickerComponent } from '@syncfusion/ej2-react-calendars';
import '@syncfusion/ej2-base/styles/material3.css';
import '@syncfusion/ej2-buttons/styles/material3.css';
import '@syncfusion/ej2-inputs/styles/material3.css';
import '@syncfusion/ej2-popups/styles/material3.css';
import '@syncfusion/ej2-react-calendars/styles/material3.css';
export default function App() {
const [selectedDate, setSelectedDate] = useState(new Date());
return (
<div style={{ padding: '20px' }}>
<h3>Select a Date</h3>
<DatePickerComponent
value={selectedDate}
change={(e) => setSelectedDate(e.value)}
placeholder="Enter date"
/>
<p>Selected: {selectedDate?.toDateString()}</p>
</div>
);
}Key points:
- Import
DatePickerComponentfrom@syncfusion/ej2-react-calendars - Import all required CSS themes (base, buttons, inputs, popups, calendars)
- Use
valueprop for the current date (can be null or Date object) - Use
changeevent (notonChange) to update React state — this is the Syncfusion event name - DatePicker opens a calendar popup on click or Alt+Down arrow
Common Patterns
1. Date Range Picker (Min/Max Dates)
<DatePickerComponent
value={new Date()}
min={new Date(2026, 0, 1)}
max={new Date(2026, 11, 31)}
placeholder="Select a date in 2026"
/>2. Custom Date Format
<DatePickerComponent
value={new Date()}
format="dd/MM/yyyy"
placeholder="DD/MM/YYYY"
/>3. Multiple Accepted Input Formats
<DatePickerComponent
value={new Date()}
format="yyyy-MM-dd"
inputFormats={['dd/MM/yyyy', 'yyyy-MM-dd', 'yyyyMMdd']}
placeholder="Enter date (dd/MM/yyyy or yyyy-MM-dd)"
/>4. Year/Decade View for Birth Date Selection
<DatePickerComponent
value={new Date()}
start="Decade"
depth="Year"
placeholder="Select year"
/>5. Disable Weekends
<DatePickerComponent
value={new Date()}
renderDayCell={(args) => {
if ((args.date.getDay()) === 0 || (args.date.getDay()) === 6) {
args.isDisabled = true;
}
}}
placeholder="Weekdays only"
/>6. Controlled Component in React Form
const [date, setDate] = useState(null);
<DatePickerComponent
value={date}
change={(e) => setDate(e.value)}
format="yyyy-MM-dd"
strictMode={true}
placeholder="Enter date"
/>7. German Culture with RTL Support
<DatePickerComponent
locale="de"
enableRtl={false}
firstDayOfWeek={1}
value={new Date()}
placeholder="Datum eingeben"
/>8. Masked Date Input
<DatePickerComponent
enableMask={true}
format="MM/dd/yyyy"
maskPlaceholder={{ day: 'DD', month: 'MM', year: 'YYYY' }}
placeholder="Select a date"
/>9. Programmatic Control
import { useRef } from 'react';
const datePickerRef = useRef(null);
// Open calendar
datePickerRef.current.show();
// Close calendar
datePickerRef.current.hide();
// Focus
datePickerRef.current.focusIn();
// Get current view
const view = datePickerRef.current.currentView(); // "Month" | "Year" | "Decade"
// Navigate to specific view
datePickerRef.current.navigateTo('Year', new Date(2026, 0, 1));
<DatePickerComponent ref={datePickerRef} value={new Date()} />10. Handle All Key Events
<DatePickerComponent
value={new Date()}
change={(e) => console.log('Changed:', e.value)}
focus={(e) => console.log('Focused')}
blur={(e) => console.log('Blurred')}
open={(e) => console.log('Opened')}
close={(e) => console.log('Closed')}
cleared={(e) => console.log('Cleared')}
navigated={(e) => console.log('Navigated to view:', e.view)}
renderDayCell={(args) => {
// Disable weekends
if (args.date.getDay() === 0 || args.date.getDay() === 6) {
args.isDisabled = true;
}
}}
/>