基于Vue+element-ui 的Table二次封装的实现

基于Vue+element-ui 的Table二次封装的实现的攻略如下:

1. 概述

在使用Vue+element-ui进行前端开发时,经常会使用element-ui中的Table组件进行表格展示。但是,由于项目需求和个性化设计的不同,可能需要对Table组件进行二次封装。本攻略主要讲解如何基于Vue+element-ui进行Table二次封装。

2. Table二次封装的实现

Table二次封装主要分为以下步骤:

步骤一:创建Table封装组件

首先,需要在Vue工程中创建Table封装组件,在组件中引入element-ui Table组件,并进行相关配置。代码示例:

<template>
  <el-table
    :data="tableData"
    :width="tableWidth"
    :max-height="pageHeight"
    :border="border"
    :fit="fit"
    :stripe="stripe"
    :highlight-current-row="highlightCurrentRow"
    :row-class-name="rowClassName"
    :tooltip-effect="tooltipEffect"
    @sort-change="sortChange"
    @current-change="currentChange"
    @select="select"
    @select-all="selectAll">
    <!-- 列头 -->
    <el-table-column
      v-for="column in columns"
      :key="column.prop"
      :prop="column.prop"
      :label="column.label"
      :width="column.width"
      :min-width="column.minWidth"
      :fixed="column.fixed"
      :resizable="column.resizable"
      :formatter="column.formatter"
      :sortable="column.sortable"
      :sort-method="column.sortMethod"
      :sort-by="column.sortBy"
      :sort-orders="column.sortOrders"
      :show-overflow-tooltip="column.showOverflowTooltip"
      :align="column.align"
      :header-align="column.headerAlign"
      :class-name="column.className"
      :label-class-name="column.labelClassName"
      :selectable="column.selectable"
      v-if="!column.hidden"
    >
      <!-- 插槽 -->
      <template v-for="slot in Object.keys(column.slots)">
        <template v-slot:[slot]="{row}">
          <slot :name="slot" :row="row"></slot>
        </template>
      </template>

      <!-- 默认插槽 -->
      <template v-if="!column.slots.default">
        {{ column.prop }}
      </template>

      <!-- 隐藏列 -->
      <template v-if="column.hidden">
        <el-table-column
          :key="`hidden_${column.prop}`"
          :prop="column.prop"
          :label="column.label"
          :class-name="column.className"
          :label-class-name="column.labelClassName"
          :selectable="column.selectable"
          :show-overflow-tooltip="column.showOverflowTooltip"
          :formatter="(row) => ''"
          :sortable="false"
          :sort-by="column.sortBy"
          :sort-orders="column.sortOrders"
          :width="0"
          :min-width="0"
          :fixed="column.fixed"
          :resizable="column.resizable"
          :align="column.align"
          :header-align="column.headerAlign"
        ></el-table-column>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  name: 'MyTable',
  props: {
    // 表格数据
    tableData: {
      type: Array,
      required: true
    },
    // 表格列配置
    columns: {
      type: Array,
      required: true
    },
    // 表格宽度
    tableWidth: {
      type: String,
      default: '100%'
    },
    // 分页高度
    pageHeight: {
      type: String,
      default: ''
    },
    // 是否显示边框
    border: {
      type: Boolean,
      default: true
    },
    // 是否宽度适应容器
    fit: {
      type: Boolean,
      default: true
    },
    // 是否交替显示背景色
    stripe: {
      type: Boolean,
      default: true
    },
    // 是否高亮选中行
    highlightCurrentRow: {
      type: Boolean,
      default: true
    },
    // 行的自定义类名
    rowClassName: {
      type: [String, Function],
      default: ''
    },
    // tooltip的打开方式
    tooltipEffect: {
      type: String,
      default: 'dark'
    }
  },
  methods: {
    // 回调函数:列排序改变时触发
    sortChange({ column, prop, order }) {
      console.log(column, prop, order);
    },
    // 回调函数:当前行发生变化时触发
    currentChange(currentRow, oldCurrentRow) {
      console.log(currentRow, oldCurrentRow);
    },
    // 回调函数:选中行时触发
    select(selection, row) {
      console.log(selection, row);
    },
    // 回调函数:全选时触发
    selectAll(selection) {
      console.log(selection);
    }
  }
}
</script>

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

步骤二:根据需求进行封装

