javascript - 在 React.js 中调用外部组件方法的正确方法

标签 javascript reactjs react-router

假设我有三个组件:

  • <文章查找器/>

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

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

RecentArticleList 是一个从服务器获取最近 10 篇文章并显示的组件。与 ArticleFinder 类似,用户单击列表项时将显示 ,如果 已安装,则 只需重新加载文章即可。

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。

不知何故,我用了某种技巧做到了。我刚刚检查了从 React Router(this.props.params) 接收到的 props 已更改,然后调用 getData 方法,如下所示:

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

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

有没有办法更优雅地解决这个问题?特别是某种类似 React 的东西(如果存在的话)?

代码非常困惑,添加更多功能会变得更加难看,我想解决这个问题。我知道编程中没有答案,但正如我认为的,可以存在可读解决方案。

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

最佳答案

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

关于javascript - 在 React.js 中调用外部组件方法的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41889519/

相关文章:

javascript - 如何禁止使用开发人员工具更改变量

javascript - RxJS5 - 虚拟可观察量

javascript - 获取偏移量Top & IE

javascript - react : how to access base class from higher order components

javascript - 如何在 SPA 应用程序中处理 "intention to open link in new page"?

javascript - 如何比较两个对象并删除重复项

reactjs - docker build 中的本地 npm 依赖项 "does not a contain a package.json file",但使用 npm start 运行良好

javascript - React Router 中的中间 URL 参数

javascript - Onclick 不会在渲染点绑定(bind)变量的值

reactjs - NextJS URL 参数,如 React-Router