【问题标题】:Trying to store FireStore array in React Native?试图在 React Native 中存储 FireStore 数组?
【发布时间】:2021-05-06 17:08:22
【问题描述】:

我一直在尝试将 FireStore 数组推送或存储到我自己的数组之一中。我尝试了几个版本的代码,第一个是这样的:

var data = [];
  db.collection('Rooms')
    .doc(code)
    .get()
    .then((docs) => data.push(docs.data()));

但是,当我记录数据变量时,它显示为一个空数组。我试过的第二种方法是这样的:

 var [data, setData] = useState([]);
  db.collection("Rooms")
    .doc(code)
    .get()
    .then((docs) => setData(docs.data()));

然而,这个方法似乎无限地设置数据,所以它无限地读入我的 API,我想避免这种情况。我尝试的最后一种方法是:

  var data = db.collection("Rooms").doc(code).get();
  console.log(data);

但这只是返回

Promise {
  "_U": 0,
  "_V": 0,
  "_W": null,
  "_X": null,
}

谁能帮我解决这个问题,理想情况下,我想在文档中存储一个名为“MovieArray”的数组的数据,但我什至无法访问该文档,所以即使你可以帮我存储整个文档的数据,这将非常有帮助。

【问题讨论】:

  • 你从哪里得到code?使用来自react-router-domuseParams()
  • 嗨,我从useParams() 收到codereact-native-navigation 收到。
  • 哦,是的,它是react-native。我误解它是reactjs。对此感到抱歉。我实际上没有看到标签
  • 没有像 docs.data 这样的东西。有 Docs[0..100].data。您需要映射文档或仅添加文档。

标签: javascript firebase react-native google-cloud-firestore


【解决方案1】:

如果你使用 react,我建议你使用 hook。你也不需要像那样将对象推送到数组中。

这是一个如何获取一些数据并存储数据集合的示例。

const Forum = () => {
  const [posts, setPosts] = useState(null);

  const collectIdsAndDocs = (doc) => {
    return { id: doc.id, ...doc.data() };
  };

  useEffect(() => {
    const getPost = async () => {
      const snapshot = await firestore.collection('Posts').get();
      const myPosts = snapshot.docs.map(collectIdsAndDocs);
      console.log(myPosts);
      setPosts({ myPosts });
    };

    const createPost = async (post) => {
      const docRef = await firestore.collection('Posts').add(post);
      const doc = await docRef.get();
      console.log(doc);
    };

    createPost({ Title: 'My First Post', Content: 'My content' });
    getPost();
  }, []);

  return (
    // return some JSX 
  );
};

为什么会这样?

当您获得一个集合时,Firebase 会返回该集合的快照。 如果您愿意,此快照有一个文档列表或一个数组。

然后我们想要映射那些构建一个新对象的文档,该对象仅包含文档数据和单个文档的 ID。这就是myPosts 变量。

使用反应状态挂钩,您可以将该对象设置为帖子的当前状态,在您的情况下,这将是房间。

当您向数据库添加内容时,Firestore 将返回对新添加项目的引用。然后,如果需要,您可以调用 get() 来取回文档。

【讨论】:

  • 是的,但你要确保你只有一个文档,否则 doc.data() 将是未定义的。
【解决方案2】:

尝试更改为(见之前的评论)

const [data, setData] = useState({});

【讨论】:

  • 嗨约翰,谢谢你的回答,但不幸的是我遇到了和我在第二个例子中一样的问题,它无限地读入我的数据库,并无限地记录它,这很麻烦。不过,我很感激你的回答。
  • 嗨,对不起,我刚刚看到它const code = navigation.getParam("code");,我从useParams 收到它来自react-native-navigation
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多