Как настроить прослушиватель для документа пожарного депо? - PullRequest
1 голос
/ 04 мая 2020

Я разговариваю с Ioni c и реагирую, используя firestore в качестве базы данных. Я храню все сообщения в массиве [] в документе в firestore. И просто хотите, чтобы оба пользователя снова получили данные, если добавлено сообщение. Поэтому я хочу добавить слушателя в мой документ. Мой чат работает, но вы должны перезагрузить страницу, чтобы увидеть новые сообщения ... Это мой код:

const [chats, setChats] = useState([]);

    db.collection("chats").doc(chatId).onSnapshot((doc) => {

                setChats(doc.data().messages)

            });

Я либо получаю бесконечные циклы, либо делаю c .data () не определен , Есть ли хороший способ получить данные с помощью этой функции? Или вам нужны, например, облачные функции firebase?

Ответы [ 2 ]

1 голос
/ 10 мая 2020

Я решил свою проблему следующим образом:

const [chats, setChats] = useState([]);


useEffect(() => {

        db.collection("chats").doc(chatId).onSnapshot(snapshot => {
            updateMessages(snapshot.data())
        })

    }, []);


    function updateMessages(data : any) {

        setChats(data.messages);
    }

Когда я поместил слушателя в хук useEffect(), я решил проблему с бесконечными циклами, так как новый слушатель запускался каждый раз, когда состояние обновлялось внутри слушатель. Теперь слушатель инициализируется только один раз, когда компонент монтируется.

И, отправив snapshot.data() в функцию и ПОТОМ выбрав data.messages, я решил проблему с snapshot.data().messages неопределенным.

1 голос
/ 04 мая 2020

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

Цитирование этой документации для обновлений в реальном времени .

Первоначальный вызов с использованием предоставленного вами обратного вызова немедленно создает моментальный снимок документа с текущим содержимым одного документа. Затем при каждом изменении содержимого другой вызов обновляет моментальный снимок документа.

Таким образом, каждый раз при отправке нового сообщения будет запускаться onSnapshot. Вы можете сослаться на snapshot вместо doc в обратном вызове, который вы предоставляете, а затем вы можете использовать snapshot.docChanges(), чтобы увидеть, что изменилось. Вот пример:

db.collection("chats").doc(chatId)
    .onSnapshot(function(snapshot) {
        if(snapshot.docChanges().length > 0){
            //do something
        }
    });

ПРИМЕЧАНИЕ : Если это первый снимок, все данные будут в списке как добавленные изменения, и вы можете получать данные, принимая каждое изменение индивидуально и со ссылкой на свои данные: change.doc().data(). Кроме того, поскольку вы запрашиваете chatId, массив всегда должен иметь размер 1.

...