我有一个react-big-calendar(父容器),我还有一个选择,根据这个选择(医生名)获取日历的事件,并且当我单击它时有一个按钮,对话框将将出现(另一个组件),在此对话框上,我有一个窗体可以在选择后添加事件,当我发布API时,我将其保存在本地存储中,但是刷新后添加的事件不会出现在日历上页面,然后重新选择医生姓名。但是我想,当我单击“保存”按钮时,将其直接添加到日历上,并将其显示在日历上。
我的 日历 代码是:
import Popup from './Popup'; export default class Calendar extends Component { constructor(props){ super(props); this.state = { events : [], open: false, }} componentDidMount = () => { fetch(process.env.REACT_APP_API_BACKEND_YET+'get_liste_praticien.php') .then(Response => Response.json()) .then(data => { this.setState ({ praticiens : data }) localStorage.setItem('Liste de praticiens ', JSON.stringify(this.state.praticiens)) }) } fetchData = (nom,identifiant_user) => { this.setState({ events: [], evtStorage:[], prevEvents:[], evtBackend:[] }) fetch(process.env.REACT_APP_API_BACKEND+'get_liste_planning') .then(Response => Response.json()) .then(data => { let evts = data.ListeResult; for (let i = 0; i < evts.length; i++) { evts[i].start = moment(evts[i].start).toDate(); evts[i].end = moment(evts[i].end).toDate(); if(evts[i].typeplanning === '0') this.setState({isConges:true}) this.state.events.push(evts[i]) } this.setState({ evtBackend: evts, events: evts }) localStorage.setItem("Liste de planning de " + nom, JSON.stringify(this.state.events)); }) const evtCached1 = JSON.parse(localStorage.getItem('Liste récente de planning de ' + nom)); if(evtCached1 !== null) { for (let j = 0; j < evtCached1.length; j++) { evtCached1[j].start = moment(evtCached1[j].start).toDate(); evtCached1[j].end = moment(evtCached1[j].end).toDate(); if(evtCached1[j].typeplanning === '0') this.setState({isConges:true}) this.state.events.push(evtCached1[j]); } this.setState({ events:this.state.events, }); localStorage.removeItem("Liste de planning de " + nom); }} // For the select handlePraticienChange = id_user => { this.setState({ openPopupAjout: true, id_user: id_user },() => { this.state.praticiens.map((praticien)=> { if(this.state.id_user === praticien.id_user){ this.setState ({ nom_user: praticien.nom_user}) this.fetchData(praticien.nom_user, praticien.identifiant_user); } }) } ); } // for the popup ModalAjoutb = (ref) => { if (ref) { this.ajoutb = ref.handleAjouterb; } else { this.ajoutb = null; } } render() { return ( <div> <button className="bp3-button bp3-icon-add-to-artifact .bp3-fill" tabIndex="0" onClick={() => this.ajoutb(this.state.id_user, this.state.events)}>Add event</button> <Select onChange={this.handlePraticienChange} value={this.state.id_user}> {this.state.praticiens.map((praticien) => <Option key={praticien.id_user} value={praticien.id_user}>{praticien.nom_user}</Option> )} </Select> <DragAndDropCalendar selectable localizer={localizer} events={this.state.events} views={['month','week','day']} defaultView="week" culture = 'fr' /> <Popup ref={this.ModalAjoutb} id_user={this.state.id_user} events={this.state.events} /> </div> ); }}
我的 对话框 代码是:
export default class Popup extends Component { constructor(props){ super(props); this.state = { events : [], }} handleAjouterb = (id_user) => { this.setState({ openPopupAjout: true, id_user, }, () => { this.fetchingPopup(this.state.id_user, this.state.identifiant_user, this.state.nom_user) }); } fetchingPopup = (id_user, identifiant_user, nom_user) =>{ const praticiensCached = JSON.parse(localStorage.getItem('Liste de praticiens ')); for (let j = 0; j < praticiensCached.length; j++) { if(id_user === praticiensCached[j].id_user){ identifiant_user = praticiensCached[j].identifiant_user; this.setState ({ nom_user: praticiensCached[j].nom_user }) } } handleValider = event => { event.preventDefault(); const praticiensCached = JSON.parse(localStorage.getItem('Liste de praticiens ')); for (let j = 0; j < praticiensCached.length; j++) { if(this.state.id_user === praticiensCached[j].id_user) this.state.identifiant_user = praticiensCached[j].identifiant_user; } const formData = new FormData(); formData.append('identifiant_user', this.state.identifiant_user); formData.append('heuredebut', this.state.tranchesC[0].startC); formData.append('heurefin', this.state.tranchesC[0].endC); formData.append('libelleconge', this.state.libelle); axios({ method: 'post', url: process.env.REACT_APP_API_BACKEND+'add_event_docteur', data: formData, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', } }) .then(() => { fetch(process.env.REACT_APP_API_BACKEND+'get_liste_planning/start='+moment().startOf('isoweek').subtract(14,'days').toJSON()+'&end='+moment().endOf('isoweek').add(2,'months').toJSON()+'&identifiant_user='+this.state.identifiant_user) .then(Response => Response.json()) .then(data => { let evts = data.ListeResult; for (let i = 0; i < evts.length; i++) { evts[i].start = moment(evts[i].start).toDate(); evts[i].end = moment(evts[i].end).toDate(); this.state.events.push(evts[i]) } this.setState({ events: this.state.events }, ()=> { localStorage.setItem('Liste récente de planning de ' + this.state.nom_user, JSON.stringify(this.state.events)); localStorage.removeItem("Liste de planning de " + this.state.nom_user); localStorage.setItem("Liste de planning de " + this.state.nom_user, JSON.stringify(this.state.events)); }) }) }) } render() { return ( <div> <Dialog icon="application" onClose={this.handleClose} title="Organisation des plannings du docteur" {...this.state} isOpen={this.state.openPopupAjout}> <Input id="libelle" style={{ width: '480px' }} value={this.state.libelle} onChange={this.handleInputChange('libelle')}/> <label className="pt-label .modifier"><strong>Date</strong></label> <LocaleProvider locale={fr_FR}> <RangePicker id="date" name= "date" locale="fr" placeholder={["Date de début","Date de fin"]} separator="-" onChange={this.handleDateCChange} value={this.state.dateIC} format="DD/MM/YYYY" allowClear={false}/> </LocaleProvider> <label className="pt-label .modifier"> <strong>Heure de début</strong></label> <Time value={el.startC} onChange={time => this.handleKeyboardStartCChange(i, time)} style={heure} disableUnderline={true} inputComponent={TextMaskCustom} endAdornment={ <InputAdornment position="end" style={{opacity:'0.4'}}> <IconButton onClick={() => this.openDialogC(i, el.startC, "startC")}><i style={{fontSize:'18px'}} className="zmdi zmdi-alarm" /></IconButton> </InputAdornment>} /> <label className="pt-label .modifier"> <strong>Heure de fin</strong></label> <Time value={el.endC} onChange={time => this.handleKeyboardEndCChange(i, time)} style={heure} disableUnderline={true} inputComponent={TextMaskCustom} endAdornment={ <InputAdornment position="end" style={{opacity:'0.4'}}> <IconButton onClick={() => this.openDialogC(i, el.endC, "endC")}><i style={{fontSize:'18px'}} className="zmdi zmdi-alarm" /></IconButton></InputAdornment> }/> <Clock maxWidth="xs" open={this.state.isOpenC} onBackdropClick={this.closeDialogC}> <TimePicker mode="24h" value={this.createDateFromTextValueC(this.state.datePickerValueC)} onChange={this.handleDialogCChange}/> <DialogActions> <ButtonOk onClick={this.closeDialogC} color="primary"> Ok </ButtonOk></DialogActions> </Clock> <AnchorButton style={{display:'inline-block'}} intent={Intent.SUCCESS} onClick={this.handleValider}>Valider</AnchorButton> </div> ); }}
我想刷新我的事件列表,并在弹出窗口中的发布表单上而不是刷新页面后出现在日历上添加我的事件,我将重新选择医生。
我该如何解决?
不要在状态中将事件保存在弹出窗口中,直接从道具访问事件。
在您的日历中,创建一个将更新状态的函数。
updateEvents = (events, callback = () => {}) => { this.setState( { events }, callback ); }; <Popup updateEvents={this.updateEvents} ref={this.ModalAjoutb} id_user={this.state.id_user} events={this.state.events} />
弹出
export default class Popup extends Component { constructor(props) { super(props); } handleAjouterb = id_user => { this.setState( { openPopupAjout: true, id_user }, () => { this.fetchingPopup( this.state.id_user, this.state.identifiant_user, this.state.nom_user ); } ); }; fetchingPopup = (id_user, identifiant_user, nom_user) => { const praticiensCached = JSON.parse( localStorage.getItem('Liste de praticiens ') ); for (let j = 0; j < praticiensCached.length; j++) { if (id_user === praticiensCached[j].id_user) { identifiant_user = praticiensCached[j].identifiant_user; this.setState({ nom_user: praticiensCached[j].nom_user }); } } handleValider = event => { event.preventDefault(); const praticiensCached = JSON.parse( localStorage.getItem('Liste de praticiens ') ); for (let j = 0; j < praticiensCached.length; j++) { if (this.state.id_user === praticiensCached[j].id_user) this.state.identifiant_user = praticiensCached[j].identifiant_user; } const formData = new FormData(); formData.append('identifiant_user', this.state.identifiant_user); formData.append('heuredebut', this.state.tranchesC[0].startC); formData.append('heurefin', this.state.tranchesC[0].endC); formData.append('libelleconge', this.state.libelle); axios({ method: 'post', url: process.env.REACT_APP_API_BACKEND + 'add_event_docteur', data: formData, headers: { 'Content-Type': 'application/json', Accept: 'application/json' } }).then(() => { fetch( process.env.REACT_APP_API_BACKEND + 'get_liste_planning/start=' + moment() .startOf('isoweek') .subtract(14, 'days') .toJSON() + '&end=' + moment() .endOf('isoweek') .add(2, 'months') .toJSON() + '&identifiant_user=' + this.state.identifiant_user ) .then(Response => Response.json()) .then(data => { let evts = data.ListeResult; for (let i = 0; i < evts.length; i++) { evts[i].start = moment(evts[i].start).toDate(); evts[i].end = moment(evts[i].end).toDate(); } this.props.updateEvents(evts, () => { localStorage.setItem( 'Liste récente de planning de ' + this.state.nom_user, JSON.stringify(evts) ); localStorage.removeItem( 'Liste de planning de ' + this.state.nom_user ); localStorage.setItem( 'Liste de planning de ' + this.state.nom_user, JSON.stringify(evts) ); }); }); }); }; }; render() { return ( <div> <Dialog icon="application" onClose={this.handleClose} title="Organisation des plannings du docteur" {...this.state} isOpen={this.state.openPopupAjout} > <Input id="libelle" style={{ width: '480px' }} value={this.state.libelle} onChange={this.handleInputChange('libelle')} /> <label className="pt-label .modifier"> <strong>Date</strong> </label> <LocaleProvider locale={fr_FR}> <RangePicker id="date" name="date" locale="fr" placeholder={['Date de début', 'Date de fin']} separator="-" onChange={this.handleDateCChange} value={this.state.dateIC} format="DD/MM/YYYY" allowClear={false} /> </LocaleProvider> <label className="pt-label .modifier"> {' '} <strong>Heure de début</strong> </label> <Time value={el.startC} onChange={time => this.handleKeyboardStartCChange(i, time)} style={heure} disableUnderline={true} inputComponent={TextMaskCustom} endAdornment={ <InputAdornment position="end" style={{ opacity: '0.4' }}> {' '} <IconButton onClick={() => this.openDialogC(i, el.startC, 'startC')} > <i style={{ fontSize: '18px' }} className="zmdi zmdi-alarm" /> </IconButton>{' '} </InputAdornment> } /> <label className="pt-label .modifier"> {' '} <strong>Heure de fin</strong> </label> <Time value={el.endC} onChange={time => this.handleKeyboardEndCChange(i, time)} style={heure} disableUnderline={true} inputComponent={TextMaskCustom} endAdornment={ <InputAdornment position="end" style={{ opacity: '0.4' }}> {' '} <IconButton onClick={() => this.openDialogC(i, el.endC, 'endC')} > <i style={{ fontSize: '18px' }} className="zmdi zmdi-alarm" /> </IconButton> </InputAdornment> } /> <Clock maxWidth="xs" open={this.state.isOpenC} onBackdropClick={this.closeDialogC} > <TimePicker mode="24h" value={this.createDateFromTextValueC(this.state.datePickerValueC)} onChange={this.handleDialogCChange} /> <DialogActions> {' '} <ButtonOk onClick={this.closeDialogC} color="primary"> {' '} Ok{' '} </ButtonOk> </DialogActions> </Clock> <AnchorButton style={{ display: 'inline-block' }} intent={Intent.SUCCESS} onClick={this.handleValider} > Valider </AnchorButton> </div> ); } }