pagination封装

el-pagination 封装

前置:vue3、element-plus

方法一 :model

子组件

<!-- pagination.vue -->
<template>
  <el-pagination
    :current-page="pageNo"
    :page-size="pageSize"
    :page-sizes="pageSizeArr"
    layout="->,prev, pager, next, jumper,sizes,total"
    :total="total"
    @current-change="handleCurrentChange"
    @size-change="handleChangeSize" />
</template>

<script lang="ts" setup>
import { defineEmits } from 'vue'
const $emit = defineEmits(['update:pageNo', 'update:pageSize'])
defineProps({
  pageNo: {
    type: Number,
    default: 1
  },
  pageSize: {
    type: Number,
    default: 8
  },
  total: {
    type: Number,
    default: 0
  },
  pageSizeArr: {
    type: Array,
    default: () => [8, 12, 16]
  }
})
const handleCurrentChange = (newPage: number) => {
  $emit('update:pageNo', newPage)
}
const handleChangeSize = (newSize: number) => {
  $emit('update:pageSize', newSize)
}
</script>

父组件

<!-- 父组件关键代码 -->
<template>
  <Pagination :pageNo="pageNo" :pageSize="pageSize" :total="total" :pageSizeArr="pageSizeArr" @update:pageNo="getProjectList" @update:pageSize="changeSize" />
</template>
<script lang="ts" setup>
import { ref } from 'vue'
// 当前页
let pageNo = ref<number>(1)
// 每页显示多少条数据
let pageSize = ref<number>(8)
// 总条数
let total = ref<number>(80)
// 每页显示条数数组
const pageSizeArr = ref<number[]>([8, 11, 22])
// 获取项目列表数据
const getProjectList = (newPage: number) => {
  pageNo.value = newPage
  console.log(pageNo.value)
  // 异步获取数据
}
// 改变每页显示多少条数据
const changeSize = (newSize: number) => {
  pageSize.value = newSize
  console.log(pageNo.value, pageSize.value)
  // 异步获取数据
}
</script>
方法二 v-model:

子组件

<!-- pagination.vue 改动代码-->
<script>
const $emit = defineEmits(['changeSize', 'getProjectList', 'update:pageNo', 'update:pageSize'])

const handleCurrentChange = (newPage: number) => {
  $emit('update:pageNo', newPage)
  $emit('getProjectList')
}
const handleChangeSize = (newSize: number) => {
  $emit('update:pageSize', newSize)
  $emit('changeSize')
}
</script>

父组件

<!-- 父组件 改动代码-->
<Pagination v-model:pageNo="pageNo" v-model:pageSize="pageSize" :total="total" :pageSizeArr="pageSizeArr" @getProjectList="getProjectList" @changeSize="changeSize" />

总结:方法一和方法二区别不大,使用第二种方法要请求数据的话还是得自定义事件,方法二相当于方法一的简写(不请求数据的话)

<Pagination v-model:pageNo="pageNo" v-model:pageSize="pageSize" :total="total" :pageSizeArr="pageSizeArr" />

<!-- 以下的简写 -->

<Pagination :pageNo="pageNo" :pageSize="pageSize" :total="total" :pageSizeArr="pageSizeArr" @update:pageNo="pageNo = $event" @update:pageSize="pageSize = $event" />
方法三 v-model:+引用类型

子组件

<template>
  <el-pagination
    v-model:current-page="paginData.pageNo"
    v-model:page-size="paginData.pageSize"
    :page-sizes="paginData.pageSizeArr"
    layout="->,prev, pager, next, jumper,sizes,total"
    :total="paginData.total"
    @current-change="handleCurrentChange"
    @size-change="handleChangeSize" />
</template>

<script lang="ts" setup>
import { defineEmits } from 'vue'
const $emit = defineEmits(['changeSize', 'getProjectList'])
defineProps({
  paginData: {
    type: Object,
    default: () => {
      return {
        pageNo: 1,
        pageSize: 8,
        total: 0,
        pageSizeArr: [8, 12, 16]
      }
    }
  }
})

const handleCurrentChange = () => {
  $emit('getProjectList')
}
const handleChangeSize = () => {
  $emit('changeSize')
}
</script>

父组件

<Pagination :paginData="paginData" @getProjectList="getProjectList" @changeSize="changeSize" />
<script lang="ts" setup>
let paginData = reactive({
  pageNo: 1,
  pageSize: 8,
  total: 80,
  pageSizeArr: [8, 11, 22]
})
</script>

从代码量来说,方法三的更简洁

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值