# #javascript #reactjs #firebase #react-native #google-cloud-firestore
Вопрос:
Допустим, у меня есть таблица базы данных Firebase firestore под названием «Статьи».
Я извлекаю список статей всякий раз, когда открываю приложение, и с помощью компонента FlatList, всякий раз, когда я достигаю конца, я извлекаю больше статей с помощью startAt() и EnDat ().
У меня также есть возможность ставить лайки или комментировать статьи, поэтому всякий раз, когда я это делаю, текущие статьи на экране обновляются (например, счетчик, счетчик комментариев обновляется).
Однако у меня также есть отдельный сервер, который добавляет дополнительные статьи в базу данных через 6 часов.
Если я подпишусь на изменения в базе данных статей, startAt() и EnDat() будут перепутаны, если будут добавлены новые данные, когда пользователь просматривает Плоский список (правильно?). Вместо этого я хочу уведомлять пользователя только о том, когда добавляются новые статьи, и отображать кнопку «Доступны новые публикации» вверху, когда они есть, и если пользователь нажмет на нее, он просто обновит список.
Тем не менее, я все еще хочу слушать изменения в лайках и комментариях к статье, не добавляя никаких новых статей в плоский список, когда бэкэнд добавляет их.
Как мне решить эту проблему?
Ответ №1:
Вы можете проверить тип события , т. е. был ли документ created
, modified
или deleted
как указано в документации. В случае добавления нового документа тип будет таким "created"
. Тогда просто не добавляйте их в свой плоский список. Любое обновление до количества лайков будет "modified"
событием, поэтому вы можете просто обновить его в списке. Вот пример, скопированный из документов:
db.collection("cities").where("state", "==", "CA")
.onSnapshot((snapshot) => {
snapshot.docChanges().forEach((change) => {
if (change.type === "added") {
console.log("New city: ", change.doc.data());
}
if (change.type === "modified") {
console.log("Modified city: ", change.doc.data());
}
if (change.type === "removed") {
console.log("Removed city: ", change.doc.data());
}
});
});
Важно: Первый снимок запроса содержит добавленные события для всех существующих документов, соответствующих запросу. Это связано с тем, что вы получаете набор изменений, которые приводят моментальный снимок запроса в соответствие с исходным состоянием запроса. Это позволяет, например, напрямую заполнять пользовательский интерфейс из изменений, полученных в первом моментальном снимке запроса, без необходимости добавлять специальную логику для обработки начального состояния.
Таким образом, когда пользователь впервые открывает ваше приложение и одновременно добавляются новые документы, они могут оказаться в списке. Если вы все еще хотите строго соблюдать время добавления этих документов, вы можете попробовать добавить условие, в котором говорится, что документы, возвращаемые в запросе, должны быть созданы до определенной отметки времени.
.where("addedAt", "<=", <the-timestamp>)