I'm working at a React Web App with Fullcalendar
. I think one does not need to know Fullcalendar in order to answer this question. It's rather a matter of React understanding.
Long story short, Fullcalendar
has an api that refetches any events
from a given source
.
In my case, my source
is state.events
, iniated with useState
. I only want to refetch
, when my state
changes. All good so far. However, at the first initial render, Fullcalendar
is not able to fetch anything.
const OverviewPage: React.FunctionComponent<IOverviewPageProps> = (props) => {
const calendarRef = useRef<any>();
const [sourceAPI, setSourceAPI] = useState<any>(undefined);
const [state, setState] = useState<State>({
externalEvents: [],
events: []
});
useEffect(() => {
if (calendarRef.current !== undefined) {
let calendarApi = calendarRef.current.getApi();
if (sourceAPI === undefined) {
const source = calendarApi.addEventSource(state.events);
source.refetch()
setSourceAPI(source);
} else {
sourceAPI.refetch();
}
}
}, [state])
return (<div>
<FullCalendar
ref={calendarRef}
//other props
/>
</div>)
;
Now, as you can see, as long as I don't have the reference
of the calendar
, I can't iniate the calendarApi
. And as long as I don't have that api, I can't refetch
.
I do have to mention, when I take away the useEffect
dependency (state
), I no longer face an issue with fetching the events (even on the initial render). However, that causes other issues in my code that I wasn't able to fix, so I rather prefer to fix it with useEffect
.
Update
It was requested to explain more in depth, what is happening in the code.
Fullcalendar
needs a source
of events
(calendar tasks). To provide this source
, one has to iniate it before render, which I'm doing here in useEffect
Checking, if the reference
to the element Fullcalendar
already exists to prevent a render error
if (calendarRef.current !== undefined) {//...}
Checking, if a source
was already added. If no, iniate a source
by using Fullcalendar's
api. .addEventSource
adds a source that contains an array
of objects
(events
) - in this case state.events
- and returns a Fullcalendar Source
so that I can interact with it later (e.g. refetch
).
.refetch()
simply takes the content of the source
and (re-)renders them on the calendar (so in other words the content of state.events
).
I then store this Fullcalendar Source
in a React State
so that I can interact with the same source later again, without having to reiniate it again.
if (sourceAPI === undefined) {
const source = calendarApi.addEventSource(state.events);
source.refetch()
setSourceAPI(source);
}
If a Fullcalendar Source
is already existing, apply the refetch
call again.
else {
sourceAPI.refetch();
}
There's really not more to say about Fullcalendar
. I was suspecting the issue in React State management
and that I'm doing something wrong there (with useEffect
).