Select days on mouse enter
A more complex example for selecting range of days using the mouse enter events.
Code
import React from 'react';
import Helmet from 'react-helmet';
import DayPicker, { DateUtils } from 'react-day-picker';
import 'react-day-picker/lib/style.css';
export default class Example extends React.Component {
constructor(props) {
super(props);
this.handleDayClick = this.handleDayClick.bind(this);
this.handleDayMouseEnter = this.handleDayMouseEnter.bind(this);
this.handleResetClick = this.handleResetClick.bind(this);
this.state = this.getInitialState();
}
getInitialState() {
return {
from: null,
to: null,
enteredTo: null, // Keep track of the last day for mouseEnter.
};
}
isSelectingFirstDay(from, to, day) {
const isBeforeFirstDay = from && DateUtils.isDayBefore(day, from);
const isRangeSelected = from && to;
return !from || isBeforeFirstDay || isRangeSelected;
}
handleDayClick(day) {
const { from, to } = this.state;
if (from && to && day >= from && day <= to) {
this.handleResetClick();
return;
}
if (this.isSelectingFirstDay(from, to, day)) {
this.setState({
from: day,
to: null,
enteredTo: null,
});
} else {
this.setState({
to: day,
enteredTo: day,
});
}
}
handleDayMouseEnter(day) {
const { from, to } = this.state;
if (!this.isSelectingFirstDay(from, to, day)) {
this.setState({
enteredTo: day,
});
}
}
handleResetClick() {
this.setState(this.getInitialState());
}
render() {
const { from, to, enteredTo } = this.state;
const modifiers = { start: from, end: enteredTo };
const disabledDays = { before: this.state.from };
const selectedDays = [from, { from, to: enteredTo }];
return (
<div>
<DayPicker
className="Range"
numberOfMonths={2}
fromMonth={from}
selectedDays={selectedDays}
disabledDays={disabledDays}
modifiers={modifiers}
onDayClick={this.handleDayClick}
onDayMouseEnter={this.handleDayMouseEnter}
/>
<div>
{!from && !to && 'Please select the first day.'}
{from && !to && 'Please select the last day.'}
{from &&
to &&
`Selected from ${from.toLocaleDateString()} to
${to.toLocaleDateString()}`}{' '}
{from && to && (
<button className="link" onClick={this.handleResetClick}>
Reset
</button>
)}
</div>
<Helmet>
<style>{`
.Range .DayPicker-Day--selected:not(.DayPicker-Day--start):not(.DayPicker-Day--end):not(.DayPicker-Day--outside) {
background-color: #f0f8ff !important;
color: #4a90e2;
}
.Range .DayPicker-Day {
border-radius: 0 !important;
}
`}</style>
</Helmet>
</div>
);
}
}
Result
March 2021
Su
Mo
Tu
We
Th
Fr
Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
April 2021
Su
Mo
Tu
We
Th
Fr
Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Please select the first day.