这是一个使用 react-bootstrap-datepicker 的自定义日期选择器组件示例
其中有开始日期和结束日期
import React, { Component } from "react";
import PropTypes from "prop-types";
import DatePicker from "react-bootstrap-date-picker";
import { FormGroup, Col, HelpBlock, ControlLabel } from "react-bootstrap";
import validationError from "../../utils/validation";
export default class DateSelector extends Component {
constructor(props) {
super(props);
this.state = {
fromDate: props.fromDate || new Date().toISOString(),
toDate: props.toDate || new Date().toISOString(),
validationState: {
fromDate: null,
toDate: null
}
};
}
UNSAFE_componentWillReceiveProps(nextProps) {
if (
this.state.fromDate !== nextProps.fromDate ||
this.state.toDate !== nextProps.toDate
) {
this.setState({
fromDate: nextProps.fromDate,
toDate: nextProps.toDate
});
}
}
//setMax selectable Date
setMaxDate = () => {
const aYearFromNow = new Date();
return new Date(
aYearFromNow.setFullYear(aYearFromNow.getFullYear() + 1)
).toISOString();
};
renderError = () => {
return this.state.toDate >= this.state.fromDate ? null : (
<HelpBlock>{validationError.DATE_VALIDATION_ERROR}</HelpBlock>
);
};
//check for to date is greater than from value and set error in state
validateDates = () => {
this.state.toDate < this.state.fromDate
? this.setState({
validationState: { toDate: null }
})
: this.setState({
validationState: { toDate: "error" }
});
};
//function to handle To(End) Date onChange
toDateHandleChange = date => {
this.setState({
toDate: date
});
this.validateDates();
//send data to parent component
this.props.dateHandler({ fromDate: this.state.fromDate, toDate: date });
};
//function to handle From(start) Date onChange
fromDateHandleChange = date => {
this.setState({
fromDate: date
});
this.validateDates();
//send data to parent component
this.props.dateHandler({ fromDate: date, toDate: this.state.toDate });
};
renderToDate = ( toDate, fromDate, validationState) => {
return (
<FormGroup controlId="toDate" validationState={validationState.toDate}>
<Col componentClass={ControlLabel} sm={2}>
To
</Col>
<Col sm={4}>
<DatePicker
disabled={editable}
id="to-date-dt"
value={toDate}
minDate={fromDate}
onChange={this.toDateHandleChange}
/>
{this.renderError()}
</Col>
</FormGroup>
);
};
buildComponent = (props, state) => {
const { fromDate, toDate, validationState } = state;
return (
<div>
<FormGroup
controlId="fromDate"
validationState={this.state.validationState.fromDate}
>
<Col componentClass={ControlLabel} sm={2}>
From
</Col>
<Col sm={4}>
<DatePicker
id="from-date-dt"
value={fromDate}
minDate={new Date().toISOString()}
maxDate={this.setMaxDate()}
onChange={this.fromDateHandleChange}
/>
{this.renderError()}
</Col>
</FormGroup>
{this.renderToDate(toDate, fromDate, validationState)}
</div>
);
};
render() {
return this.buildComponent(this.props, this.state);
}
}
DateSelector.propTypes = {
fromDate: PropTypes.string,
toDate: PropTypes.string,
dateHandler: PropTypes.func.isRequired,
};
在您的组件中,您可以使用如下方式
dateHandler = data => {
this.setState({
fromDate: data.fromDate,
toDate: data.toDate
});
};
<DateSelector
fromDate={fromDate}
toDate={toDate}
dateHandler={this.dateHandler}
/>