如何防止 Bootstrap-Vue 分页自动重置

Posted

技术标签:

【中文标题】如何防止 Bootstrap-Vue 分页自动重置【英文标题】:How to prevent Bootstrap-Vue pagination from automatically resetting 【发布时间】:2020-08-19 07:22:41 【问题描述】:

我有多个视图,我想保存每个视图的状态,这样用户就不必再做同样的事情了。

在其中一个上,我有一个表,我使用 bootstrap-pagination 组件进行分页,因此当用户更改页面时,我将请求发送到服务器以获取新数据。我在 Vuex 中存储排序和过滤参数,效果很好。

但是当我想像这样保存当前页面时,每次我更改视图并返回时,bootstrap-pagination 都会将其更改为 1。 是否可以防止这种行为?

以下是 html 代码:

<b-pagination v-if="currentPage!=-1"
            v-model="currentPage"
            :total-rows="totalRows"
            :per-page="perPage"
            aria-controls="my-table"
            pils
            align="center"
            class="ml-auto mr-auto"
          ></b-pagination>

javascript中的代码:

  data: function () 
      return 
        ...
        currentPage: this.$store.state.currentPage,
        ...
      
    ,

    ...

    watch: 
        currentPage: function()
                this.$store.commit('updateCurrentPage', this.currentPage);
                this.getData();
              ,
    

【问题讨论】:

【参考方案1】:

您面临的问题很可能与数据加载和设置的顺序有关。

当您的组件被初始化时,您立即设置currentPage 页面属性,而(我猜)在从数据库中获取数据之后的某个时间后设置totalRows 属性。

这会导致问题,因为分页会认为有 0 行。因此,当您将其设置为第 5 页时。它会检查 perPagetotalRows 属性,并且由于(还没有)第 5 页,它会自动将 currentPage 设置回第 1 页。

相反,我建议您在检索数据并设置totalRows 属性后将currentPage 设置为商店中的值。这应该可以解决您遇到的问题。

【讨论】:

真不幸。使用您的解决方案,我首先设置了totalRows,然后执行了this.$nextTick(() =&gt;,并在回调中设置了我的currentPage。它现在有效。这似乎是一个错误,或者至少是一种气味。【参考方案2】:

另一种解决方法是在分页元素上放置一个v-if,以检查totalRows 是否已设置。这会导致在知道 totalRows 值之后呈现分页元素。当您使用 AJAX 加载数据并且事先不知道行数时,它很有用。

例如

<b-pagination
  v-if="totalRows > 0"
  v-model="currPage"
  :total-rows="totalRows"
  :per-page="perPage"
  aria-controls="my-table"
  size="sm"
  limit="7"
  first-number
  last-number
  >
</b-pagination>

【讨论】:

以上是关于如何防止 Bootstrap-Vue 分页自动重置的主要内容,如果未能解决你的问题,请参考以下文章

使用 bootstrap-vue:如何将类添加到 b 分页组件中的页面按钮

Drupal 6如何防止特定用户的自动密码恢复和重置

使用 Laravel 分页和 Bootstrap-vue 分页

我无法实现分页。使用 url 参数帮助实现分页(VUETIFY 或 BOOTSTRAP-VUE)

在 bootstrap-vue 中自定义 b 分页

带有 bootstrap-vue 的 Vue:在列表中始终防止多个扩展列表元素(v-for)