在创建好Table封装组件后,根据项目需求进行封装。主要包括以下步骤:

  1. 封装分页组件;
  2. 封装表格查询组件,进行数据过滤;
  3. 封装自定义列组件;
  4. 封装表头固定组件;
  5. 封装表格编辑组件。
  6. 插入slot以实现自定义需求

以上步骤可以根据实际需要进行选择,也可以根据需求进行自定义封装。

步骤三:引入封装的Table组件

在需要使用封装的Table组件的地方,通过import引入自定义的Table组件即可。代码示例:

<template>
  <div>
    <my-table
      :table-data="tableData"
      :columns="columns"
      :table-width="tableWidth"
      :page-height="pageHeight"
      :border="border"
      :fit="fit"
      :stripe="stripe"
      :highlight-current-row="highlightCurrentRow"
      :row-class-name="rowClassName"
      :tooltip-effect="tooltipEffect"
      @sort-change="sortChange"
      @current-change="currentChange"
      @select="select"
      @select-all="selectAll">
    </my-table>
  </div>
</template>

<script>
import MyTable from '@/components/MyTable.vue'

export default {
  components: {
    MyTable
  },
  data() {
    return {
      tableData: [],
      columns: [
        {
          label: '姓名',
          prop: 'name'
        },
        {
          label: '年龄',
          prop: 'age'
        }
      ],
      tableWidth: '100%',
      pageHeight: '',
      border: true,
      fit: true,
      stripe: true,
      highlightCurrentRow: true,
      rowClassName: '',
      tooltipEffect: 'dark'
    }
  },
  methods: {
    sortChange({ column, prop, order }) {
      console.log(column, prop, order);
    },
    currentChange(currentRow, oldCurrentRow) {
      console.log(currentRow, oldCurrentRow);
    },
    select(selection, row) {
      console.log(selection, row);
    },
    selectAll(selection) {
      console.log(selection);
    }
  }
}
</script>

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

3. 示例说明

示例一:Table组件实现分页功能

在二次封装中,新增了分页组件,在Table组件中通过引入el-pagination组件实现分页功能。代码示例:

<template>
  <div>
    <el-pagination
      :background="background"
      :page-size="pageSize"
      :page-sizes="pageSizes"
      :total="total"
      @current-change="_currentChange"
      @size-change="_sizeChange"
      layout="total, sizes, prev, pager, next, jumper"
    />
  </div>
</template>

<script>
export default {
  name: 'MyPagination',
  props: {
    // 是否有背景颜色
    background: {
      type: Boolean,
      default: true
    },
    // 当前页码
    currentPage: {
      type: Number,
      required: true
    },
    // 每页展示条数
    pageSize: {
      type: Number,
      default: 10
    },
    // 每页展示条数选择器
    pageSizes: {
      type: Array,
      default() {
        return [10, 20, 50, 100];
      }
    },
    // 数据总条数
    total: {
      type: Number,
      default: 0
    }
  },
  methods: {
    // 回调函数:当前页码发生变化时触发
    _currentChange(currentPage) {
      this.$emit('current-change', currentPage);
    },
    // 回调函数:每页展示条数发生变化时触发
    _sizeChange(pageSize) {
      this.$emit('size-change', pageSize);
    }
  }
}
</script>

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

示例二:Table组件实现自定义列功能

在二次封装中,新增了自定义列组件,在Table组件中通过引入可编辑列插件table-editor,实现自定义列功能。代码示例:

<template>
  <div>
    <el-dropdown @command="handleCommand">
      <span class="el-dropdown-link">
        <i class="el-icon-setting"></i>
      </span>
      <el-dropdown-menu slot="dropdown">
        <el-dropdown-item v-for="column in allColumns" :key="column.prop" :command="column.prop" :disabled="column.required">
          {{ column.label }}
          <i class="el-icon-check" v-if="column.required"></i>
        </el-dropdown-item>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
export default {
  name: 'MyColumnCustomize',
  props: {
    // 默认列配置
    defaultColumns: {
      type: Array,
      required: true
    },
    // 可选列配置
    allColumns: {
      type: Array,
      required: true
    }
  },
  methods: {
    // 回调函数:选择自定义列时触发
    handleCommand(command) {
      this.$emit('change-columns', command);
    }
  }
}
</script>

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

