componentDidUpdate 是否有更好的替代方法来从日期选择器获取选定日期并将其发送到 API?
Is there a better alternative to componentDidUpdate for getting the selected date from a date picker and sending that in API?
我正在为日期选择器使用 react-dates,当用户更改日期时,它会更新一个道具并将其发送到后端以 运行 作为查询中的参数以获得特定结果那天从数据库中。它看起来像这样:
class TableComponent extends Component {
constructor(props) {
super(props);
this.columnDefs = columnDefs;
this.state = {
isLoading: true,
showTimeoutPopup: false,
tableData: [],
currentDate: this.props.currentDate
};
}
componentDidMount() {
this.fetchData();
}
componentDidUpdate(prevProps) {
if (`${this.props.currentDate}` !== prevProps.currentDate) {
this.fetchData(this.props.currentDate);
}
}
fetchData() {
this.setState({
isLoading: true
});
someApi.getData(this.props.currentDate).then(tableData => this.setState({
tableData: tableData,
isLoading: false
}))
.catch(error => {
if (error.message === 'timeout') {
this.setState({
showTimeoutPopup: true
});
} else {
throw new Error(error.message);
}
});
}
这在使用日期选择器 select 使用 UI 的日期时有效。当我尝试输入日期时,它崩溃了,因为当我输入第一个数字时,比如 12/23/2019 的月份,它会在 API 请求中发送该 1,但由于它不是有效日期而失败.但是,如果我粘贴整个日期,它将正常工作,因为它正在获得正确的日期。是否有更好的替代 componentDidUpdate 或更好的方法来构造此类请求?我需要它等到输入整个日期后再发送请求。我也不一定想要单击按钮,我希望它在日期选择器的文本框中完成所有这些操作。如果重要的是日期选择器组件:
class DatePicker extends Component {
constructor(props) {
super(props);
this.state = {
currentDate: this.props.currentDate,
focused: false
};
}
componentDidUpdate(prevProps) {
if (prevProps.currentDate !== this.props.currentDate) {
this.setState({currentDate: this.props.currentDate});
}
}
render() {
return (
<div className="form-group">
<label className="tuxedo_label">Select or enter a date to view error reports for that
day</label>
<div className="input_feedback">Dates should be in the format MM/DD/YYYY</div>
<SingleDatePicker
date={this.state.currentDate}
id="date_id"
customInputIcon={
<i className="icon calendar-o blue">
<span className="sr-only">open calendar</span>
</i>
}
displayFormat="MM/DD/YYYY"
numberOfMonths={1}
isOutsideRange={() => false}
onDateChange={this.props.onDateChange}
focused={this.state.focused}
onFocusChange={({ focused }) => this.setState({ focused: focused })}
/>
</div>
);
}
}
用moment来验证
npm install moment --save
import moment from 'moment';
componentDidUpdate(prevProps) {
if (`${this.props.currentDate}` !== prevProps.currentDate && moment(this.props.currentDate).isValid()) {
this.fetchData(this.props.currentDate);
}
}
我正在为日期选择器使用 react-dates,当用户更改日期时,它会更新一个道具并将其发送到后端以 运行 作为查询中的参数以获得特定结果那天从数据库中。它看起来像这样:
class TableComponent extends Component {
constructor(props) {
super(props);
this.columnDefs = columnDefs;
this.state = {
isLoading: true,
showTimeoutPopup: false,
tableData: [],
currentDate: this.props.currentDate
};
}
componentDidMount() {
this.fetchData();
}
componentDidUpdate(prevProps) {
if (`${this.props.currentDate}` !== prevProps.currentDate) {
this.fetchData(this.props.currentDate);
}
}
fetchData() {
this.setState({
isLoading: true
});
someApi.getData(this.props.currentDate).then(tableData => this.setState({
tableData: tableData,
isLoading: false
}))
.catch(error => {
if (error.message === 'timeout') {
this.setState({
showTimeoutPopup: true
});
} else {
throw new Error(error.message);
}
});
}
这在使用日期选择器 select 使用 UI 的日期时有效。当我尝试输入日期时,它崩溃了,因为当我输入第一个数字时,比如 12/23/2019 的月份,它会在 API 请求中发送该 1,但由于它不是有效日期而失败.但是,如果我粘贴整个日期,它将正常工作,因为它正在获得正确的日期。是否有更好的替代 componentDidUpdate 或更好的方法来构造此类请求?我需要它等到输入整个日期后再发送请求。我也不一定想要单击按钮,我希望它在日期选择器的文本框中完成所有这些操作。如果重要的是日期选择器组件:
class DatePicker extends Component {
constructor(props) {
super(props);
this.state = {
currentDate: this.props.currentDate,
focused: false
};
}
componentDidUpdate(prevProps) {
if (prevProps.currentDate !== this.props.currentDate) {
this.setState({currentDate: this.props.currentDate});
}
}
render() {
return (
<div className="form-group">
<label className="tuxedo_label">Select or enter a date to view error reports for that
day</label>
<div className="input_feedback">Dates should be in the format MM/DD/YYYY</div>
<SingleDatePicker
date={this.state.currentDate}
id="date_id"
customInputIcon={
<i className="icon calendar-o blue">
<span className="sr-only">open calendar</span>
</i>
}
displayFormat="MM/DD/YYYY"
numberOfMonths={1}
isOutsideRange={() => false}
onDateChange={this.props.onDateChange}
focused={this.state.focused}
onFocusChange={({ focused }) => this.setState({ focused: focused })}
/>
</div>
);
}
}
用moment来验证
npm install moment --save
import moment from 'moment';
componentDidUpdate(prevProps) {
if (`${this.props.currentDate}` !== prevProps.currentDate && moment(this.props.currentDate).isValid()) {
this.fetchData(this.props.currentDate);
}
}