rc-calendars
Version:
This a simple react calendar component
292 lines (278 loc) • 8.87 kB
JavaScript
/**
* Author chencc
* Date 2020/03/29
*/
import React, {Component} from 'react';
import CalendarCore from "./core";
import DateHeader from 'components/dateHeader'
import YearPanel from 'components/yearPanel'
import DatePanel from 'components/datePanel.js'
import MonthPanel from 'components/monthPanel'
import moment from 'moment'
import './scss/style.scss'
const calendar = new CalendarCore()
class Calendar extends Component {
constructor (props) {
super(props)
this.state = {
value: this.props.value,
type: this.props.type || 'date',
min: this.props.min || '1900/01/01',
max: this.props.max,
currentPanel: this.props.type || 'date'
}
this.init = this.init.bind(this)
this.selectYearType = this.selectYearType.bind(this)
this.selectMonthType = this.selectMonthType.bind(this)
this.selectYear = this.selectYear.bind(this)
this.selectMonth = this.selectMonth.bind(this)
this.selectDate = this.selectDate.bind(this)
this.prevYear = this.prevYear.bind(this)
this.nextYear = this.nextYear.bind(this)
this.prevMonth = this.prevMonth.bind(this)
this.nextMonth = this.nextMonth.bind(this)
this.changeValue = this.changeValue.bind(this)
}
componentDidMount () {
this.init()
}
render () {
const { currentPanel } = this.state
return (
<div className="calendar-wrapper">
<div className="calendar-header">
<DateHeader
data = {this.state}
selectYearType={this.selectYearType}
selectMonthType={this.selectMonthType}
prevYear={this.prevYear}
nextYear={this.nextYear}
prevMonth={this.prevMonth}
nextMonth={this.nextMonth} />
</div>
<div className="calendar-body">
{
currentPanel && currentPanel === 'year' &&
<YearPanel
data={this.state}
selectYear={this.selectYear}/> ||
currentPanel === 'month' &&
<MonthPanel
selectMonth={this.selectMonth}
data={this.state} /> ||
currentPanel === 'date' &&
<DatePanel
selectDate = {this.selectDate}
data={this.state} />
}
</div>
</div>
)
}
// 初始化 获取 当前年月日
init () {
let yearTable = [],
monthTable = [],
dateTable = []
calendar.init({
value: this.props.value,
min: this.state.min,
max: this.state.max
}).createYear((info) => {
yearTable = info
}).createMonth((info) => {
monthTable = info
}).createMonthDate((info) => {
dateTable = info
})
this.setState({
headerValue: calendar.data.year + '/' + calendar.data.month, // calendar title
yearTable: yearTable, // calendar year table
monthTable: monthTable, // calendar month table
dateTable: dateTable, // calendar date table
weeks_list: calendar.lang[calendar.data.lang].weeks, // calendar language week
year: calendar.data.year,
month: calendar.data.year + '/' + calendar.data.month,
date: calendar.data.year + '/' + calendar.data.month + '/' + calendar.data.date,
datetime: calendar.data.year + '' + calendar.data.month + '' + calendar.data.date
})
}
// title select year 标题上选择年份
selectYearType () {
this.setState({
currentPanel: 'year'
})
}
// title select month 标题上选择月份
selectMonthType () {
this.setState({
currentPanel: 'month'
})
}
// selectYear 当选中某个年份时
selectYear (val) {
// 根据 type 类型 如果只是year则直接返回结果
if (this.state.type === 'year') {
this.changeValue(val)
this.setState({
year: val.year,
headerValue: val.year + '/'
})
} else {
// 选择年份后更新月份table
const monthTable = calendar.updateMonth(val.year)
this.setState({
year: val,
monthTable: monthTable,
headerValue: val.year + '/' + this.state.month.split('/')[1],
currentPanel: 'month'
})
}
}
// selectMonth
selectMonth (val) {
if (this.state.type === 'month') {
this.setState({
month: val.year + '/' + val.month,
headerValue: val.year + '/' + val.month
})
this.changeValue(val)
} else {
// 选择月份后更新日期table
const dateTable = calendar.updateMonthDate(val)
this.setState({
month: val.year + '/' + val.month,
headerValue: val.year + '/' + val.month,
dateTable: dateTable,
currentPanel: 'date'
})
}
}
// selectDate
selectDate (val) {
if (val.status !== 'current') {
// 选择月份后更新日期table
const dateTable = calendar.updateMonthDate(val)
this.setState({
month: val.year + '/' + val.month,
headerValue: val.year + '/' + val.month,
dateTable: dateTable,
date: val.year + '/' + val.month + '/' + val.date
})
} else {
this.setState({
date: val.year + '/' + val.month + '/' + val.date
})
}
this.props.changeValue && this.changeValue(val)
}
// prev-double
prevYear () {
if (this.state.currentPanel === 'year') {
const yearTable = calendar.updatePrevDouYear(this.state.yearTable)
this.setState({
yearTable: yearTable
})
} else {
const yearTable = calendar.updatePreYear(this.state.yearTable)
const monthTable = calendar.updateMonth(yearTable[0].year)
const dateTable = calendar.updateMonthDate({
year: yearTable[0].year,
month: this.state.month.split('/')[1]
})
this.setState({
yearTable: yearTable,
monthTable: monthTable,
dateTable: dateTable,
headerValue: yearTable[0].year + '/' + this.state.month.split('/')[1],
})
}
}
// next-double
nextYear () {
if (this.state.currentPanel === 'year') {
const yearTable = calendar.updateNextDouYear(this.state.yearTable)
this.setState({
yearTable: yearTable
})
} else {
const yearTable = calendar.updateNextYear(this.state.yearTable)
const monthTable = calendar.updateMonth(yearTable[0].year)
const dateTable = calendar.updateMonthDate({
year: yearTable[0].year,
month: this.state.month.split('/')[1]
})
this.setState({
yearTable: yearTable,
monthTable: monthTable,
dateTable: dateTable,
headerValue: yearTable[0].year + '/' + this.state.month.split('/')[1],
})
}
}
// prev
prevMonth () {
const year = parseInt(this.state.headerValue.split('/')[0])
const month = parseInt(this.state.headerValue.split('/')[1])
if ((month - 1) <= 0) {
const dateTable = calendar.updateMonthDate({
year: year - 1,
month: 12
})
this.setState({
dateTable: dateTable,
headerValue: year - 1 + '/' + 12
})
} else {
const dateTable = calendar.updateMonthDate({
year: year,
month: month - 1
})
this.setState({
dateTable: dateTable,
headerValue: year + '/' + (month - 1)
})
}
}
// next
nextMonth () {
let year = parseInt(this.state.headerValue.split('/')[0])
let month = parseInt(this.state.headerValue.split('/')[1])
if ((month + 1) > 12) {
const dateTable = calendar.updateMonthDate({
year: year + 1,
month: 1
})
this.setState({
dateTable: dateTable,
headerValue: year + 1 + '/' + 1
})
} else {
const dateTable = calendar.updateMonthDate({
year: year,
month: month + 1
})
this.setState({
dateTable: dateTable,
headerValue: year + '/' + (month + 1)
})
}
}
// return component value
changeValue (val) {
let value = ''
let formatDefault = ''
if (this.state.type === 'date') {
formatDefault = this.props.format || 'YYYYMMDD'
value = String(val.year) + ' ' + String(calendar.digit(val.month)) + ' ' + String(calendar.digit(val.date))
} else if (this.state.type === 'month') {
formatDefault = this.props.format || 'YYYYMM'
value = String(val.year) + ' ' + String(calendar.digit(val.month))
} else if (this.state.type === 'year') {
formatDefault = this.props.format || 'YYYY'
value = String(val.year)
}
this.props.changeValue(moment(value).format(formatDefault))
}
}
export default Calendar