让我们asume,我有三个组成部分:正确的方式来调用外部组件的方法React.js
- < ArticleFinder/>
- < ArticleViewer/>
- < RecentArticleList/>
ArticleFinder是一个从服务器获取文章列表的组件,一个nd显示它。如果用户单击列表项目,将显示< 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的显示内容和文件以及其他文件,此组件必须调用一些getData方法。
请注意,这3个组件可以同时存在,它们在屏幕上有自己的范围。它们可以被重叠,但它们仍然在同一时间,同一屏幕上。
所以当ArticleViewer挂载时,它会调用自己的getData方法并显示结果,但问题是如果ArticleViewer已经挂载,请单击RecentArticleList中的列表或ArticleFinder不会触发ArticleViewer的getData,因为组件未卸载并且安装。
我对此使用了React Router 4.x,因此我可以重定向url,但仍然没有办法在ArticleFinder和RecentArticleList中强制调用ArticleViewer.getData。
有些地方,我用某种方法做了。我只是检查,从阵营路由器(this.props.params)发生了变化,然后调用GetData方法类似这样的接收道具:
componentWillReceiveProps(nextProps, nextState) {
if(nextProps.location.pathname !== prevPath) {
prevPath = nextProps.location.pathname;
this.getArticles(category, search);
}
}
它的工作实际上,即使刷新页面,但我不”不喜欢它,它不直观,不雅,至少对我来说。
有没有办法更优雅地解决这个问题?特别是,有些类似React(如果存在)?
代码是相当混乱,添加更多的功能使更丑陋,我想解决这个问题。我知道在编程中没有答案,但是我认为可以存在可读的解决方案。
任何建议将非常感激。谢谢!
嗯..有趣。我从来没有这样想过。我会尝试。谢谢! – modernator