Разбиение на страницы Quasar QList с компонентом QPagination и методом laravel paginate()

Я хочу разбить список на страницы, созданный с помощью компонента QList

С помощью метода laravel paginate() я получаю на стороне клиента следующие данные, необходимые для разбиения на страницы:

current_page:
data:[]
first_page_url:
from:
last_page:
last_page_url:
next_page_url:
path:
per_page:
prev_page_url:
to:
total:

Я начинаю работу с платформой Quasar и хочу простое решение для разбиения на страницы QList.

Судя по всему, для этой цели подойдет компонент QPagination.

Я был бы признателен за предложения о том, как реализовать рабочий QPagination или другое простое решение.

ОТРЕДАКТИРОВАНО

Некоторый код для демонстрации того, чего я пытаюсь достичь

<template>
  <q-page class="fit row wrap justify-center items-start content-start" style="overflow: hidden;">
        <div class="q-pa-md" style="width: 450px;"> 
            <q-list bordered separator v-for="(post, index) in posts" :key="index">              
              <q-item clickable v-ripple>
                  <q-item-section>
                        <q-item-label> {{ post.title }} | {{ index }}</q-item-label>
                        <q-item-label caption> {{ post.content }}</q-item-label>
                   </q-item-section>
              </q-item>

            </q-list>

            <div class="q-pa-lg flex flex-center">
                    <q-pagination
                          v-model="page"
                          :min="currentPage" 
                          :max="totalPages"
                          :input="true"
                          input-class="text-orange-10"
                    >
                    </q-pagination>
                </div>
          </div>
  </q-page>
</template>

<script>
export default {

   data() {
        return {
            posts : [{
                id: 1,
                title: "title one",
                content: "This is content one"
            },{
                id:2,
                title: "title two",
                content: "This is content two"
            },{
                id:3,
                title: "title three",
                content: "This is content three"
            }],

            page: 1,
            currentPage:0,
            nextPage: null,
            totalPages:5,
        }
   }
}
</script>

ОТРЕДАКТИРОВАНО » Чтобы лучше проиллюстрировать проблему, которую нужно решить:

<template>
  <q-page class="fit row wrap justify-center items-start content-start" style="overflow: hidden;">
        <div class="q-pa-md" style="width: 450px;"> 
            <q-list bordered separator v-for="(post, index) in posts" :key="index">              
              <q-item clickable v-ripple>
                  <q-item-section>
                        <q-item-label> {{ post.title }} | {{ index }}</q-item-label>
                        <q-item-label caption> {{ post.content }}</q-item-label>
                   </q-item-section>
              </q-item>

            </q-list>

            <div class="q-pa-lg flex flex-center">
                    <q-pagination
                          v-model="page"
                          :min="currentPage" 
                          :max="totalPages"
                          :input="true"
                          input-class="text-orange-10"
                    >
                    </q-pagination>
                </div>
          </div>


        <div class="flex justify-center" >
            <button v-if="prevPage" class="text-grey-darker text-sm" style="margin-right:10px;" @click="goPrevPage(prevPage)">
                Prev. Page | Pag. {{currentPage}} of {{totalPages}}
            </button>
             <button  v-if="nextPage"  class="text-grey-darker text-sm" @click="goNextPage(nextPage)">
                Next Page | Pag. {{currentPage}} of {{totalPages}}
            </button>
         </div>


  </q-page>
</template>

