在React.js

时间:2017-01-27 08:19:32

标签: javascript reactjs react-router

让我们假设我有三个组成部分:

  • < ArticleFinder />
  • < ArticleViewer />
  • < RecentArticleList />

ArticleFinder是一个从服务器获取文章列表的组件,并显示它。如果用户单击列表项,将显示< ArticleViewer />。

ArticleViewer是一个从服务器获取单篇文章并显示它的组件。

RecentArticleList是一个从服务器获取最近10篇文章的组件,并显示它。与ArticleFinder一样,在用户点击后,列表项将显示< ArticleViewer />,如果< ArticleViewer />已安装,< ArticleViewer />只需重新加载文章。

ArticleFinder和RecentArticleList组件正在接收这样的简短文章数据:

[{ _id: 1, title: 'Helloworld', date: '...' }, { _id: 2, title: 'Farewell!', date: '...' }]

ArticleViewer将收到更多这样的具体数据:

{ _id: 1, title: 'Helloworld', date: '...', content: '<p>Helloworld!</p>', files: [ ... ], tags: [ ... ] }

这只是为了减少传输的大小,服务器将尽可能地响应最小数据。因此,对于来自ArticleViewer的显示内容和文件以及其他文件,此组件必须调用someData的getData方法。

请注意,这三个组件可以同时存在,它们在屏幕上有自己的范围。它们可以被包裹,但它们仍然在同一时间,相同的屏幕。

因此,当挂载ArticleViewer时,它会调用自己的getData方法并显示结果,但问题是如果已经挂载了ArticleViewer,则单击RecentArticleList中的列表或ArticleFinder将不会触发ArticleViewer的getData,因为组件未卸载并已挂载

我正在使用React Router 4.x,所以我可以重定向url,但仍无法在ArticleFinder和RecentArticleList中强制调用ArticleViewer.getData。

无论如何,我是用某种技巧做到的。我刚刚检查了从React Router(this.props.params)收到的道具已经改变,然后像这样调用getData方法:

componentWillReceiveProps(nextProps, nextState) {
    if(nextProps.location.pathname !== prevPath) {
        prevPath = nextProps.location.pathname;
        this.getArticles(category, search);
    }
}

实际上它正在工作,即使刷新页面,但我不喜欢它,它不直观,不优雅,至少对我而言。

有没有办法更优雅地解决这个问题?特别是某些React喜欢(如果它存在的话)?

代码非常混乱,添加更多功能使得更难看,我想解决这个问题。我知道编程中没有答案,但我认为可能存在可读解决方案。

任何建议都会非常感激。谢谢!

3 个答案:

答案 0 :(得分:4)

这些组件似乎在它们之间共享状态和功能。您可以将此状态移至包含这三个组件的组件,然后将文章传递给您的<ArticleViewer>

答案 1 :(得分:2)

您可以使用key道具创建一个全新的组件实例,就像您第一次使用该组件一样。

<ArticleViewer {...yuorProps} key={id_of_article}/>

确保每篇文章的ID都是唯一的。

请记住,您不会使用现有组件,最终会创建新组件。

答案 2 :(得分:1)

React Router v4方式是为Article View路径使用自定义渲染功能 -

<Match pattern="/:articleid" 
    render={({params}) => <ArticleViewer article={params.articleid} />}/>

这将在路线更改时呈现新的ArticleViewer组件。