Ant Design Vue的Table表格动态分页

要实现的效果是页面加载后默认请求第一页的数据,点击第二页就再次请求后台接口得到第二页的数据,需要在<a-table>上绑定一个pagination对象,还有一个change方法监听页码改变事件,具体的示例如下:

复制代码
<template>
<div>
  <!-- 顶部搜索模块 -->
  <a-form
    ref="formRef"
    layout="inline"
    :model="formState"
    :rules="rules2"
    style="padding:10px 5px 20px;"
  >
    <a-form-item label="策略名称" name="tacticsName" style="padding:10px 5px;">
      <a-input v-model:value="formState.tacticsName" placeholder="" />
    </a-form-item>
    <a-form-item style="padding:10px 5px;">
      <a-button type="primary" @click="onSubmit">搜索</a-button>
      <a-button style="margin-left: 10px" @click="resetForm">重置</a-button>
    </a-form-item>
  </a-form>
  <!-- 表格  -->
  <a-table :columns="columns2" :data-source="data" :scroll="{ x: 1200}"
    :loading="loading"
    :pagination="pagination"
    @change="handleTableChange"
  >
    <template #bodyCell="{column,record}">
      <template v-if="column.key === 'operation'">
        <a-tag color="#ff5500" @click="deleteTable(record)" style="cursor:pointer;" >删除</a-tag>
      </template>
    </template>
  </a-table>
 
</div>
</template>
<script>
import {ref, reactive,onMounted,createVNode} from "vue";
import {listElectricity, delElectricity} from '@/api/index' //封装的api接口方法引入
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; //图标
import { Modal,message } from 'ant-design-vue'; //反馈模态弹窗


export default {
  name: "Electricity",
  setup() {
    //表格的分页对象
    const pagination=ref({
      current:1,//当前页码
      total:0,//总条数,用于分页计算,初值为0
      pageSize:10,//页面容量
    });
    //页码改变事件
    const handleTableChange = (pag, filters, sorter) => {
      console.log("分页回调pag, filters, sorter",pag, filters, sorter)
      // 可以在这里根据 pagination.current 和 pagination.pageSize 发送请求获取数据,
      pagination.value.current = pag.current;//当前页码更新
      console.log("当前的分页对象pagination",pagination.value)  
      getList();//重新获取列表
    }

    const loading = ref(false);  //table表格的加载中效果
    //搜索部分的表单
    const formRef = ref();//搜索的表单模板引用
    const formState = ref({
      tacticsName: null,
    });//搜索的表单对象
    //规则2--搜索部分的表单验证--可以不填
    const rules2 = {
      // tacticsName: {required: true, message: 'xx必填'},
    };
    //搜索按钮点击提交
    const onSubmit = () => {
      formRef.value
        .validate()
        .then(() => {
          console.log('查询对象formState:', formState);
          //调用查询列表方法
          pagination.value.current=1;//分页的当前页码!!!--查询点击把页码重置!!!!!!!
          getList();//获取查询列表
        })
        .catch(error => {
          console.log('error', error);
        });
    };
    //搜索部分重置按钮点击
    const resetForm = () => {
      formRef.value.resetFields();
    };
    //获取查询列表
    const getList=()=>{
      console.log("formState:",formState.value)
      let obj=formState.value; //查询传给后台的参数对象
      obj.pageNum=pagination.value.current;//分页的当前页码!!!
      obj.pageSize=pagination.value.pageSize;//分页的容量,每页显示条数!!!

      console.log("1-查询列表传参obj:",obj)
      loading.value = true;//出现加载中效果
      // 接口
      listElectricity(obj).then(response => {
        console.log("1-查询列表返回response:",response)
        data.value=response.rows //表格数据源赋值
        loading.value =false;//关闭加载中效果
        pagination.value.total = response.total;//分页的总条数赋值
      
      });
    }
    // 表格列数据
    const columns2 = [
      {
        title: '策略名称',
        dataIndex: 'tacticsName',
        key: '2',
      },
      {
        title: '提醒标准',
        dataIndex: 'cautionSum',
        key: '6',
      },
      {
        title: '操作',
        key: 'operation',
        fixed: 'right',
        width: 150,
      },
    ];
    const data = ref([])// 表格数据源
    
    //删除表格中的某一行
    function deleteTable (row){
      console.log("删除表格中的一条数据对象row",row)
      //删除提示弹窗
      Modal.confirm({
        title: '是否确认删除该条数据项?',
        icon: createVNode(ExclamationCircleOutlined),
        content:'',// 'Some descriptions',
        okText: '确定',
        cancelText: '取消',
        onOk() {
          console.log('OK');
          let id=row.id //要删除对象的id
          console.log("删除对象的id:",id)
          //接口
          delElectricity(id).then(response => {
            console.log("5-删除回调response:",response)
            if(response.code==200){
              message.success('删除成功');
              getList();//重新获取列表
            }
      
          });
        },
        onCancel() {
          console.log('Cancel');
        },
      });

    }
    
    onMounted(async () => {
      getList();//获取查询列表!!!!!!
    });
    
    return {
      formRef,
      formState,
      onSubmit,
      resetForm,
      rules2,
      getList,
      loading,
      columns2,
      data,
      deleteTable,
      pagination,//表格的分页对象
      handleTableChange,//分页改变事件

    }
  },
}
</script>
<style scoped> </style>
相关推荐
腾讯TNTWeb前端团队5 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰8 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪8 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy9 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom10 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom10 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom10 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom10 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试