vue3+elementPlus+js封装常规的table表格加分页组件

封的子组件proTable组件:

<template>
  <div>
    <el-table :data="tableData" stripe empty-text="暂无数据" @selection-change="handleSelection">
      <el-table-column type="selection" width="100" v-if="isMoreSelect" align="center" />
      <el-table-column v-for="col, i in tableHeader" :prop="col.props" :key="i" :label="col.label"
        :width="col.width || 'auto'" align="center">
        <template #default="{ row }">
          <!-- 自定义内容 -->
          <slot :rows="row" :cols="col"></slot>
        </template>
      </el-table-column>
    </el-table>
    <div style="height: 15px"></div>
    <el-row justify="end">
      <el-pagination v-show="totalNum > 0" @size-change="sizeChange" @current-change="currentChange"
        v-model:current-page.sync="currentPage" :page-sizes="[5, 10, 20, 30]" v-model:page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper" :total="totalNum" background>
      </el-pagination>
    </el-row>
  </div>
</template>
<script setup  name="Table">
const props = defineProps({
  //  表头
  tableHeader: {
    type: Array,
    default: () => [],
  },
  tableData: {
    type: Array,
    default: () => [],
  },
  //是否多选显示
  isMoreSelect: {
    type: Boolean,
    default: false,
  },
  // 当前页
  currentPage: {
    type: Number,
    default: 0,
  },
  // 展示页数
  pageSize: {
    type: Number,
    default: 0,
  },
  //总页数
  totalNum: {
    type: Number,
    default: 0,
  },
  // 改变每页展示页数
  sizeChange: {
    type: Function,
    default: () => { },
  },
  // 改变页码
  currentChange: {
    type: Function,
    default: () => { },
  },
  //多选
  handleSelection: {
    type: Function,
    default: () => { },
  }
});
</script>

<style scoped lang="scss"></style>

父组件进行使用

<template>
  <proTable :tableHeader="tableHeaderData" :handleSelection="handleSelectionChange" :isMoreSelect="true"
    :tableData="tableList" :currentChange="handleCurrentChange" :sizeChange="handleSizeChange" :pageSize="pageSizes"
    :currentPage="currentPages" :totalNum="total">
    <template v-slot:default="{ rows, cols }">
      <!-- 显示其他内容 -->
      <span v-show="!['状态'].includes(cols.label)"> {{ rows[cols.props] }} </span>
      <!-- 过滤一些内容-->
      <el-tag v-show="cols.label == '状态'" :type="rows.status == 1 ? 'danger' : ''">{{ rows.status == 1 ? '停用' : '正常'
      }}</el-tag>
      <div v-show="cols.label == '操作'">
        <el-button size="small" type="primary" @click=editWorkshopFn(rows) text :icon="Edit">编辑</el-button>
        <el-button size="small" type="danger" text :icon="Delete" @click="deleteBtn(rows)">删除</el-button>
      </div>
    </template>
  </proTable>
</template>

<script setup >
import { Delete, Edit } from '@element-plus/icons-vue'
import { getWorkshopPage, deleteWorkshop } from '@/api/factory/workshop'
import proTable from '@/components/proTable/index.vue'
const tableList = ref([])

const tableHeaderData = [
  {
    label: '序号',
    props: 'sort'
  },
  {
    label: '车间名称',
    props: 'workshopName'
  },
  {
    label: '所属部门',
    props: 'deptName'
  },
  {
    label: '状态',
    props: 'status'
  },
  {
    label: '创建时间',
    props: 'createTime'
  },
  {
    label: '备注',
    props: 'remark'
  },
  {
    label: '操作',
    props: 'controls'
  }

]
const total = ref(0);
const currentPages = ref(1)
const pageSizes = ref(10)

onMounted(() => {
  //初始化
  getWorkshopPageFn()
})

// 选择
const handleSelectionChange = (val) => {
  console.log('多选', val)
}

// 删除按钮
const deleteBtn = async (row) => {
  console.log('删除', row)
  await useHandleData(deleteWorkshop, row.workshopId)   //deleteWorkshop为接口, row.workshopId为接口参数
  getWorkshopPageFn()
}

// 编辑按钮
const editWorkshopFn = async (row) => {
  console.log('编辑', row)
}

//分页方法
const getWorkshopPageFn = async () => {
  //调接口拿数据
  let res = await getWorkshopPage(
    {
      pageNum: currentPages.value,
      pageSize: pageSizes.value,
    })
  total.value = res.total
  tableList.value = res.rows
}

//分页相关按钮
const handleSizeChange = (page) => {
  pageSizes.value = page
  getWorkshopPageFn()
}
const handleCurrentChange = (page) => {
  currentPages.value = page
  getWorkshopPageFn()
}
</script>

 效果如下:

 

后台项目中table表格中经常有删除、重置修改等按钮,有时需要给个提示,需要确认再进行这个动作,一直使用。elementplus中提供了ElMessageBox, ElMessage,但是直接使用太繁琐,行数太多,直接封装一个函数,调用即可!

