Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过字符串字段查询Firestore以获取文档(搜索引擎友好型Slug)_Javascript_Reactjs_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 如何通过字符串字段查询Firestore以获取文档(搜索引擎友好型Slug)

Javascript 如何通过字符串字段查询Firestore以获取文档(搜索引擎友好型Slug),javascript,reactjs,firebase,google-cloud-firestore,Javascript,Reactjs,Firebase,Google Cloud Firestore,我在React中有一个名为ShowArticle的组件,我试图通过一个名为slug的字符串字段在articles集合中的Firestore中查询单个文档,这样我就可以将我的URL格式化为//myhost.com/article/show/:slug,其中slug是Firestore中匹配的唯一字符串 我的路线是: 因此,我使用const{slug}=props.match.params正确地获取:slug参数组件内部ShowArticle组件 当我在Firestore中查询数据库中存在的slu

我在React中有一个名为
ShowArticle
的组件,我试图通过一个名为slug的字符串字段在
articles
集合中的
Firestore
中查询单个文档,这样我就可以将我的URL格式化为
//myhost.com/article/show/:slug
,其中slug是Firestore中匹配的唯一字符串

我的路线是:

因此,我使用
const{slug}=props.match.params正确地获取
:slug
参数组件内部
ShowArticle
组件

当我在Firestore中查询数据库中存在的slug时,我没有收到Firestore返回的数据

如何通过SEF URL的唯一字符串值检索文章文档

我的ShowArticle组件如下所示:

import React,{Component}来自'React';
从'react redux'导入{connect};
从'redux'导入{compose};
从“react-redux firebase”导入{firestoreConnect};
从“属性类型”导入{PropTypes};
从“/物品”导入物品;
类ShowArticle扩展组件{
render(){
const{article}=this.props;
国际单项体育联合会(第条){
返回(
);
}否则{
返回(
加载。。。
)
}
}
}
ShowArticle.propTypes={
firestore:PropTypes.object.isRequired
};
导出默认组合(
firestoreConnect(道具=>{
const{slug}=props.match.params;
控制台日志(slug);
返回[
{collection:'articles',storeAs:'article',doc:slug}
]
}),
连接({firestore:{ordered},props)=>({
文章:ordered.article&&ordered.article[0]
}))

)(展品)在调用
firestoreConnect()
doc:slug
更改为
queryParams:['equalTo='+slug]

因此,您将以以下方式结束:

export default compose(
  firestoreConnect(props => {
    const { slug } = props.match.params;
    console.log(slug);
    return [
      {collection: 'articles', storeAs: 'article', queryParams: [ 'equalTo=' + slug ] }
    ]
  }),
  connect(({ firestore: { ordered } }, props) => ({
    article: ordered.article && ordered.article[0]
  }))
)(ShowArticle);

react redux firebase
包文档中的参考。

在调用
firestoreConnect()
doc:slug更改为
queryParams:['equalTo='+slug]

因此,您将以以下方式结束:

export default compose(
  firestoreConnect(props => {
    const { slug } = props.match.params;
    console.log(slug);
    return [
      {collection: 'articles', storeAs: 'article', queryParams: [ 'equalTo=' + slug ] }
    ]
  }),
  connect(({ firestore: { ordered } }, props) => ({
    article: ordered.article && ordered.article[0]
  }))
)(ShowArticle);

文档中有关react-redux firebase软件包的参考。

您很可能正在使用最新版本的react路由器(v4+)。因为在旧的React路由器中,它是通过道具提供id的方法。但在较新的react路由器库中,您必须使用“withRouter”高阶组件包装整个组件。无论何时渲染,它都会将更新的匹配、位置和历史道具传递给包装组件

首先,您必须导入withRouter

import { withRouter } from "react-router";
 export default withRouter(compose(
  firestoreConnect(props => {
    const { slug } = props.match.params;
    console.log(slug);
    return [
      {collection: 'articles', storeAs: 'article', doc: slug }
    ]
  }),
  connect(({ firestore: { ordered } }, props) => ({
    article: ordered.article && ordered.article[0]
  }))
)(ShowArticle))
然后你必须用路由器把它包起来

import { withRouter } from "react-router";
 export default withRouter(compose(
  firestoreConnect(props => {
    const { slug } = props.match.params;
    console.log(slug);
    return [
      {collection: 'articles', storeAs: 'article', doc: slug }
    ]
  }),
  connect(({ firestore: { ordered } }, props) => ({
    article: ordered.article && ordered.article[0]
  }))
)(ShowArticle))

这对我来说就像一个符咒

您很可能正在使用最新版本的React Router(v4+)。因为在旧的React路由器中,它是通过道具提供id的方法。但在较新的react路由器库中,您必须使用“withRouter”高阶组件包装整个组件。无论何时渲染,它都会将更新的匹配、位置和历史道具传递给包装组件

首先,您必须导入withRouter

import { withRouter } from "react-router";
 export default withRouter(compose(
  firestoreConnect(props => {
    const { slug } = props.match.params;
    console.log(slug);
    return [
      {collection: 'articles', storeAs: 'article', doc: slug }
    ]
  }),
  connect(({ firestore: { ordered } }, props) => ({
    article: ordered.article && ordered.article[0]
  }))
)(ShowArticle))
然后你必须用路由器把它包起来

import { withRouter } from "react-router";
 export default withRouter(compose(
  firestoreConnect(props => {
    const { slug } = props.match.params;
    console.log(slug);
    return [
      {collection: 'articles', storeAs: 'article', doc: slug }
    ]
  }),
  connect(({ firestore: { ordered } }, props) => ({
    article: ordered.article && ordered.article[0]
  }))
)(ShowArticle))

这对我来说就像一个符咒

谢谢你对这个问题的最新回答。Firestore已经没有太多的功能了,但看起来应该可以正常工作。谢谢您对这个问题的最新回答。对Firestore来说已经没有多大作用了,但看起来这应该可以很好地工作。