【问题标题】:React Component gets unmounted and i don't know whyReact 组件被卸载,我不知道为什么
【发布时间】: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

如果您需要更多代码来评估问题,我会发布。 我很感激任何可以解决我的问题的意见。

谢谢

【问题讨论】:

  • 你的组件重新渲染的原因是因为你正在改变它的状态。来自react docs - “默认行为是在每次状态更改时重新渲染。”相反,您应该做的是在 useEffect 挂钩中指定一个依赖数组,以便它只运行一次(即[])或useEffect 挂钩应该依赖的一些propstate

标签: reactjs react-router axios react-big-calendar


【解决方案1】:

这是因为useEffect。如果您希望它在挂载时只运行一次,您需要传递一个空数组作为依赖项,如下所示:

 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();
    }
},[])

这意味着它只会运行一次。如果有一些状态或道具你想保持监视,你可以在数组中传递它。这意味着 useEffect 将监视其依赖数组中传递的任何内容的更改,并在检测到更改时重新运行。如果它是空的,它只会在挂载上运行。

【讨论】:

  • 感谢您的回答,我想我明白了。但是 useEffect 返回方法不应该只在组件真正卸载时触发吗?当您查看控制台日志时,您可以看到我的 axios 调用被取消。这是为什么呢?
  • @vsjonas 重新渲染意味着 unmouting 和 mouting。 useEffect 钩子需要在每次 state 的某些更改时运行才能正常工作,除非您告诉它只关注某些更改 - reactjs.org/docs/…
  • 。您需要更多地了解生命周期方法和钩子,我建议您阅读文档,这不是很困难,而且您已经接近了,您只是有点困惑。现在这解决了你的问题吗?如果它确实考虑接受答案:)
猜你喜欢
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多