【发布时间】:2017-03-02 21:49:53
【问题描述】:
我有一个反应调度应用程序。如果用户尝试在接下来的 45 小时内安排某事,那么我想向他们发送一条警报消息,让他们可以确认他们选择的时间或更改时间。
我有一个组件Timepicker 处理用户选择的时间并返回用户选择的hour and minutes,如下所示:
renderTimes() {
return this.props.availabilities.map(function(_av, i) {
let av = new Date(_av);
return (
<a key={i} onClick={this.checkBookingWindow.bind(av.getHours(), av.getMinutes())} className="time-option">
{_pretty_time(av.getHours(), av.getMinutes())}
</a>
);
}.bind(this));
}
checkBookingWindow函数如下:
checkBookingWindow(hour, minute) {
var time = new Date().getHours();
let booking_window = Math.abs(time - hour);
if (booking_window < 45 && this.state.waive_alert == false) {
this.setState({open_popup: true});
} else if (booking_window < 45 && this.state.waive_alert == true) {
console.log("Waived all rights!");
//(a) PLAN WAS TO ADD THE CALLBACK OVER HERE!
} else if (booking_window > 45) {
console.log("Booking window over 5 hours");
}
}
如果时间小于 45 并且如果用户没有放弃警报,那么它应该会弹出弹出窗口并呈现如下:
renderWarningPopup() {
if (this.state.open_popup) {
return(
<div>
<div className="dashboard-modal">
<div className="dashboard-modal-header">
<span onClick={this.handleCancel.bind(this)} className="icon-cancel modal-close"></span>
</div>
<div className="dashboard-modal-body">
<p className="small-body-text text-center">Your session is going to happen within the next 45 hours.</p>
<p className="small-body-text buffer-bottom-25 buffer-bottom-10-mobile text-center">Are you sure?</p>
<div className="schedule-alert-buttons">
<button onClick={this.handleCancel.bind(this)} className="btn btn-change-booking">Change Time</button>
<button onClick={this.handleSubmit.bind(this)} className="btn btn-confirm-booking">Yes</button>
</div>
</div>
</div>
<div className="modal-bg bg-transparent-black"></div>
</div>
)}
}
在这里点击Yes,用户之前选择的时间和日期应该被提交,我为此做了以下功能:
handleSubmit(evt) {
evt.preventDefault();
this.setState({ waive_alert: true});
this.checkBookingWindow();
}
但由于显而易见的原因,它不会保留所选的小时和分钟值。在 React 中有没有办法做到这一点?
在更改代码以引发警报之前,我的renderTimes() 如下:
renderTimes() {
return this.props.availabilities.map(function(_av, i) {
let av = new Date(_av);
return (
<a key={i} onClick={this.props.onSelect.bind(null, av.getHours(), av.getMinutes())} className="time-option">
{_pretty_time(av.getHours(), av.getMinutes())}
</a>
);
}.bind(this));
}
所以我只是做了一个回调,它将返回选定的 hour 和 minutes。我现在想在 (a) 处做同样的事情,但前提是用户选择 Yes
【问题讨论】:
-
为什么不把选定的小时和分钟放在任何一个状态上,或者只放在你的反应类的属性上。
-
bind 不能这样工作。调用
bind会返回一个新函数,其中包含绑定上下文(this)和需要在某处持久化的参数。此外,由于您正在设置状态并且状态在this中可用 - 正如@JohnRuddell 所提到的 - 将小时和分钟置于状态并从状态访问值有什么危害?
标签: javascript jquery reactjs callback