Vue 基于ElementUI 封装table表格组件 + pagination分页组件

效果展示:

状态页面

 用户页面

Vue 源码:

定义封装组件:Pagination.vue

<template>
  <div>
  <el-table height="520" :data="tableData" style="width: 100%" border>
    <template v-for="(item, index) in columnData">
      <el-table-column
        :prop="item.prop"
        :key="index"
        :label="item.label"
      >
      </el-table-column>
    </template>
  </el-table>
  <el-pagination
    class="pg"
    layout="total, sizes, prev, pager, next, jumper"
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
    :current-page="currentPage"
    :page-sizes="[10, 20, 50, 100]"
    :page-size="pagesize"
    :total="total"
    background
  ></el-pagination>
</div>

</template>

<script>
export default {
  props: {
    // 分页数据总数
  total: {
    type: Number,
    default: 1000,
    required: false
  },
  // 单页数据量
  pagesize: {
    type: Number,
    default: 10,
    required: false
  },
  // 当前页码
  currentPage: {
    type: Number,
    default: 1,
    required: false
  },
  // 表格数据
  tableData: {
    type: Array,
    default: ()=>[],
    required: false
  },
  // 表头数据
  columnData: {
    type: Array,
    default: ()=>[],
    required: false
  }
  },
  data() {
    return {};
  },
  methods: {
   // 以下两个函数均是触发父组件的handleChange事件,从而实现点击分页的功能按钮后,子组件向父组件传参
  handleCurrentChange: function (currentPage) {
    this.$emit('handleChange', this.pagesize, currentPage)
  },
  handleSizeChange: function (pageSize) {
    this.$emit('handleChange', pageSize, this.currentPage)
  }

  },
};
</script>
<style scoped>
.pg {
  margin: 5px;
  text-align: right;
}
</style>

调用封装组件:user.vue

<style>
.pg-div {
  margin: auto;
  width: 100%;
}
</style>
<template>
<div class='pg-div'>
  <Pagination  :columnData="columnData"
    :tableData="tableDataList"
    :total="totalNum"
    :pagesize="pagesizeNum"
    :currentPage="currentPageNum"
    @handleChange="handleChangeData"
    />
</div>
</template>
 
<script>
import Pagination from "@/components/Pagination";
 import {getUserList} from "@/api/user";

export default{
    name: 'user',
    data() {
    return {
      columnData:[], // 表头数据,引用于mock数据
      tableDataList: [], // 分页后的表格数据
      totalNum: 24, // 数据总数
      pagesizeNum: 10, // 单页数据量
      currentPageNum: 1 // 当前页码
    };
    },
    components:{
        Pagination
    },
    created() {
      this.getData()
    },
    methods:{
        // 获取子组件传来修改后的pagesize和currentPage,改变数据页码或每页条目,进而请求新数据
    handleChangeData (pagesize, currentPage) {
      console.log("pagesize", pagesize)
      this.pagesizeNum = pagesize
      this.currentPageNum = currentPage
      this.getData()
    },

    getData(){
         var params ={
          'pageNum': this.currentPageNum,
          'pageSize': 10,
         }
        getUserList(this.$qs.stringify(params)).then(res => {
                console.log(res)
                this.columnData = [{"label":"姓名", "prop":"name"}]
                // 把请求到的数据给testDatas数组
                this.tableDataList = res.data.list
                // 当前页数
                this.currentPageNum = res.data.pageNum
                // 当前页数量
                this.pagesizeNum = res.data.pageSize
                // 分页总数
                this.totalNum = res.data.total
              //   console.log(JSON.stringify(res.data.data.total))
            })
            .catch((error) => {
             console.log(error)
            })
        }
        
    }

}
</script>

state.vue 

<style>
.pg-div {
  margin: auto;
  width: 100%;
}
</style>
<template>
<div class='pg-div'>
  <Pagination  :columnData="columnData"
    :tableData="tableDataList"
    :total="totalNum"
    :pagesize="pagesizeNum"
    :currentPage="currentPageNum"
    @handleChange="handleChangeData"
    />
</div>
</template>
 
<script>
import Pagination from "@/components/Pagination";
 import {getStateList} from "@/api/state";

