在Redux的'compose'上使用React.js道具

时间:2019-02-04 12:16:39

标签: reactjs firebase redux google-cloud-firestore

我正在使用react-redux-firebase和firestoreConnect从我的数据库中获取信息,并将其映射到其预制减速器中的props中。要将其信息连接到我的组件,我可以通过以下方式使用“ compose”方法:

export default compose(
   connect(mapStateToProps, mapDispatchToProps),
   firestoreConnect([
      {
         collection: 'questions',
         doc: this.props.match.params.id,
         subcollection: 'messages',
      }
   ])
)(QuestionDetail);

如您所见,我正在尝试访问具有ID的特定文档,该ID作为其父级的属性传递给组件。但是,“ this”在“ compose”的上下文中未定义,因此我无法使用它来访问道具和我的参数。

我还有其他方法可以访问传递给组件的ID以便向Firestore请求吗?

2 个答案:

答案 0 :(得分:1)

它应该可以在react-router的旧版本中使用。

但是我假设您使用的是最新版本的React Router(v4 +)。因此,您必须使用“ withRouter”高阶组件包装整个组件。每当渲染时,它将更新的匹配,位置和历史道具传递给包装的组件。

首先,您必须导入withRouter。

import { withRouter } from "react-router";

然后,您必须将其与Router一起包装。

export default withRouter(compose(
   connect(mapStateToProps, mapDispatchToProps),
   firestoreConnect((props) => 
      [{
         collection: 'questions',
         doc: props.match.params.id,
         subcollections: [{ collection: 'messages' }],
      }]
      ))(QuestionDetail));

这对我有用。

答案 1 :(得分:0)

在深入搜索文档之后,我发现您可以将prop传递给firestoreConnect函数(还请注意,我以错误的方式查询了子集合)。该代码最终是:

export default compose(
   connect(mapStateToProps, mapDispatchToProps),
   firestoreConnect((props) => [
      {
         collection: 'questions',
         doc: props.match.params.id,
         subcollections: [{ collection: 'messages' }],
      }
   ])
)(QuestionDetail);