<script>
export default {

   data() {
        return {
            posts : {},

             page: 0,
             currentPage:0,
             totalPages:null,
             totalPosts:0,
             nextPage: null,
             prevPage: null
        }
   },

   mounted() {
    this.getData();
   },

   methods:{
     getData(){
        this.$axios.get(`/listposts')
            .then((response) => {
                if (response.data.success) {

                   this.posts= response.data.posts.data;

                   this.page = response.data.posts.currentPage;
                   this.currentPage = response.data.posts.currentPage;
                   this.totalPages = response.data.posts.last_page;
                   this.totalPosts = response.data.posts.total;
                   this.page = response.data.posts.current_page;
                   this.nextPage = response.data.posts.next_page_url;
                   this.prevPage = response.data.posts.prev_page_url;

              } else { }
            })
            .catch(error => { 
          });
        }
     },

     goNextPage(urlNextPage){
        this.$axios.get(urlNextPage)
            .then((response) => {
                if (response.data.success) {

                   this.posts= response.data.posts.data;

                   this.page = response.data.posts.currentPage;
                   this.currentPage = response.data.posts.currentPage;
                   this.totalPages = response.data.posts.last_page;
                   this.totalPosts = response.data.posts.total;
                   this.page = response.data.posts.current_page;
                   this.nextPage = response.data.posts.next_page_url;
                   this.prevPage = response.data.posts.prev_page_url;

              } else { }
            })
            .catch(error => { 
          });
     }

     goPrevPage(urlPrevPage){
      this.$axios.get(urlPrevPage)
            .then((response) => {
                if (response.data.success) {

                   this.posts= response.data.posts.data;

                   this.page = response.data.posts.currentPage;
                   this.currentPage = response.data.posts.currentPage;
                   this.totalPages = response.data.posts.last_page;
                   this.totalPosts = response.data.posts.total;
                   this.page = response.data.posts.current_page;
                   this.nextPage = response.data.posts.next_page_url;
                   this.prevPage = response.data.posts.prev_page_url;

              } else { }
            })
            .catch(error => { 
          });
     }

   }
}
</script>

ОТРЕДАКТИРОВАНО с рабочим решением

<template>
  <q-page class="fit row wrap justify-center items-start content-start" style="overflow: hidden;">
        <div class="q-pa-md" style="width: 450px;"> 
            <q-list bordered separator v-for="(post, index) in posts" :key="index">              
              <q-item clickable v-ripple>
                  <q-item-section>
                        <q-item-label> {{ post.title }} | {{ index }}</q-item-label>
                        <q-item-label caption> {{ post.content }}</q-item-label>
                   </q-item-section>
              </q-item>

            </q-list>

            <div class="q-pa-lg flex flex-center">
                    <q-pagination
                          v-model="page"
                          :min="currentPage" 
                          :max="lastPage"
                          input
                          input-class="text-orange-10"
                          @input="goAnotherPage"
                    >
                    </q-pagination>
                </div>
          </div>
  </q-page>
</template>

<script>
export default {

   data() {
        return {
            posts : {},

            page: 0,
            currentPage:0,
            lastPage:0        
        }
   },

   mounted() {
    this.getData();
   },

   methods:{
     getData(){
        this.$axios.get('/listposts')
            .then((response) => {
                if (response.data.success) {
                   this.posts= response.data.posts.data;
                   this.page = response.data.posts.currentPage;
                   this.currentPage = response.data.posts.currentPage;
                   this.lastPage = response.data.posts.last_page;
              } else { }
            })
            .catch(error => { 
          });
        }
     },

    goAnotherPage(page) { 
      this.paginationUrl="http://my_app/api/listposts?page="+this.page;
      this.$axios.get(this.paginationUrl)
        .then((response) => {
            if (response.data.success) {
              this.posts= response.data.posts.data;
            } else { }
        })
            .catch(error => { 
     });
   }
}
</script>

person josei    schedule 19.12.2019    source источник
comment
Если вы предоставите код, который вы пробовали, мы можем помочь исправить его. Но мы не можем просто предоставить полное решение. Присоединяйтесь к их разногласиям, они действительно помогают, я уверен, что кто-то там может помочь   -  person hurnhu    schedule 19.12.2019
comment
Спасибо хурнху. Честно говоря, я предпринял несколько попыток реализовать компонент QPagination, но глядя на шаблон, скрипт и API компонента, я так и не понял, как этот компонент работает. Было бы полезно, если бы в документации была дополнительная информация об этом.   -  person josei    schedule 19.12.2019


Ответы (1)


Просто используйте вычисляемое свойство для получения данных на основе разбиения на страницы.

    getData(){
        return  this.posts.slice((this.page-1)*this.totalPages,(this.page-1)*this.totalPages+this.totalPages)
    }

 <q-list bordered separator v-for="(post, index) in getData" :key="index">              
              <q-item clickable v-ripple>
                        <q-item-label> {{ post.title }} | {{ index }}</q-item-label>
                        <q-item-label caption> {{ post.content }}</q-item-label>
                   </q-item-section>
              </q-item>

            </q-list>

Рабочий код — https://codepen.io/Pratik__007/pen/PowpOeL

person Patel Pratik    schedule 20.12.2019
comment
Вы можете использовать это или использовать Qtable. - person Patel Pratik; 20.12.2019
comment
Спасибо, Patel отлично работает для моего первого примера и очень помог. еще раз спасибо. Я изучаю различные возможности разбиения на страницы Quasar. Qpagination усложняется для меня. Я думаю, что для реального случая с laravel paginate(), который выводит только несколько записей в каждом запросе, мне как-то приходится запускать методы со стрелками навигации компонента (я не мог понять из API, как это сделать). Я создал пример с двумя кнопками (PrevPage и NextPage), чтобы лучше проиллюстрировать, чего я хочу достичь. - person josei; 20.12.2019
comment
Извините, но я понятия не имею о разбиении на страницы laravel. - person Patel Pratik; 21.12.2019
comment
Спасибо Патель. Я отредактировал свой пост с решением, которое хорошо работает для меня. - person josei; 21.12.2019