【发布时间】:2020-04-26 19:20:05
【问题描述】:
我对整个 react 世界是一个全新的人,但我正在尝试开发一个带有集成日历的 SPA。我使用 react-router 进行路由,使用 react-big-calendar 进行日历,使用 axios 进行 API 调用和 webpack。 每当我加载我的日历组件时,它都会被安装和卸载几次,我认为这会导致我的 API 调用实际上从未获得任何数据。我就是不知道是什么原因造成的。
代码:
useEffect(() => {
console.log("mounting Calendar")
let source = Axios.CancelToken.source()
if(!initialized) {
console.log("getting Data")
getCalendarEvents(source)
}
return () => {
console.log("unmounting Calendar")
source.cancel();
}
})
const getCalendarEvents = async source => {
setInitialized(true)
setLoading(true)
try {
const response = await getCalendar({cancelToken: source.token})
const evts = response.data.map(item => {
return {
...item,
}
})
calendarStore.setCalendarEvents(evts)
} catch (error) {
if(Axios.isCancel(error)){
console.log("caught cancel")
}else{
console.log(Object.keys(error), error.message)
}
}
setLoading(false)
}
这是我渲染组件时的结果: Console log
如果您需要更多代码来评估问题,我会发布。 我很感激任何可以解决我的问题的意见。
谢谢
【问题讨论】:
-
你的组件重新渲染的原因是因为你正在改变它的状态。来自
reactdocs - “默认行为是在每次状态更改时重新渲染。”相反,您应该做的是在useEffect挂钩中指定一个依赖数组,以便它只运行一次(即[])或useEffect挂钩应该依赖的一些prop或state。
标签: reactjs react-router axios react-big-calendar