基于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日

相关文章

  • 深入探讨JavaScript String对象

    深入探讨JavaScript String对象 简介 JavaScript中的String对象代表一个字符串。它是一个引用类型,并提供了很多有用的方法,可以让我们在字符串上做更多的操作。 字符串长度 可以使用length属性来获取一个字符串的长度。例如: var str = "hello"; console.log(str.length)…

    other 2023年6月20日
    00
  • Dreamweaver站点中新建文件夹和修改/删除/移动文件的操作方法

    下面是详细讲解Dreamweaver站点中新建文件夹和修改、删除、移动文件的操作方法。 新建文件夹 打开Dreamweaver软件,打开你创建的站点,确保“文件”窗口处于打开状态。 在“文件”窗口中找到你要新建文件夹的目录,右键单击并选择“新建文件夹”选项。 在弹出的对话框中输入文件夹名称,并选择你的文件夹创建位置,然后单击“新建”按钮即可。 示例:假设我们…

    other 2023年6月27日
    00
  • docker-通过telnet连接到docker容器

    以下是关于“docker-通过telnet连接到docker容器”的完整攻略,包括定义、使用方法、示例说明和注意事项。 定义 Docker是一种容器化技术,可以将应用程序及其依项打包到一个可移植的容器中,以便在任何地方运行。在Docker中,可以通过telnet连接到容器,便在容器中执行命令或查看容器中的文件。 使用方法 使用telnet到Docker容器的…

    other 2023年5月8日
    00
  • 黑道圣徒4 运行游戏卡logo黑屏怎么办 解决方法

    黑道圣徒4 运行游戏卡logo黑屏怎么办 解决方法 问题描述 在运行黑道圣徒4游戏时,出现了卡logo黑屏的问题。这种情况下,游戏无法正常启动,可能会让许多玩家感到困扰。那么,要如何解决这个问题呢? 解决方法 方法一:更新显卡驱动程序 卡logo黑屏的问题通常由显卡驱动程序旧版本或损坏的引导程序导致。解决这个问题的第一个办法是更新显卡驱动程序。以下是更新显卡…

    other 2023年6月27日
    00
  • 通过实例解析python创建进程常用方法

    通过实例解析python创建进程常用方法 在Python中,我们可以使用multiprocessing模块来创建进程。下面是两个常用的方法: 1.使用Process类创建进程 Process类是multiprocessing模块里提供的进程类,使用它可以较为方便地创建进程。创建一个进程,需要执行以下步骤: 1.导入Process类 from multipro…

    other 2023年6月27日
    00
  • listview控件怎么添加数据

    以下是在C#中使用ListView控件添加数据的完整攻略,包含两个示例: 步骤1:创建ListView控件 在Visual Studio中,您可以在窗体设计器中添加控件。在工具箱中找到ListView件,然后将其拖放到您的窗体中。 步骤2:创建数据源 在C#代码中创建数据源,例如一个字符串数组“`csharpstring[] data = {“Item 1…

    other 2023年5月6日
    00
  • Linux平台安装MongoDB及使用Docker安装MongoDB

    Linux平台安装MongoDB及使用Docker安装MongoDB 简介 MongoDB 是一个 NoSQL 数据库,它的灵活性、高效性使其成为互联网数据存储和查询的首选方案。MongoDB 具有良好的数据可扩展性,支持水平和垂直扩展。本文将介绍如何在 Linux 平台上安装 MongoDB 和使用 Docker 安装 MongoDB。 在 Linux 平…

    其他 2023年3月28日
    00
  • Android Fragment 基本了解(图文介绍)

    Android Fragment 基本了解(图文介绍) 什么是 Fragment? Fragment 是一种 UI 组件,可以像 Activity 一样具有用户界面,并且可以在 Activity 中组合使用多个 Fragment 以构建复杂的用户界面。 Fragment 的使用场景 Fragment 的使用场景主要涉及以下几种情况: 在大屏幕设备(比如平板电…

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