封装useHandleData函数
import { ElMessageBox, ElMessage,ElLoading } from 'element-plus';

//全局loading效果
const openFullLoading=()=>{
  const fullLoading = ElLoading.service({
    lock: true,
    text: 'Loading',
    background: 'rgba(0, 0, 0, 0.7)',
  }) 
  return fullLoading
}

export const useHandleData = (api, params = {}, message='删除', confirmType = 'warning') => {
  return new Promise((resolve, reject) => {
    ElMessageBox.confirm(`是否${message}此数据?`, '提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: confirmType,
      draggable: true
    }).then(async () => {
      try {
        openFullLoading()
       await api(params);
        ElMessage({
          type: 'success',
          message: `${message}成功!`
        });
      } finally{
        openFullLoading().close()
      }
      resolve(true);
    });
  });
};

一行使用

import proTable from '@/components/proTable/index.vue'
// 删除按钮
const deleteBtn = async (row) => {
  await useHandleData(deleteWorkshop, row.workshopId)   //deleteWorkshop为接口, row.workshopId为接口参数
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以为您介绍一下Vue3企业级项目中如何二次封装el-table,并实现分页功能的步骤。 步骤如下: 1. 安装 Element-UI 首先,需要安装 Element-UI,可以使用 npm 进行安装: ``` npm install element-plus --save ``` 2. 创建封装组件 接下来,我们需要创建一个可以被重复使用的封装组件,可以命名为 `MyTable`,并在该组件中引入 Element-UI 中的 `ElTable`、`ElTableColumn`、`ElPagination` 等组件。 示例代码如下: ```html <template> <div> <el-table v-bind="$attrs" :data="tableData" style="width: 100%"> <el-table-column v-for="item in columns" :key="item.prop" :prop="item.prop" :label="item.label"> </el-table-column> </el-table> <el-pagination v-show="showPagination" v-bind="$attrs" :current-page.sync="currentPage" :page-sizes="pageSizes" :page-size="pageSize" :total="total" :layout="layout" @size-change="handleSizeChange" @current-change="handleCurrentChange"></el-pagination> </div> </template> <script> export default { name: 'MyTable', props: { columns: { type: Array, required: true }, data: { type: Array, required: true }, showPagination: { type: Boolean, default: true }, pageSize: { type: Number, default: 10 }, pageSizes: { type: Array, default: () => [10, 20, 30, 40, 50] }, total: { type: Number }, layout: { type: String, default: 'total, sizes, prev, pager, next, jumper' }, }, data() { return { currentPage: 1, tableData: [], }; }, created() { this.tableData = this.data; }, methods: { handleSizeChange(val) { this.pageSize = val; this.$emit('size-change', val); }, handleCurrentChange(val) { this.currentPage = val; this.$emit('current-change', val); }, }, }; </script> ``` 在上述代码中,我们引入了 `ElTable`、`ElTableColumn`、`ElPagination` 等组件,并根据需要设置了一些默认的 props 属性。同时,我们通过 `$attrs` 绑定了父组件传入的属性,方便在父组件中使用。 3. 在父组件中使用封装组件 在父组件中使用我们刚才封装的 `MyTable` 组件,可以传入 `columns`、`data` 等属性,示例代码如下: ```html <template> <div class="container"> <my-table :columns="columns" :data="data" @current-change="handleCurrentPageChange" @size-change="handleSizeChange"></my-table> </div> </template> <script> import MyTable from '@/components/MyTable.vue'; export default { name: 'MyTableDemo', components: { MyTable, }, data() { return { columns: [ { label: '姓名', prop: 'name' }, { label: '年龄', prop: 'age' }, { label: '性别', prop: 'gender' }, ], data: [], currentPage: 1, pageSize: 10, total: 0, }; }, methods: { // 模拟异步请求数据 fetchData() { setTimeout(() => { this.data = [ { name: '张三', age: 18, gender: '男' }, { name: '李四', age: 22, gender: '女' }, { name: '王五', age: 30, gender: '男' }, { name: '赵六', age: 25, gender: '女' }, ]; this.total = 4; }, 1000); }, handleCurrentPageChange(val) { // 处理页码变化 this.currentPage = val; this.fetchData(); }, handleSizeChange(val) { // 处理每页显示数量变化 this.pageSize = val; this.fetchData(); }, }, created() { this.fetchData(); }, }; </script> ``` 在上述代码中,我们引入了刚才封装的 `MyTable` 组件,并传入了 `columns`、`data` 等属性。同时,我们在 `handleCurrentPageChange` 和 `handleSizeChange` 方法中处理了页码变化和每页显示数量变化的情况,并触发了 `fetchData` 方法重新请求数据。 4. 完成 至此,我们就完成了 Vue3 企业级项目中二次封装 `el-table` 并实现分页功能的步骤。通过封装组件,我们可以提高代码的复用性和可维护性,同时提升项目的开发效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值