Basic concepts
This guide illustrates the react-day-picker’s basic concepts by implementing a date picker to select, clear and disable days from the calendar.
You don’t need to read this guide to start using react-day-picker: see the examples if you prefer to directly copy & paste code in your application :-)
As default, react-day-picker just displays the calendar of the current month.
Code
import React from 'react';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
export default class BasicConcepts extends React.Component {
render() {
return (
<div>
<DayPicker />
</div>
);
}
}
Result
Selecting a day
Since react-day-picker doesn’t hold the selected day in its state, you have to hold it in your component’s state as the user interacts with the calendar.
The following component uses the onDayClick
prop to hold the selected day in its own state. Try to click or tap on a day cell!
Code
import React from 'react';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
export default class BasicConcepts extends React.Component {
constructor(props) {
super(props);
this.handleDayClick = this.handleDayClick.bind(this);
this.state = {
selectedDay: undefined,
};
}
handleDayClick(day) {
this.setState({ selectedDay: day });
}
render() {
return (
<div>
<DayPicker onDayClick={this.handleDayClick} />
{this.state.selectedDay ? (
<p>You clicked {this.state.selectedDay.toLocaleDateString()}</p>
) : (
<p>Please select a day.</p>
)}
</div>
);
}
}
Result
Please select a day.
Now, we want to highlight the day cell to show in the calendar which day has been selected. This is done using the selectedDays
prop.
Code
import React from 'react';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
export default class BasicConcepts extends React.Component {
constructor(props) {
super(props);
this.handleDayClick = this.handleDayClick.bind(this);
this.state = {
selectedDay: undefined,
};
}
handleDayClick(day) {
this.setState({ selectedDay: day });
}
render() {
return (
<div>
<DayPicker
onDayClick={this.handleDayClick}
selectedDays={this.state.selectedDay}
/>
{this.state.selectedDay ? (
<p>You clicked {this.state.selectedDay.toLocaleDateString()}</p>
) : (
<p>Please select a day.</p>
)}
</div>
);
}
}
Result
Please select a day.
Click or tap a day to highlight its cell.
Using the the browser’s developer tools, note how the selected day cell receive a
DayPicker-Day--selected
CSS modifier. Custom modifiers can be added to day cells using themodifiers
prop. Read more about them in the Matching days guide.
Clearing the selected day
When a selected day is clicked again, we want to clear it. This can be made setting the component’s selectedDay
to undefined
.
The onDayClick
handler receives as second argument an object that can be inspected to check if the clicked day has been selected or not.
Code
import React from 'react';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
export default class BasicConcepts extends React.Component {
constructor(props) {
super(props);
this.handleDayClick = this.handleDayClick.bind(this);
this.state = {
selectedDay: undefined,
};
}
handleDayClick(day, { selected }) {
if (selected) {
// Unselect the day if already selected
this.setState({ selectedDay: undefined });
return;
}
this.setState({ selectedDay: day });
}
render() {
return (
<div>
<DayPicker
onDayClick={this.handleDayClick}
selectedDays={this.state.selectedDay}
/>
{this.state.selectedDay ? (
<p>You clicked {this.state.selectedDay.toLocaleDateString()}</p>
) : (
<p>Please select a day.</p>
)}
</div>
);
}
}
Result
Please select a day.
Click or tap a day to see how it’s cleared when selected again.
Marking days as disabled
Disabled days should not respond to the user’s interaction and should appear as “disabled” (e.g. grayed out) on the calendar. Here we are displaying all the Sundays as disabled, using the disabledDays
prop.
Code
import React from 'react';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
export default class BasicConcepts extends React.Component {
render() {
return (
<div>
<DayPicker disabledDays={{ daysOfWeek: [0] }} />
</div>
);
}
}
Result
Using the the browser’s developer tools, note how the disabled day cell receive a
DayPicker-Day--disabled
CSS modifier.
In our selectable calendar, we can prevent the user selecting a disabled day inspecting the disabled
modifier in the handleDayClick
handler:
Code
import React from 'react';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
export default class BasicConcepts extends React.Component {
constructor(props) {
super(props);
this.handleDayClick = this.handleDayClick.bind(this);
this.state = {
selectedDay: undefined,
};
}
handleDayClick(day, { selected, disabled }) {
if (disabled) {
// Day is disabled, do nothing
return;
}
if (selected) {
// Unselect the day if already selected
this.setState({ selectedDay: undefined });
return;
}
this.setState({ selectedDay: day });
}
render() {
return (
<div>
<DayPicker
onDayClick={this.handleDayClick}
selectedDays={this.state.selectedDay}
disabledDays={{ daysOfWeek: [0] }}
/>
{this.state.selectedDay ? (
<p>You clicked {this.state.selectedDay.toLocaleDateString()}</p>
) : (
<p>Please select a day.</p>
)}
</div>
);
}
}
Result
Please select a day.
That’s it. You know now the basic concepts of react-day-picker: how to select and disable days and how to use the onDayClick
event handler.
react-day-picker is very flexible: using modifiers you can match days to change the aspect of the day cells, according to your app’s needs. You can use its extensive API to further customize the react-day-picker’s behavior and layout.
A very common implementation of react-day-picker is to bind it with an input
form field. This is why we included in the package the DayPickerInput component.