以上是基于Vue+element-ui的Table二次封装的实现的攻略,通过封装Table组件,可以更加灵活方便地满足项目需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Vue+element-ui 的Table二次封装的实现 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • .net MVC中使用forms验证详解

    .NET MVC中使用Forms验证详解 在.NET MVC中,Forms验证是一种用于验证用户输入的强大工具。它可以帮助我们确保用户提交的数据符合我们的要求,并提供友好的错误提示。本攻略将详细介绍如何在.NET MVC中使用Forms验证。 步骤1:配置验证规则 首先,我们需要在模型中定义验证规则。我们可以使用数据注解来实现这一点。以下是一个示例模型类: …

    other 2023年8月3日
    00
  • Cisco(思科)交换机初始化配置操作方法案例分析

    Cisco交换机初始化配置操作方法案例分析 简介 本文将介绍Cisco交换机的初始化配置操作方法,为初次接触Cisco设备的用户提供指导。以下是整个操作过程的完整步骤: 确认配置 进入用户模式 进入特权模式 配置全局参数 配置端口 保存配置并退出 步骤说明 1. 确认配置 在配置前,请务必确认收集以下信息: 设备型号 确认开启SSH服务 确认管理接口IP地址…

    other 2023年6月20日
    00
  • Python数据结构之循环链表详解

    Python数据结构之循环链表详解 1. 循环链表概述 在计算机科学中,循环链表是一种链式数据结构,其中的尾元素指向头部元素,形成一个环形结构。循环链表可以解决带头节点的单链表在链表尾部插入和删除结点时时间复杂度为O(n)的问题,使得操作的时间复杂度为O(1)。 2. 循环链表的实现 2.1 循环链表的结点 类似于单链表,循环链表也是由结点构成的,结点中至少…

    other 2023年6月27日
    00
  • 深入了解Spring的Bean生命周期

    Spring的Bean生命周期主要分为以下5个阶段: 实例化Bean:Spring容器创建Bean的实例,通过Java的反射机制实现对象的创建。 设置Bean属性值:Spring容器通过Spring配置文件或注解设置Bean的属性值。 调用Bean的初始化方法:Spring容器调用Bean的初始化方法,初始化方法可以通过注解方式和配置文件方式进行声明。 Be…

    other 2023年6月27日
    00
  • 华为p30pro开发人员选项如何关闭?华为p30pro关闭开发人员选项的方法

    华为P30 Pro是一款非常出色的手机,具有丰富的功能和优秀的性能。在使用过程中,开发人员选项可能不是每个用户都需要的,因此关闭开发人员选项可以让界面更加简洁和易于使用。 下面是关闭华为P30 Pro开发人员选项的完整攻略,包括具体步骤和示例说明。 第一步:打开设置应用 首先打开手机的主屏幕,点击“设置”应用。如果您无法在主屏幕上找到“设置”,可以从应用列表…

    other 2023年6月28日
    00
  • win7系统重启后ip地址丢失怎么办 win7电脑重启后ip地址丢失不能上网的解决方法

    解决win7系统重启后ip地址丢失不能上网的方法 在使用Windows 7电脑上网时,有时会遇到重启电脑后IP地址丢失的情况,导致无法上网,这时我们需要重新设置IP地址才能继续上网。下面就是具体的解决方法: 步骤一:检查网络适配器设置 右键点击桌面左下角的“开始”菜单,选择“设备管理器”打开设备管理器窗口,找到“网络适配器”选项,展开并找到自己的网卡,右键点…

    other 2023年6月27日
    00
  • Android应用程序签名步骤及相关知识介绍

    下面我将为你讲解一下“Android应用程序签名步骤及相关知识介绍”的完整攻略。内容如下: 什么是Android应用程序签名 在Android中,每个应用程序都必须经过签名才能在手机上安装和运行。签名的目的是确保应用程序是由合法的开发者构建的,并且没有被篡改。 Android应用程序签名步骤 Android应用程序签名的步骤如下: 生成私钥 在签名应用程序之…

    other 2023年6月25日
    00
  • Android实现RecyclerView嵌套流式布局的详细过程

    Android实现RecyclerView嵌套流式布局的详细过程 在Android中,要实现RecyclerView嵌套流式布局,可以使用以下步骤: 步骤一:添加依赖 首先,在项目的build.gradle文件中添加以下依赖: implementation ‘com.google.android.material:material:1.4.0’ implem…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部