【问题标题】:Getting bootstrap vue pagination to play with REST api让引导 vue 分页与 REST api 一起玩
【发布时间】:2019-06-26 21:55:13
【问题描述】:

尝试让 Bootstrap Vue 使用 REST api 来返回一页的数据和记录总数(基于this):

<template>
  </div>
    <b-pagination 
      v-on:change="onPageChange" 
      :total-rows="totalRows" 
      :per-page="perPage" 
      v-model="currentPage"  />
    <b-table responsive striped hover show-empty
      stacked="md"
      :items="items"
      :fields="fields"
      :current-page="currentPage"
      :per-page="perPage"
      :filter="filter"
      :sort-by.sync="sortBy"
      :sort-desc.sync="sortDesc"
      :sort-direction="sortDirection"
      @filtered="onFiltered">
    </b-table>
  </div>
</template>
<script>
...
export default {
  name: 'TableList',
  data() {
    return {
      module: null,
      title: 'Table',
      items: [],
      fields: [],
      errors: [],
      currentPage: 1,
      perPage: 15,
      totalRows: 0,
      pageOptions: [ 5, 10, 15 ],
      sortBy: null,
      sortDesc: false,
      sortDirection: 'asc',
      filter: null,
    }
  },
  created() {
    ...
    this.fetch();
  },
  methods: {
    fetch() {
      var me = this;
      var requestParams = {
        page: this.currentPage,
        per_page: this.perPage
      };
      if(this.sortBy) {
        requestParams = Object.assign({ sort_by: this.sortBy }, requestParams);
      }
      Rest('GET', '/table/' + this.table, requestParams, this.$root.user.token)
      .then(response => {
        me.items = response.data[1]
        me.totalRows = response.data[0].total_entries
      })
      .catch(error => {
        this.errors.push('Error: ' + error.response.status + ': ' + error.response.statusText)
      })
      .finally(() => {
        //alert('turn off loader!');
      });
    }
  }
</script>

如果我获取整个表格,这个 Vue 就可以工作。但是,当我使用REST api一次返回一页时,页面数计算为1,并且转发和结束链接都处于非活动状态。因此,我无法触发例如请求第 2 页。

REST api 正确返回表中的总行数和请求的行数,但 Bootstrap Vue 似乎没有观察/响应对 this.totalRows 的更改。

我错过了什么?

【问题讨论】:

    标签: vue.js bootstrap-4 bootstrap-vue


    【解决方案1】:

    您需要在b-table 组件上将per-page 属性设置为0,以禁用本地分页并允许b-pagination 处理数据。这是一个例子:

    new Vue({
      el: '#app',
      data() {
        return {
          items: [],
          fields: [{
              key: 'postId',
              label: 'Post ID'
            },
            {
              key: 'id',
              label: 'ID'
            },
            {
              key: 'name',
              label: 'Name'
            },
            {
              key: 'email',
              label: 'Email'
            },
            {
              key: 'body',
              label: 'Body'
            }
          ],
          currentPage: 0,
          perPage: 10,
          totalItems: 0
        }
      },
      mounted() {
        this.fetchData().catch(error => {
          console.error(error)
        })
      },
      methods: {
        async fetchData() {
          this.items = await fetch(`https://jsonplaceholder.typicode.com/comments?_page=${this.currentPage}&_limit=${this.perPage}`)
            .then(res => {
              this.totalItems = parseInt(res.headers.get('x-total-count'), 10)
    
              return res.json()
            })
            .then(items => items)
        }
      },
      watch: {
        currentPage: {
          handler: function(value) {
            this.fetchData().catch(error => {
              console.error(error)
            })
          }
        }
      }
    })
    <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
    <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.22/vue.js"></script>
    <script src="//unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script>
    <script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
    
    <div id="app">
      <b-table show-empty :items="items" :fields="fields" :current-page="currentPage" :per-page="0"></b-table>
      <b-pagination size="md" :total-rows="totalItems" v-model="currentPage" :per-page="perPage"></b-pagination>
    </div>

    【讨论】:

    • 谢谢@DigitalDrifter;为了让它工作,我还必须删除 @filtered="onFiltered" - 我稍后会调查 :)
    • 我们可以从表中删除:per-page 吗?
    • currentPage 应该从 1 开始。
    【解决方案2】:

    您还可以在表格中禁用本地分页,以便您的项目提供商负责控制分页。

    【讨论】:

      【解决方案3】:

      在b-table 上,将per-page 属性设置为0 将使b-pagination 接管服务器端分页。

      【讨论】:

        猜你喜欢
        • 2019-11-10
        • 2013-09-24
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        • 1970-01-01
        相关资源
        最近更新 更多