![](/img/trans.png)
[英]How to set the initial state in React based on a Rx.ReplaySubject model
[英]How to set initial state with undo action on React?
我有一個帶有拖放功能的react-big-calendar,我想將事件移動到另一個位置時,出現一個小吃欄,它具有這樣的undo操作:
我想要當我單擊撤消操作時,事件設置初始狀態(初始位置)
我的代碼是:
moveEvent = ({event, start, end, isAllDay: droppedOnAllDaySlot}) => {
const { events } = this.state;
const idx = events.indexOf(event);
let allDay = event.allDay ;
if(!event.allDay && droppedOnAllDaySlot)
{allDay = true;}
else if (event.allDay && !droppedOnAllDaySlot)
{ allDay = false;}
const updatedEvent = { ...event, start, end, allDay }
const nextEvents = [...events]
nextEvents.splice(idx, 1, updatedEvent)
this.setState({
events : nextEvents,
dragAndDrop : true,
open : true
})
}
handleClose = () => {
this.setState({ open: false });
};
handleClick = () => {
this.setState({ open: true });
};
handleUndo = () => {
this.setState({
dragAndDrop : !this.state.dragAndDrop,
events: this.state.events
})
}
render() {
return (
<div>
<DragAndDropCalendar
selectable
localizer={localizer}
events={this.state.events}
views={['month','week','day']}
//defaultDate={new Date(2019, 2, 19)}
defaultView="week"
culture = 'fr'
timeslots={1}
step={15}
style={{ height: "100vh" }}
onEventDrop={this.moveEvent}
min={new Date(2017, 10, 0, 7, 0, 0)}
max={new Date(2017, 10, 0, 21, 0, 0)}
resizable
onEventResize={this.resizeEvent}
onSelectSlot={this.newEvent}
onSelectEvent={this.handleClickOpen}
/>
<Snackbar
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
open={this.state.open}
autoHideDuration={6000}
onClose={this.handleClose}
ContentProps={{
'aria-describedby': 'message-id',
}}
message={<span id="message-id">Evénement enregistré</span>}
action={[
<Button key="undo" color="secondary" size="small" onClick={this.handleUndo}>
Annuler
</Button>,
<IconButton
key="close"
aria-label="Close"
color="inherit"
onClick={this.handleClose}
>
<CloseIcon />
</IconButton>,
]}
/>
我的完整代碼: https : //codesandbox.io/s/mq42x1j90x
當我運行代碼並單擊“撤消”操作時,它不起作用,並且我的事件未設置初始位置。
我該如何解決?
我建議將先前事件存儲在this.state(例如this.state.previousEvents)內的單獨字段中,並在undo()動作中將當前事件設置為先前事件。 另外,當用戶關閉快餐欄或執行其他一些更改事件且無法還原的操作時,請不要忘記將previousEvents更新為當前事件值。
也代替this.setState使用this.state
this.setState({
dragAndDrop : !this.state.dragAndDrop,
events: this.state.events
})
您應該使用previousState :
this.setState((prevState) => ({
dragAndDrop : !prevState.dragAndDrop,
events: prevState.events
}))
所以完整版是
class Calendar extends Component {
state = {
events: [],
prevEvents: []
};
handleUndo = () => {
this.setState((prevState) => ({
events: prevState.prevEvents
}))
}
handleCloseSnackbar = () => {
this.setState((prevState) => ({
prevEvents: prevState.events
}))
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.