【Vue3 + Element Plus】纯前端实现本地数据分页

63 篇文章 4 订阅
8 篇文章 3 订阅

先附上效果图

Vue3 + Element Plus 实现本地分页

首页弹窗代码
<el-table :data="tableData" style="width: 100%" border stripe>
  <el-table-column v-for="{ id, prop, label } in tableColumn" :prop="prop" :key="id" :label="label" :width="label == '序号' ? 100 : ''" align="center" />
  <el-table-column fixed="right" label="操作" align="center" width="240">
    <template #default="scope">
      <el-button link type="primary" size="small" @click="handlEmodify(scope.row)">编辑</el-button>
      <el-button link type="primary" size="small" @click="handleDel(scope.row)">删除</el-button>
      <el-button link type="primary" size="small" @click="handlDetail(scope.row)">查看</el-button>
    </template>
  </el-table-column>
</el-table>
// 分页组件 这里二次封装了一下
<pagination class="pagination" :total="total" :pageNo="pageNo" :pageSize="pageSize" @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange" />

import { ref, onMounted, defineComponent, reactive } from 'vue'
import { ElMessage } from 'element-plus'
// mock数据 也可以自己写到页面上
import { getTableList } from '@/api/home.js'
// 二次封装的分页组件
import pagination from './components/pagination.vue'
// 循环渲染 tableColumn 数据
const tableColumn = ref([
  { id: 1, prop: 'id', label: '序号' },
  { id: 2, prop: 'date', label: '时间' },
  { id: 3, prop: 'name', label: '姓名' },
  { id: 4, prop: 'address', label: '地址' }
])
// 当前页
const pageNo = ref(1)
// 当前大小
const pageSize = ref(10)
// 从接口获取的所有数据
const tableData = ref([])
// 筛选条数
const total = ref(0)
// 总条数
const filterData = reactive({
  data: []
})

// 初始化表格
const initTable = async () => {
  let res = await getTableList()
  // 不存在 data 说明没有数据 中断代码执行
  if (!res.data) return false
  // 全部数据赋值给 filterData
  filterData.data = res.data
  // 赋值总条数给 total
  total.value = res.total
  // 分页逻辑在这里体现
  let start = pageNo.value > 1 ? (pageNo.value - 1) * pageSize.value : 0
  let end = pageNo.value * pageSize.value
  // 将符合条件的数据赋值给 tableData
  tableData.value = res.data.slice(start, end)
}

// 分页大小事件触发此方法
const handleSizeChange = val => {
  pageNo.value = 1
  pageSize.value = val
  initTable()
}
// 分页数事件触发此方法
const handleCurrentChange = val => {
  pageNo.value = val
  initTable()
}
pagination 组件
<template>
  <el-pagination background :current-page="props.pageNo" :page-sizes="[10, 20, 30, 50]" :page-size="props.pageSize"
    layout="total, sizes, prev, pager, next, jumper" :total="props.total" @size-change="handleSizeChange"
    @current-change="handleCurrentChange" />
</template>
const props = defineProps(['total', 'pageNo', 'pageSize'])
const emit = defineEmits(['handleSizeChange', 'handleCurrentChange'])

const handleSizeChange = val => { emit('handleSizeChange', val) }
const handleCurrentChange = val => { emit('handleCurrentChange', val) }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端大斗师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值