【问题标题】:How to re-render a React Component Upon re-direct如何在重定向时重新渲染 React 组件
【发布时间】:2019-06-19 20:21:40
【问题描述】:

我正在创建 SoundCloud 的克隆,当我从歌曲页面删除一首歌曲时,我想重定向到歌曲索引组件(/discover 页面)。

我能够在删除后成功重定向到那里,但索引页面显示为空,直到我刷新,然后获取歌曲。当 history.location 不同时,我尝试在索引页面上使用 ComponentDidUpdate 再次 fetchSongs,但没有成功。

//Song Delete Component
handleDelete() {
    this.props.removeSong(this.props.songId)
    this.props.history.push("/discover");
}

//Song Index Component
componentDidUpdate(prevProps) { 
    if (this.props.history.location.pathname !== 
        prevProps.location.pathname) {
        this.props.fetchSongs(); 
    }
}

【问题讨论】:

    标签: javascript ruby-on-rails reactjs


    【解决方案1】:

    当您重定向到新组件/路由时,该组件会重新安装到屏幕上。你应该改用componentDidMount()

    发现组件:

    componentDidMount() { 
         this.props.fetchSongs(); 
    }
    

    编辑---

    刚刚了解到您的第二页实际上是一个模态页面,并且您执行了 action-creator 并在那里重定向。在这种情况下,Discover 组件可能实际上并没有从屏幕上卸载,因此componentDidMount() 没有执行。但是componentDidUpdate() 应该还是可以的,让我们稍微重构一下

    所以在 Discover Component 中,尝试类似:

    componentDidUpdate(prevProps){
        if(this.props.songsOrNameOfReducerKey !== prevProps.songsOrNameOfReducerKey){
            this.props.fetchSongs()
        }
    }
    

    this.props.songsOrNameOfReducerKey 只是指包含更新的歌曲列表的 redux-state - 可作为组件中的道具使用。我们将更新后的列表与之前的列表进行比较,如果有差异,我们会执行您的操作创建者。 确保您通过mapStateToProps()redux 连接到您的组件以获取此状态值。将 songsOrNameOfReducerKey 替换为您定义的密钥。

    当您从列表中删除歌曲时,它应该为 Discover 组件提供新的道具,从而触发 componentDidUpdate()

    【讨论】:

    • 感谢您的回复。我实际上已经有了那个代码,但它仍然没有获取或显示歌曲。
    • 你能测试一下组件在重定向时是否被重新安装?也许在 componentDidMount() 中尝试 console.log("test") 您的调度程序功能如何? @Ajay
    • 我在我的 componentDidMount() 函数中添加了一个调试器,并注意到当前的删除实现(推送“/discover”)没有命中该 componentDidMount(也没有命中 componentDidUpdate)。只有在刷新时调试器才会激活。
    • 我正在关注 SoundClouds 结构,您可以在其中从弹出模式的特定歌曲页面中删除歌曲。然后你删除这首歌,它应该带你回到有一堆歌曲的发现页面(基本上是索引页面)
    • 我实际上只是想出了一个解决方法。我在 this.props.history.location.push('/discover') 之后扔了一个 location.reload() 并且能够重新加载页面。似乎是一个小草图,设计不完美,但它完成了工作。
    猜你喜欢
    • 2020-11-14
    • 2019-11-20
    • 2020-09-29
    • 2016-08-09
    • 2021-06-19
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多