vue3封装分页组件以及回滚函数

本文详细介绍了如何在Vue项目中使用el-pagination组件进行分页,包括如何处理大小改变、页码切换时的滚动效果以及滚动函数的实现。
摘要由CSDN通过智能技术生成

分页组件

<template>
  <div class="pagination-container">
      <el-pagination
          background
          :hide-on-single-page="false"
          v-model:current-page="currentPage"
          v-model:page-size="pageSize"
          :page-sizes="pageSizes"
          :layout="layout"
          :total="total"
          :small="small"
          :prev-text="prevText"
          :next-text="nextText"
          v-bind="$attrs"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"/>
  </div>
</template>

<script setup>
 import { computed } from 'vue';
 import { scrollTo } from '@/utils/scrollTo';
 
 const props = defineProps({
      total: {
          type: Number,
          default: 0
      },
      page: {
          type: Number,
          default: 1
      },
      limit: {
          type: Number,
          default: 10
      },
      small: {
          type: Boolean,
          default: false
      },
      pageSizes: {
          type: Array,
          default() {
              return [10, 20, 30, 50, 100]
          }
      },
      prevText: {
          type: String,
          default: '上一页'
      },
      nextText: {
          type: String,
          default: '下一页'
      },
      layout: {
          type: String,
          default: 'prev, pager, next, jumper'  
      },
      autoScroll: {
          type: Boolean,
          default: true
      },
 })
 
  const emits = defineEmits(['update:page', 'update:limit', 'pagination']);
  const currentPage = computed({
    set(v) {
        console.log(v)
          emits('update:page', v)
      },
      get() {
          return props.page
      },
  })
  const pageSize = computed({
      set(v) {
          emits('update:limit', v)
      },
      get() {
          return props.limit
      },
  });
 const handleSizeChange = (val) =>{
    emits('pagination',{ page: currentPage.value, limit: val })
      if (props.autoScroll) {
          scrollTo(0, 800)
      }
  };
  const handleCurrentChange = (val)=> {
      emits('pagination',{ page: val, limit: pageSize.value })
      if (props.autoScroll) {
          scrollTo(0, 800)
      }
  };
</script>

<style lang="scss" scoped>
  .pagination-container {
      padding: 10px 10px;
      text-align: center;
      overflow-x: auto;
      border-radius: 4px;
      :deep(.el-pager li) {
          border-radius: 4px;
          background: #fff;
      }
      :deep(.el-pagination button) {
          border-radius: 4px;
          background: #fff;
      }
  }
</style>

回滚函数

Math.easeInOutQuad = function(t, b, c, d) {
  t /= d / 2
  if (t < 1) {
    return c / 2 * t * t + b
  }
  t--
  return -c / 2 * (t * (t - 2) - 1) + b
}

// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
var requestAnimFrame = (function() {
  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
})()

// because it's so fucking difficult to detect the scrolling element, just move them all
function move(amount) {
  document.documentElement.scrollTop = amount
  document.body.parentNode.scrollTop = amount
  document.body.scrollTop = amount
}

function position() {
  return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
}

export function scrollTo(to, duration, callback) {
  const start = position()
  const change = to - start
  const increment = 20
  let currentTime = 0
  duration = (typeof (duration) === 'undefined') ? 500 : duration
  var animateScroll = function() {
    // increment the time
    currentTime += increment
    // find the value with the quadratic in-out easing function
    var val = Math.easeInOutQuad(currentTime, start, change, duration)
    // move the document.body
    move(val)
    // do the animation unless its over
    if (currentTime < duration) {
      requestAnimFrame(animateScroll)
    } else {
      if (callback && typeof (callback) === 'function') {
        // the animation is done so lets callback
        callback()
      }
    }
  }
  animateScroll()
}

使用方法

<PagingDevice :total="total" 、、总条数
                v-model:page="pageNum" 、、页码
                v-model:limit="pageSize" 、、条数
                @pagination="getStrengtheningRecordsFn" /> 、、接口方法
import PagingDevice from '@/components/PagingDevice/index.vue';

  • 2
    点赞
  • 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、付费专栏及课程。

余额充值