Пытаетесь сохранить массив FireStore в React Native?

# #javascript #firebase #react-native #google-cloud-firestore

Вопрос:

Я пытался переместить или сохранить массив 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» внутри документа, но я даже не могу получить доступ к документу, поэтому, даже если вы просто поможете мне сохранить данные всего документа, это было бы очень полезно.

Комментарии:

1. Откуда ты code взялся? Используя useParams() от react-router-dom ?

2. Привет, я получаю code от useParams() от react-native-navigation .

3. О да, это так react-native . Я неправильно понял, что это так reactjs . Извини за это. На самом деле я не видел бирку

4. Не существует такой вещи, как docs.data. Есть документы[0..100].данные. Вам нужно сопоставить документы или просто добавить документы.

Ответ №1:

Если вы используете react, я бы предложил использовать крючок. Вам также на самом деле не нужно помещать объекты в такой массив.

Вот пример того, как получить некоторые данные и сохранить сбор данных.

 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 возвращает снимок коллекции. Этот снимок содержит список документов или массив, если хотите.

Затем мы хотим сопоставить эти документы, создав новый объект, содержащий только данные документа и идентификатор отдельного документа. Вот что такое myPosts переменная.

Используя крючок состояния реакции, вы можете установить для этого объекта текущее состояние сообщений, в вашем случае это будут комнаты.

Когда вы добавляете что-то в базу данных, Firestore вернет ссылку на вновь добавленный элемент. Затем вы можете позвонить get (), чтобы получить документ обратно, если он вам нужен.

Комментарии:

1. да, но вы хотите убедиться, что у вас есть только один документ, иначе doc.data() будет не определен.

Ответ №2:

Попробуйте изменить на (см. Комментарий перед этим)

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

Комментарии:

1. Привет, Джон, спасибо за ваш ответ, но, к сожалению, я столкнулся с той же проблемой, что и во втором примере, который я привел, она бесконечно считывается в мою базу данных и бесконечно регистрируется, что довольно утомительно. Тем не менее, я ценю ваш ответ.

2. Привет, извини , я только что это увидел const code = navigation.getParam("code"); , я понял это из useParams react-native-navigation