el-table查询功能封装

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { ElTable } from 'element-plus';

// 定义 Props,支持配置列和API请求
const props = defineProps<{
  columns: Array<{ prop: string; label: string; type?: string; [key: string]: any }>;
  requestApi: (params: any) => Promise<any>; // 核心:传入请求方法
}>();

// 内部状态
const tableData = ref([]);
const loading = ref(false);
const pagination = ref({ currentPage: 1, pageSize: 10, total: 0 });
const searchParams = ref({}); // 假设这里绑定了外部传入的搜索表单

// 数据请求逻辑封装
const fetchData = async () => {
  loading.value = true;
  try {
    const { data, total } = await props.requestApi({
      ...searchParams.value,
      page: pagination.value.currentPage,
      size: pagination.value.pageSize,
    });
    tableData.value = data;
    pagination.value.total = total;
  } finally {
    loading.value = false;
  }
};

// 暴露给父组件的方法
defineExpose({ refresh: fetchData });

onMounted(fetchData);
</script>

<template>
  <div class="pro-table">
    <slot name="search" :params="searchParams"></slot>
    
    <el-table v-loading="loading" :data="tableData" border style="width: 100%" v-bind="$attrs">
      <template v-for="col in columns" :key="col.prop">
        <el-table-column v-if="col.type === 'selection'" type="selection" width="55" />
        <el-table-column v-else v-bind="col">
           <template #default="scope" v-if="$slots[col.prop]">
             <slot :name="col.prop" :row="scope.row"></slot>
           </template>
        </el-table-column>
      </template>
    </el-table>

    <el-pagination
      v-model:current-page="pagination.currentPage"
      v-model:page-size="pagination.pageSize"
      :total="pagination.total"
      @size-change="fetchData"
      @current-change="fetchData"
      layout="total, sizes, prev, pager, next, jumper"
    />
  </div>
</template>

### 封装 `el-table-v2` 组件 为了使 `el-table-v2` 更加易于复用和优化其功能,可以遵循一种结构化的方式来进行组件的封装。这不仅提高了开发效率,还增强了代码的可维护性和一致性。 #### 抽取基础表格逻辑 通过创建一个新的 Vue 组件文件,比如命名为 `BaseTable.vue`,可以在其中定义通用的行为和样式[^1]。此操作允许开发者集中管理所有与表格有关的功能,从而减少重复劳动并简化后续更新流程。 ```vue <template> <el-table :data="tableData" style="width: 100%"> <!-- 表格列 --> <slot></slot> </el-table> </template> <script setup lang="ts"> import { ref } from 'vue'; const tableData = ref([ { date: "2016-05-03", name: "Tom", address: "No. 189, Grove St, Los Angeles" }, // ...其他数据项... ]); </script> ``` #### 属性透传机制 利用 Vue 提供的强大特性——属性传递(`props`),能够轻松地让父级元素向子组件传输参数而无需修改内部实现细节。这意味着当使用 `<base-table>` 标签时可以直接设置任何原生支持于 `el-table` 上面的有效选项: ```html <BaseTable border stripe height="400px"></BaseTable> ``` 上述例子展示了如何简单地应用额外样式给整个表格实例,如边框、条纹效果或是固定高度等。 #### 插槽的应用 对于更复杂的场景,则可以通过插槽(slot)技术进一步增强灵活性。特别是作用域插槽(scoped slot),它允许使用者访问特定行的信息作为模板渲染的一部分[^2]。下面是一个简单的示范,说明怎样定制每一列的内容呈现方式: ```html <BaseTable :data="users"> <el-table-column prop="name" label="姓名"> <template v-slot="{ row }">{{ row.name }}</template> </el-table-column> <el-table-column prop="age" label="年龄"/> </BaseTable> ``` 这里假设有一个名为 `users` 的数组包含了多个对象,每个对象代表一位用户的记录。通过这种方式,不仅可以控制显示哪些字段,还可以完全掌控它们的表现形式。 #### 动态加载与懒加载 考虑到性能因素,在处理大数据集的情况下推荐采用分页或虚拟滚动(virtual scrolling)[^4]。这些策略有助于减轻浏览器内存压力的同时保持流畅用户体验。具体来说就是只渲染当前视窗内的部分而不是一次性全部读入DOM树中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值