el-table简单进行封装

文章介绍了如何在Vue中使用el-table进行简单封装,处理子组件中的表头插槽,适用于新手学习,同时呼吁大神提供指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

el-table 简单封装 (新手学习)

// 子组件
<template>
  <div class="nq-table">
    <el-table :data="tabList" height="600" border style="width: 100%">
      <template v-for="(item, index) in tabHeader">
        <!-- 判断是否有slot -->
        <el-table-column
          v-if="!item.slot"
          :prop="item.prop"
          :label="item.label"
        >
        </el-table-column>
        <el-table-column v-else :prop="item.prop" :label="item.label">
          <template slot-scope="{ row, $index }">
            <slot
              v-if="item.slot"
              :name="item.slot"
              :row="row"
              :index="$index"
            />
          </template>
        </el-table-column>
      </template>
    </el-table>
  </div>
</template>
<script>
export default {
  name: "NqTable",
  props: {
    tabList: {
      type: Array,
      required: true,
      default: () => [],
    },
    tabHeader: {
      type: Array,
      required: true,
      default: () => [],
    },
  },
};
</script>

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

tabList:是传递的table数据
tabHeader:传递的是表头数据

使用

<template>
  <div>
<nq-table :tabList="filterData" :tabHeader="tabHeader">
		// #controls="{ row, index }"  插槽名称和数据
          <template #controls="{ row, index }">
            <el-button type="text" size="small" @click="getDtInfo(row.id)"
              >查看</el-button
            >
            <el-button type="text" size="small" @click="upDtDicList(row)"
              >编辑</el-button
            >
            <el-button
              type="text"
              size="small"
              style="color: #f56c6c"
              @click="delDtDicList(row)"
            >
              删除
            </el-button>
          </template>
          <template #seq="{ row, index }">{{ index }} </template>
          <template #isEnabled="{ row, index }">
            <el-checkbox
              v-model="row.isEnabled"
              @change="upPartDicList('isEnabled', row.isEnabled, row.id)"
              size="small"
            ></el-checkbox>
          </template>
          <template #isDefault="{ row, index }">
            <el-checkbox
              v-model="row.isDefault"
              @change="upPartDicList('isDefault', row.isDefault, row.id)"
              size="small"
            ></el-checkbox>
          </template>
        </nq-table>
  <div>
<template>

export default {
  data() {
  	return {
  		 filterData:[],
  		 tabHeader: [
	        { label: "操作", prop: "", slot: "controls" },
	        { label: "序号", prop: "", slot: "seq" },
	        { label: "分类名称", prop: "category.name" },
	        { label: "显示名称", prop: "displayName" },
	        { label: "字典值", prop: "value" },
	        { label: "字典描述", prop: "description" },
	        { label: "启用情况", prop: "isEnabled", slot: "isEnabled" },
	        { label: "默认显示", prop: "isDefault", slot: "isDefault" },
	        { label: "排序", prop: "seq" },
      ],
	}
  }
}

思路: 子组件判断是否表头数据(tabHeader)里是否存在插槽(slot)这个属性,如果没用就使用原来的 el-table-column 若有就 使用插槽 并且插槽的数据传递给父组件
新手学习,大神勿吐槽 ,欢迎大神指点迷津

### 封装 `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、付费专栏及课程。

余额充值