---
# System prepended metadata

title: 'Vue.js ecshop 11.Pagination 分頁切換 '
tags: [ecshop 專案, "Vue.js\_"]

---

> 此篇文章要跟大家分享的是分頁的切換功能，主要會以 BS5 Pagination 元件來做說明，那我們就開始吧！

### 加入分頁切換
由於後續許多頁面都會需要用到分頁切換，所以將分頁切換製作成一個元件。
* 參考 API 文件，可以看到取得產品列表的 API 網址後方可以加上 `page` 來判斷要呈現哪一頁的資訊
  <img src="https://firebasestorage.googleapis.com/v0/b/emmablog-e5a1c.appspot.com/o/page.png?alt=media&token=53d1c56b-9ad0-4d86-b4cd-20e9a1229957">
  * 故我們可以修改 ***ProductsPage.vue*** 其中 `getProducts()` 的參數如下：
    ```javascript=
    // 為 page 帶入預設值
    getProducts (page = 1) {
      const api = `${process.env.VUE_APP_API}api/${process.env.VUE_APP_PATH}/admin/products/?page=${page}`
      ...
    }
    ```
* 接著在 `console` 就可以看到分頁相關資訊
  * `current_page` 當前頁面
  * `total_pages` 總頁數
  * `has_next` 是否有後一頁
  * `has_pre` 是否有前一頁
<img src="https://firebasestorage.googleapis.com/v0/b/emmablog-e5a1c.appspot.com/o/console_page.png?alt=media&token=688b9296-47dc-4d5f-9ea2-c87adb90209b">
  

* 回到 `src > components` 新增 ***PaginationCard.vue***
  * `active` 設定當前頁籤
  * `disabled` 停用按鈕
  ```html=
  <template>
  <div class="d-flex justify-content-center">
    <nav aria-label="Page navigation example">
      <ul class="pagination">
          <!-- 前一頁 -->
        <li class="page-item" :class="{ 'disabled': pages.has_pre === false}">
          <a class="page-link" href="#" aria-label="Previous" @click.prevent="updatePage(pages.current_page-1)">
            <span aria-hidden="true">&laquo;</span>
          </a>
        </li>
        <!-- 所有頁數 -->
        <li class="page-item" v-for="page in pages.total_pages" :key="page" :class="{ 'active': page === pages.current_page}">
          <a class="page-link" href="#" @click.prevent="updatePage(page)">{{ page }}</a></li>
        <!-- 下一頁 -->
        <li class="page-item" :class="{ 'disabled': pages.has_next === false}">
          <a class="page-link" href="#" aria-label="Next" @click.prevent="updatePage(pages.current_page+1)">
            <span aria-hidden="true">&raquo;</span>
          </a>
        </li>
      </ul>
    </nav>
  </div>
  </template>
  
  <script>
  export default {
    props: ['pages'],
    methods: {
      updatePage (page) {
        this.$emit('emit-pages', page)
      }
    }
  }
  </script>
  ```
  
* 接著到 ***ProductsPage.vue*** 插入 ***PaginationCard.vue*** 元件
  ```html=
  <PaginationCard :pages="pagination" 
                  @emit-pages="getProducts"></PaginationCard>
  ```
* 完成後即可在頁面下方看到頁碼並可切換：
<img src="https://firebasestorage.googleapis.com/v0/b/emmablog-e5a1c.appspot.com/o/pagination_demo.png?alt=media&token=f1965758-3a9f-440e-b930-8a58167138d3">