中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue3.0手動封裝分頁組件的方法是怎樣的

發布時間:2021-09-26 13:38:58 來源:億速云 閱讀:322 作者:柒染 欄目:開發技術

這篇文章將為大家詳細講解有關vue3.0手動封裝分頁組件的方法是怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

具體內容如下

1.父組件引入

src/views/goods/components/goods-comment.vue

<!-- page表示初始化分頁時,默認顯示第幾頁 -->
    <XtxPagination @change-page='changePage' :pagesize='reqParams.pageSize' :total='total' :page='1' />
    //調接口
 import {findCommentListByGoods } from '@/api/product.js'
 export default{
  setup(){
  // 篩選條件準備
    const reqParams = reactive({
      // 當前頁碼
      page: 1,
      // 每頁的條數
      pageSize: 10,
      // 是否有圖片
      hasPicture: null,
      // 篩選條件
      tag: null,
      // 排序的字段
      sortField: null
    })
    // 偵聽參數的變化
    watch(reqParams, () => {
   findCommentListByGoods(goods.value.id, reqParams).then(ret => {
        total.value = ret.result.counts
        list.value = ret.result.items
      })
    }, {
      immediate: true
    })
    // 控制頁碼的變化
    const changePage = (page) => {
      // 修改分頁參數,重新調用接口即可
      reqParams.page = page
    }
    
  }
 }

2.子組件

src/components/library/xtx-pagination.vue

<template>
  <div class="xtx-pagination">
    <a @click='changePage(false)' href="javascript:;" :class="{disabled: currentPage===1}">上一頁</a>
    <span v-if='currentPage > 3'>...</span>
    <a @click='changePage(item)' href="javascript:;" :class='{active: currentPage===item}' v-for='item in list' :key='item'>{{item}}</a>
    <span v-if='currentPage < pages - 2'>...</span>
    <a @click='changePage(true)' href="javascript:;" :class='{disabled: currentPage===pages}'>下一頁</a>
  </div>
</template>
<script>
import { computed, ref } from 'vue'

export default {
  name: 'XtxPagination',
  props: {
    total: {
      type: Number,
      default: 80
    },
    pagesize: {
      type: Number,
      default: 10
    }
    // 默認初始頁碼
    // page: {
    //   type: Number,
    //   default: 1
    // }
  },
  setup (props, { emit, attrs }) {
    // attrs表示父組件傳遞的屬性,但是props沒有接收的屬性,這種屬性不是響應式的
    // 動態計算中期的頁碼信息
    // 每頁的條數
    // const pagesize = 8
    // 總頁數
    let pages = Math.ceil(props.total / props.pagesize)
    // 當前頁碼
    // console.log(attrs.page)
    const currentPage = ref(attrs.page || 1)
    // 動態計算頁碼列表
    const list = computed(() => {
      // 當父組件傳遞total的值發生變化時,計算屬性會重新計算
      pages = Math.ceil(props.total / props.pagesize)
      const result = []
      // 總頁碼小于等于5;大于5
      if (pages <= 5) {
        // 總頁碼小于等于5的情況
        for (let i = 1; i <= pages; i++) {
          result.push(i)
        }
      } else {
        // 總頁碼大于5
        if (currentPage.value <= 2) {
          // 左側臨界值
          for (let i = 1; i <= 5; i++) {
            result.push(i)
          }
        } else if (currentPage.value >= pages - 1) {
          // 右側臨界值
          for (let i = pages - 4; i <= pages; i++) {
            result.push(i)
          }
        } else {
          // 中間的狀態
          for (let i = currentPage.value - 2; i <= currentPage.value + 2; i++) {
            result.push(i)
          }
        }
      }
      return result
    })
    // 控制上一頁和下一頁變化
    const changePage = (type) => {
      if (type === false) {
        // 上一頁
        // 頁面是第一頁時,禁止點擊操作
        if (currentPage.value === 1) return
        if (currentPage.value > 1) {
          currentPage.value -= 1
        }
      } else if (type === true) {
        // 下一頁
        // 頁面是最后頁時,禁止點擊操作
        if (currentPage.value === pages) return
        if (currentPage.value < pages) {
          currentPage.value += 1
        }
      } else {
        // 點擊頁碼
        currentPage.value = type
      }
      emit('change-page', currentPage.value)
    }
    return { list, currentPage, pages, changePage }
  }
}
</script>
<style scoped lang="less">
.xtx-pagination {
  display: flex;
  justify-content: center;
  padding: 30px;
  > a {
    display: inline-block;
    padding: 5px 10px;
    border: 1px solid #e4e4e4;
    border-radius: 4px;
    margin-right: 10px;
    &:hover {
      color: @xtxColor;
    }
    &.active {
      background: @xtxColor;
      color: #fff;
      border-color: @xtxColor;
    }
    &.disabled {
      cursor: not-allowed;
      opacity: 0.4;
      &:hover {
        color: #333;
      }
    }
  }
  > span {
    margin-right: 10px;
  }
}
</style>

知識點:attrs表示父組件傳遞的屬性,但是props沒有接收的屬性,這種屬性不是響應式的(vue3新增)

3.實現效果

vue3.0手動封裝分頁組件的方法是怎樣的

關于vue3.0手動封裝分頁組件的方法是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤峰县| 永定县| 威信县| 合作市| 禄丰县| 衡阳市| 蛟河市| 昌黎县| 炉霍县| 遂昌县| 盐津县| 潮安县| 泸水县| 呼玛县| 株洲市| 大渡口区| 宁蒗| 彰武县| 青浦区| 德州市| 从化市| 黔西县| 仲巴县| 扶风县| 边坝县| 那坡县| 三台县| 广东省| 颍上县| 海伦市| 吉木乃县| 镇雄县| 冕宁县| 沅陵县| 开化县| 鹤岗市| 泰来县| 同仁县| 沭阳县| 岳池县| 邮箱|