export default{
    name: 'user',
    data() {
    return {
      columnData:[], // 表头数据,引用于mock数据
      tableDataList: [], // 分页后的表格数据
      totalNum: 24, // 数据总数
      pagesizeNum: 10, // 单页数据量
      currentPageNum: 1 // 当前页码
    };
    },
    components:{
        Pagination
    },
    created() {
      this.getData()
    },
    methods:{
        // 获取子组件传来修改后的pagesize和currentPage,改变数据页码或每页条目,进而请求新数据
    handleChangeData (pagesize, currentPage) {
       console.log("pagesize", pagesize)
      this.pagesizeNum = pagesize
      this.currentPageNum = currentPage
      this.getData()
    },

    getData(){
         var params ={
          'pageNum': this.currentPageNum,
          'pageSize': 10,
         }
        getStateList(params).then(res => {
                console.log(res)
                this.columnData = [{"label":"状态名称", "prop":"name"}]
                // 把请求到的数据给testDatas数组
                this.tableDataList = res.data.list
                // 当前页数
                this.currentPageNum = res.data.pageNum
                // 当前页数量
                this.pagesizeNum = res.data.pageSize
                // 分页总数
                this.totalNum = res.data.total
              //   console.log(JSON.stringify(res.data.data.total))
            })
            .catch((error) => {
             console.log(error)
            })
        }
        
    }

}
</script>

api 定义:user.js 和state.js

import request from '@/utils/request'

export function getStateList(params) {
    return request({
      url: '/state/page',
      method: 'get',
      params
    })
  }
import request from '@/utils/request'

export function getUserList(data) {
    return request({
      url: '/user/page',
      method: 'post',
      data
    })
  }

 axios 封装:request.js

import { Message, MessageBox } from "element-ui";
import axios from 'axios';

const service = axios.create({
    baseURL: 'http://192.168.1.74:8081/crm',
    timeout: 15000  // 请求超过15秒就报错
  })

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
  // request拦截器
service.interceptors.request.use(config => {
  
    return config
  }, error => {
    // 当请求错误时
    console.log(error)
    Promise.reject(error)
  })
  
  // response拦截器
  service.interceptors.response.use(
    response => {
      const res = response.data
      // if !200 start
      if (res.code !== 200) {
        Message({
          message: res.massage,
          type: 'error',
          duration: 3 * 1000
        })
  
        // code = 401 表示未登录
        // if 401 start
        if (res.code === 401) {
          MessageBox.confirm('登录失效,请重新登录', '确认登出', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            
          })
        } // if 401 end
        return Promise.reject('error')
      } else { // if !200 end
        return response.data
      }
    }, // response end
  
    error => {
      console.log('err' + error)
      Message({
        message: error.message,
        type: 'error',
        duration: 3 * 1000
      })
      return Promise.reject(error)
    }
  )
  
  export default service

SpringBoot 后台接口:

后台下载地址:

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 Vue 2 和 Element UI 表格二次封装的示例代码: ``` <template> <el-table :data="pageData" :default-sort="{prop: 'id', order: 'ascending'}"> <el-table-column label="ID" prop="id" sortable /> <el-table-column label="姓名" prop="name" /> <el-table-column label="年龄" prop="age" /> <el-table-column label="性别" prop="gender" /> <el-table-column label="操作"> <template slot-scope="scope"> <el-button size="small" @click="handleEdit(scope.row)">编辑</el-button> <el-button size="small" @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> <el-pagination :current-page.sync="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="pageSize" :total="tableData.length" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </el-table> </template> <script> export default { props: { tableData: { type: Array, required: true, }, pageSize: { type: Number, default: 10, }, }, data() { return { currentPage: 1, }; }, computed: { pageData() { const start = (this.currentPage - 1) * this.pageSize; const end = start + this.pageSize; return this.tableData.slice(start, end); }, }, methods: { handleEdit(row) { // 编辑操作 console.log('编辑', row); }, handleDelete(row) { // 删除操作 console.log('删除', row); }, handleSizeChange(pageSize) { this.pageSize = pageSize; }, handleCurrentChange(currentPage) { this.currentPage = currentPage; }, }, }; </script> ``` 此示例中,将表格数据和每页显示的数据量通过 props 传入组件。使用计算属性 pageData 计算当前页应该显示的数据。在表格下方添加分页组件,使用 v-model 绑定 currentPage,使用 @size-change 和 @current-change 监听分页组件的事件,调用对应的方法进行相应操作。同时,使用 Element UI 的 el-table-column 组件中的 sortable 属性可以实现列排序。 通过这样的封装,可以使表格组件更加通用、简洁,避免重复的代码编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值