封装分页组件

分页组件

知识点

attrs和props的区别

 setup( props , { emit , attrs , slots } ){
 ​
 ​
 //props 接受父组件的传值
 // emit 给父组件派发事件
 // attrs 接受父组件传值(除了props以外的属性)
 // slots 接受父组件的插槽内容
 ​
 }

目的:封装一个统一的分页组件

实现业务

  1. 页面显示5一页

  2. 可以设置每页多少条,根据后端返回的总数据,可以渲染出总页数

  3. 点击切换页码实现样式高亮,并调用接口获取当前页码的数据

  4. 点击上一页下一页按钮可以实现页码切换并调用接口切换当前页码的数据

  5. 当点击到第一页或者最后一页时候,上一页或下一页按钮被禁用

  6. 当当前页码大于3时,左侧显示...

  7. 当当前页码小于总页码-2时,右侧显示...

落地代码

  • 基本结构和样式

     
    <template>
       <div class="xtx-pagination">
         <a href="javascript:;" class="disabled">上一页</a>
         <span>...</span>
         <a href="javascript:;" class="active">3</a>
         <a href="javascript:;">4</a>
         <a href="javascript:;">5</a>
         <a href="javascript:;">6</a>
         <a href="javascript:;">7</a>
         <span>...</span>
         <a href="javascript:;">下一页</a>
       </div>
     </template>
     <script>
     export default {
       name: 'XtxPagination'
     }
     </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>

  • 父组件传入后端返回的 total 总条数,每页显示多少条 pageSize , 当前默认的页码 page,计算出动态的分页列表

    父组件

     
    <XtxPagination :total='100',:page='1'/>

    子组件

     
    <template>
       <div class="xtx-pagination">
         <a href="javascript:;" :class="{disabled:page===1}" @click='changePage(page-1)'>上一页</a>
         <span v-if='page>3'>...</span>
         <a href="javascript:;" :class="{active:page===item}" v-for='item in list' :key='item' @click='changePage(item)'>{{item}}</a>
         <span v-if='page<totalPage-2'>...</span>
         <a href="javascript:;" :class="{disabled:page===totalPage}" @click='changePage(page+1)'>下一页</a>
       </div>
     </template>

     
    import { computed, ref } from 'vue'
     ​
     export default {
       name: 'XtxPagination',
       props: {
         total: {
           type: Number,
           required: true
         },
         pagesize: {
           type: Number,
           default: 10
         }
       },
       setup (props, { emit, attrs }) {
         // attrs表示父组件传递的属性,但是不是props,并且attrs的值不是响应式的
         // 计算页码
         // 数据的总条数
         // 每页的条数
         // 当前页码
         const page = ref(attrs.page || 1)
         // 总页数
         const totalPage = Math.ceil(props.total / props.pagesize)
         // 动态计算页码的列表
         const list = computed(() => {
           const pages = []
           if (totalPage <= 5) {
             // 开始的数据
             for (let i = 1; i <= totalPage; i++) {
               pages.push(i)
             }
           } else {
             if (page.value <= 3) {
               // 开始的数据
               for (let i = 1; i <= 5; i++) {
                 pages.push(i)
               }
             } else if (page.value >= totalPage - 2) {
               // 结束的数据
               for (let i = totalPage - 4; i <= totalPage; i++) {
                 pages.push(i)
               }
             } else {
               // 中间的数据
               for (let i = page.value - 2; i <= page.value + 2; i++) {
                 pages.push(i)
               }
             }
           }
           return pages
         })
     ​
         // 切换页码:修改父组件的当前页码
         const changePage = (currentPage) => {
           // 防止点击上一页和下一页时超出范围
           if (currentPage <= 0 || currentPage > totalPage) return
           page.value = currentPage
           // 触发接口调用
           emit('change-page', currentPage)
         }
     ​
         return { list, changePage, totalPage, page }
       }
     }

  • 父组件内接受事件和参数进行接口调用获取数据

     
    <XtxPagination :total='100',:page='1' @change-page='changePage'/>
     
    export default {
       setup(){
         ...省略代码
         // 筛选条件准备
         const reqParams = reactive({
           // 当前页码
           page: 1,
           // 每页的条数
           pageSize: 10,
           // 是否有图片
           hasPicture: null,
           // 筛选条件
           tag: null,
           // 排序的字段
           sortField: null
         })
        //  更新当前页码  
         const changePage=(page)=>{
           reqParams.page=page
         }
         //侦听器侦听数据的变化调用接口
         watch( reqParams ,()=>{
           //接口调用
             // 获取评论列表
           findCommentListByGoods(goods.value.id, reqParams).then(res => {
             total.value = res.result.counts// 获取总数
             list.value = res.result.items// 评论列表
           })
         },{
           immediate:true
         })
         return{ changePage }
       }
     }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue3中封装分页组件的方法与Vue2有所不同。以下是一个基本的封装分页组件的方法: 1. 首先,在你的项目中创建一个名为`Pagination.vue`的组件文件。 2. 在`Pagination.vue`组件中,你可以使用`<template>`标签来定义组件的结构。可以使用`<div>`标签来包裹分页组件的内容,比如页码和按钮。 3. 在`<script>`标签中,你需要导入`vue`并声明组件。你可以使用`ref`来追踪当前页码,并且使用`computed`属性来计算总页数。 4. 在组件内部,你可以创建一个`methods`对象,并在其中定义一些方法来处理页码的变化。比如,你可以创建`goToPage`方法来跳转到指定的页码。 5. 最后,在`<style>`标签中,你可以定义组件的样式,如页码的颜色和按钮的样式。 在你的项目中使用这个封装分页组件的方法如下: 1. 在需要使用分页功能的组件中,使用`import`关键字导入刚刚封装的`Pagination`组件。 2. 在`components`属性中注册`Pagination`组件。 3. 在`<template>`标签中使用自定义的分页组件。可以使用`v-model`指令来双向绑定当前页码。 通过上述步骤,你就可以在Vue3中封装一个分页组件并在项目中使用了。这个组件可以提供分页功能,让用户可以方便地切换页码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于Vue如何封装分页组件](https://download.csdn.net/download/weixin_38550605/12789728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue3 element-ui实现Pagination分页组件--封装分页](https://blog.csdn.net/coinisi_li/article/details/128952886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值