为什么firestoreConnect无法读取'props.match.params.id'-使用react.js和redux的'where'集合查询?

时间:2019-06-04 02:22:52

标签: javascript reactjs google-cloud-firestore

我正在尝试使用react,redux和firestore按类别ID过滤产品。我正在使用firestoreConnect通过Link to语句-props.match.params.id中的选定类别ID查询产品集合,并将该查询存储为FilteredProducts。

当console.log在render和firestoreConnect中但在where子句中时,此参数ID不为空-未定义或为null。因此,查询集合为空,因此不检索任何记录。

任何解决方案将不胜感激。

我可以在firestoreConnect内部输出props.match.params.id。另外,我尝试在firebase网站上为firetore集合建立索引,但没有成功。

这是我在产品listing.js中拥有的东西:

import React, { Component } from "react";
import { compose } from "redux";
import { connect } from "react-redux";
import { firestoreConnect } from "react-redux-firebase";

class Listing extends Component {
  render() {
    console.log(this.props.match.params.id); // able to log
    const { filteredProducts } = this.props;
    return (
      <div>
        {filteredProducts && filteredProducts.length > 0 ? (
        <ul>
           {filteredProducts.map(product => (
              <li>{product.name}</li>
            ))}
        </ul>
      ) : (
         <div>no products matching criteria </div>
       )}
      </div>
   );
 }
}

const mapStateToProps = ({ firestore: { ordered } }) => ({
  filteredProducts: ordered.filteredProducts
});

export default compose(
  connect(mapStateToProps),
  firestoreConnect(props => [
    {
      collection: "products",
      where: ["category", "==", props.match.params.id], 
      storeAs: "filteredProducts"
    }
  ])
)(Listing);`

这是package.json文件中的依赖项列表

"firebase": "^5.11.1",
"react": "^16.6.3",
"react-dom": "^16.6.3",
"react-redux": "^5.1.1",
"react-redux-firebase": "^2.2.6",
"react-reveal": "^1.2.2",
"react-router-dom": "^5.0.0",
"react-scripts": "2.1.1",
"redux": "^4.0.1",
"redux-firestore": "^0.6.4",
"redux-thunk": "^2.3.0"

我想要实现的是按类别ID过滤产品集合

我得到的是null或未定义的数组对象

1 个答案:

答案 0 :(得分:0)

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

首先,您必须导入withRouter。

import { withRouter } from "react-router";

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

export default withRouter(compose(
    connect(mapStateToProps),
    firestoreConnect(props => [
      {
        collection: "products",
        where: ["category", "==", props.match.params.id], 
        storeAs: "filteredProducts"
      }
    ])
  )(Listing));

希望这会有所帮助。