import React from "react";
import dateFns from "date-fns";
class Calendar extends React.Component {
state = {
currentMonth: new Date(),
selectedDate: new Date()
};
renderHeader() {
const dateFormat = "MMMM YYYY";
return (
<div className="header row flex-middle">
<div className="col col-start">
<div className="icon" onClick={this.prevMonth}>
chevron_left
</div>
</div>
<div className="col col-center">
<span>{dateFns.format(this.state.currentMonth, dateFormat)}</span>
</div>
<div className="col col-end" onClick={this.nextMonth}>
<div className="icon">chevron_right</div>
</div>
</div>
);
}
renderDays() {
const dateFormat = "dddd";
const days = [];
let startDate = dateFns.startOfWeek(this.state.currentMonth);
for (let i = 0; i < 7; i++) {
days.push(
<div className="col col-center" key={i}>
{dateFns.format(dateFns.addDays(startDate, i), dateFormat)}
</div>
);
}
return <div className="days row">{days}</div>;
}
renderCells() {
const { currentMonth, selectedDate } = this.state;
const monthStart = dateFns.startOfMonth(currentMonth);
const monthEnd = dateFns.endOfMonth(monthStart);
const startDate = dateFns.startOfWeek(monthStart);
const endDate = dateFns.endOfWeek(monthEnd);
const dateFormat = "D";
const rows = [];
let days = [];
let day = startDate;
let formattedDate = "";
while (day <= endDate) {
for (let i = 0; i < 7; i++) {
formattedDate = dateFns.format(day, dateFormat);
const cloneDay = day;
days.push(
<div
className={`col cell ${
!dateFns.isSameMonth(day, monthStart)
? "disabled"
: dateFns.isSameDay(day, selectedDate)
? "selected"
: ""
}`}
key={day}
onClick={() => this.onDateClick(dateFns.parse(cloneDay))}>
<span className="number">{formattedDate}</span>
<span className="bg">{formattedDate}</span>
</div>
);
day = dateFns.addDays(day, 1);
}
rows.push(
<div className="row" key={day}>
{days}
</div>
);
days = [];
}
return <div className="body">{rows}</div>;
}
onDateClick = day => {
this.setState({
selectedDate: day
});
};
nextMonth = () => {
this.setState({
currentMonth: dateFns.addMonths(this.state.currentMonth, 1)
});
};
prevMonth = () => {
this.setState({
currentMonth: dateFns.subMonths(this.state.currentMonth, 1)
});
};
render() {
return (
<div className="calendar">
{this.renderHeader()}
{this.renderDays()}
{this.renderCells()}
</div>
);
}
}
export default Calendar;
/* imported Calendar here */
import React, { Component } from "react";
import Calendar from "./calendar/Calendar";
import dateFns from "date-fns";
class App extends Component {
render() {
return (
<div className="App">
<header>
<div id="logo">
<span className="icon">date_range</span>
<span>
react<b>calendar</b>
</span>
</div>
</header>
<main>
<Calendar />
<Calendar />
</main>
</div>
);
}
}
export default App;
如果所选的到达日期早于出发日期,并且选择了到达和离开之间的日期,我如何使日历的到达日期与出发日期相似,任何人都可以为我的英语不好对不起您*我使用dateFns插件来组织日期,这比momentJS相似。
如果所选择的到达日期早于出发日期,并选择了到达和离开之间的日期,则使Calendar的到达日期类似于出发日期,任何人都可以为我做不好的英语而表示抱歉*注意我使用dateFns组织日期的插件与momentJS相似,非常感谢。