封装el-table核心代码

问题背景

封装el-tabletable的时候有时候忘记语法了,然后问ai或者百度又出来一堆不太正确的回答,作此记录。

1.封装好的table组件完整代码(基础版)

<template>
  <div>
    <el-table
      :data="tableData"
      :height="height"
      style="width: 100%"
      header-cell-class-name="my_headercell_class"
      cell-class-name="my_cell_class"
    >
      <el-table-column
        v-for="(column, index1) in tableHeaderList"
        :prop="column.prop"
        :label="column.label"
        :type="column.type"
        :width="column.width"
        :key="index1"
      >
        <template slot-scope="{row,$index}">
          <!-- 在这里使用 scope.row 和 scope.column 来访问行数据和列配置 -->
          <div
            class="item"
            v-if="!column.slot"
          >
            <!-- {{ column.render ? column.render(row) : row[column.prop] || '--' }} -->
            {{ column.render ? column.render(row) : getNestedProperty(row, column.prop)}}
          </div>
          <slot
            :name="column.slot"
            :row="row"
            :index="$index"
          ></slot>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
import _ from 'lodash'
export default {
  props: {
    tableData: {
      type: Array,
      default: () => []
    },
    tableHeaderList: {
      type: Array,
      default: () => []
    },
    height: {
      type: String
    }
  },
  methods: {
    // 在 methods 中使用 _.get 来替代 getNestedProperty
    getNestedProperty(object, path) {
      return _.get(object, path, '')
    }
  }
}
</script>

<style lang="less">
.my_cell_class{
    .cell{
        overflow: visible !important;
        padding-left: 0;
    }
}
.my_headercell_class{
  .cell{
        padding-left: 0;
    }
}
</style>

2.使用

只需要传入tableHeaderList和tableData即可

<template>
  <div class="home">
    <Table :tableData="tableData" :tableHeaderList="tableHeaderList">
      <template slot="rank" slot-scope="{index}">
        <div class="rank_top_box">
          <span class="rank_number">
            {{ index + 1 }}
          </span>
          <div class="top_bg" :class="'top_bg' + index" v-if="index < 3">
            <img class="top_img" :src="require(`@/assets/mass/top_${index + 1}.png`)" alt="">
          </div>
        </div>
      </template>
    </Table>
  </div>
</template>

<script>
// @ is an alias to /src
import Table from '@/components/Table.vue';
import tableData from './tabledata'

export default {
  name: 'HomeView',
  computed: {
  },
  data() {
    return {
      tableHeaderList: [
        {
          prop: 'rank',
          label: '账号调用排行(TOP10)',
          slot: 'rank',
        },
        {
          prop: 'name',
          label: '账号名称',
        },
        {
          prop: 'apikey_count',
          label: '密钥数',
        },
        {
          prop: 'tenant.name',
          label: '所属租户',
        },
        {
          prop: 'project_count',
          label: '分配项目数',
        },
        {
          prop: 'req_count',
          label: '调用次数',
          render: (item) => {
            return item.req_count.toLocaleString()
          }
        }
      ],
      tableData: tableData,
    }
  },
  created() {
  },
  methods: {
  },
  components: {
    Table
  }
};
</script>
<style lang="less" scoped>
.home {
  .rank_top_box {
    width: 100%;
    height: 100%;
    overflow: visible;
    position: relative;
    text-align: center;

    .rank_number {
      text-align: center;
    }

    .top_bg {
      position: absolute;
      top: 0;
      left: 0;
      width: 160px;
      height: 48px;
      top: -11px;

      .top_img {
        width: 28px;
        height: 40px;
        position: absolute;
        top: 50%;
        left: 0;
        margin-top: -20px;
      }
    }

    .top_bg0 {
      background: linear-gradient(90deg, rgba(255, 59, 59, 0.35) 0%, rgba(255, 59, 59, 0) 100%);
    }

    .top_bg1 {
      background: linear-gradient(90deg, rgba(255, 140, 59, 0.35) 0%, rgba(255, 183, 59, 0) 100%);
    }

    .top_bg2 {
      background: linear-gradient(90deg, rgba(255, 216, 59, 0.35) 0%, rgba(255, 245, 59, 0) 100%);
    }
  }
}
</style>

效果
image.png

3.核心代码:

<el-table-column
  v-for="(column, index1) in tableHeaderList"
  :prop="column.prop"
  :label="column.label"
  :type="column.type"
  :width="column.width"
  :key="index1"
>
  <template slot-scope="{row,$index}">
    <!-- 在这里使用 scope.row 和 scope.column 来访问行数据和列配置 -->
    <div
      class="item"
      v-if="!column.slot"
    >
      <!-- {{ column.render ? column.render(row) : row[column.prop] || '--' }} -->
      {{ column.render ? column.render(row) : getNestedProperty(row, column.prop)}}
    </div>
    <slot
      :name="column.slot"
      :row="row"
      :index="$index"
    ></slot>
  </template>
