Firestore Paginate запрос - PullRequest
       33

Firestore Paginate запрос

0 голосов
/ 04 июля 2019

Я посмотрел на этот пример https://cloud.google.com/firestore/docs/query-data/query-cursors => Paginate a query, чтобы разбить мои данные на пожарные.

Загрузка данных работает нормально, и я получаю свои .limit(3) сообщения, если ядостигла нижней части страницы.

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

Надеюсь, кто-нибудь может мне помочь, спасибо!

Код: vuejs

mounted() {
   this.loadMoreData();
},
methods: {
 loadMoreData(posts) {
    window.onscroll = async () => {
      let bottomOfWindow =
          document.documentElement.scrollTop + window.innerHeight ===
          document.documentElement.offsetHeight;

       var vm = this;

       const db = firebase.firestore()

       function getMorePosts() {
          let first = db
            .collection("users")
            .doc(vm.userProfile.general.userId)
            .collection("posts")
            .orderBy("createdOn", "desc")
            .limit(3);

          return first.get().then(async documentSnapshots => {
            // Get the last visible document
            console.log(documentSnapshots);
            var lastVisible =
              documentSnapshots.docs[documentSnapshots.docs.length - 1];
            console.log("last", lastVisible);

            // Construct a new query starting at this document,
            // get the next 3 posts.
            const next = db
              .collection("users")
              .doc(vm.userProfile.general.userId)
              .collection("posts")
              .orderBy("createdOn", "desc")
              .startAfter(lastVisible)
              .limit(3)
              .onSnapshot(snapshot => {
                const allPosts = [];
                snapshot.forEach(doc => {
                  allPosts.push(doc.data());
                });
                // set data to vuex
                vm.$store.commit("posts/setProducts", allPosts);
              });
          });
        }

     if (bottomOfWindow) {
       getMorePosts();
       console.log("bottom");
     }
}

1 Ответ

2 голосов
/ 04 июля 2019

Из кода, которым вы поделились, функция getMorePosts() получает первые три сообщения и находит последнее сообщение. Затем он запрашивает следующие 3 сообщения, используя в качестве курсора документ last visible в первом запросе.

Проблема в том, что функция всегда выполняет одно и то же действие для извлечения первых 3 постов и получения следующих 3 постов каждый раз, когда вы прокручиваете страницу вниз.

Одним из способов решения этой проблемы является передача последней видимой функции в качестве параметра. Таким образом, изначально документ last visible может быть пустым, а затем запрос к сообщениям и документ last visible запроса могут быть переданы в качестве параметра для загрузки большего количества сообщений и т. Д.

Надеюсь, это поможет.

...