</el-table-column>

4.核心解析:

1.一定要在el-table-column中去遍历传进来的tableHeaderList,不要在el-table-column外层加一个div来遍历。
2.最重要的重点是,区分slot,如果外面不需要使用slot,则直接展示值,先要去判断有没有render函数(因为数据可能要经过处理才能展示在table上),如果有render函数,则展示render函数的返回值,
3. 如果没有render函数,那么就使用getNestedProperty来解析深层次的对象(比如我要展示租户,需要取得值是tenant对象下面name的属性值,所以用到这个方法来解析)
4.如果不需要slot,则使用作用域插槽来将数据传递回父组件,让父组件中的插槽进行使用

5.结语

这里仅仅只是写了一个最简单的封装,主要是把封装的核心代码分享出来的,其他的需要什么配置可以自己加哈

6.代码地址

github地址: https://github.com/rui-rui-an/packageTable

### 回答1: Vue3中封装el-table可以通过以下步骤进行: 1. 首先,我们需要创建一个自定义组件,可以命名为MyTable。 2. 在MyTable组件中,我们需要导入el-tableel-table-column组件,可以使用import语句进行导入。 3. 在template标签中,我们可以使用el-table来渲染表格。可以设置属性如:data、border、stripe等。 4. 在el-table标签内部,我们可以使用el-table-column来定义表格的列。可以设置属性如:prop(对应数据源)、label(列名)、width(列宽)等。 5. 在script标签中,我们需要定义MyTable组件的props,用于接收父组件传递的数据。 6. 在script标签中,我们可以定义一些方法或者计算属性,用于处理表格的点击事件、排序、筛选等。 7. 最后,我们需要在父组件中使用MyTable组件,并传递数据和配置选项给MyTable组件的props,来渲染自定义的表格。 总结一下,Vue3中封装el-table的关键步骤包括创建自定义组件、导入el-tableel-table-column组件、在MyTable组件中使用el-tableel-table-column来渲染表格、定义props、定义方法和计算属性以及在父组件中使用MyTable组件。通过封装el-table,我们可以更好地复用和管理表格组件,并实现更灵活的表格功能。 ### 回答2: Vue3是一个用于构建用户界面的渐进式JavaScript框架。它具有轻量级、高效、易用的特点,并且在Vue3中可以灵活地封装el-table。 首先,为了封装el-table,我们可以创建一个自定义组件,命名为TableWrapper。在TableWrapper组件的模板中使用el-table,并将el-table的相关属性、事件和插槽通过props进行传递和接收。 在TableWrapper组件的props中,我们可以定义例如data、columns、pagination等与el-table相关的属性。这样,我们就可以通过在使用TableWrapper组件时传递这些属性来配置el-table的行为。 另外,我们还可以在TableWrapper组件中定义一些需要自定义的功能,例如表格的样式、表头的固定、排序功能等。这些功能可以通过在TableWrapper组件中添加相关的方法和事件来实现。 除了属性和方法外,我们还可以使用插槽在TableWrapper组件中自定义表格的各个部分,例如表头、表尾、表格内容等。通过在TableWrapper组件的模板中使用<slot>元素,并在使用TableWrapper组件时传递相应的内容,可以方便地自定义el-table的外观和布局。 总之,通过将el-table封装到自定义组件TableWrapper中,我们可以更好地控制和定制el-table的行为和外观。这样,我们就能够根据实际需要快速构建出符合需求的数据表格。 ### 回答3: Vue3中封装el-table的步骤如下: 1. 首先,创建一个名为el-table-wrapper的组件,该组件用于封装el-table。 2. 在el-table-wrapper组件中,引入el-table组件,并在模板中使用el-table进行数据展示。 3. 在el-table-wrapper组件中,接收名为data的props属性,用于传递表格数据。 4. 在el-table-wrapper组件中,通过v-for指令遍历data数据,并使用el-table-column组件进行表格列的定义。 5. 在el-table-wrapper组件中,使用slot插槽来支持自定义表格内容,例如添加操作按钮等。 6. 在el-table-wrapper组件中,可以设置一些其他属性,如border、stripe等,以适应不同的需求。 7. 在el-table-wrapper组件中,可以使用事件监听器来捕获el-table的一些事件,例如选择行、排序等。 8. 在el-table-wrapper组件中,通过emit方法触发自定义事件,以便在父组件中处理表格的交互逻辑。 总结:在Vue3中封装el-table,需要通过创建一个包装组件,在其中引入el-table组件并定义相应的列和属性,同时支持自定义内容和事件。这样可以提高代码的复用性和可维护性,方便在不同的项目中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值