将Elementui里的Table表格做成响应式并且和Pagination分页组件封装在一起(Vue实战系列)

简介: 将Elementui里的Table表格做成响应式并且和Pagination分页组件封装在一起(Vue实战系列)

在前端开发中,表格(Table)是一个常见且重要的组件,它用于展示大量结构化数据。Element UI,作为一套为开发者、设计师和产品经理准备的基于Vue 2.0的组件库,提供了功能丰富且易于使用的Table组件。本文将深入解析Element UI中的Table组件,探讨其使用方法、功能特性以及优化技巧。

一、Element UI Table组件简介

Element UI的Table组件是一个基于Vue的高性能表格组件,它支持丰富的表格操作,如排序、筛选、分页等。通过简单的配置和属性设置,开发者可以快速搭建出功能完备的表格页面。

1.1 安装与引入

在使用Element UI的Table组件之前,需要先安装并引入Element UI库。可以通过npm或yarn进行安装:

npm install element-ui --save
# 或
yarn add element-ui

然后在项目中引入Element UI库和样式:

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(ElementUI)

1.2 基本用法

Element UI的Table组件使用非常简单,只需在Vue组件的模板中声明el-table标签,并传入相应的数据即可:

<template>
  <el-table :data="tableData">
    <el-table-column prop="name" label="姓名"></el-table-column>
    <el-table-column prop="age" label="年龄"></el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: '张三', age: 20 },
        { name: '李四', age: 22 },
        { name: '王五', age: 24 },
      ],
    };
  },
};
</script>

在上面的例子中,我们创建了一个包含姓名和年龄两列的表格,并通过:data属性传入表格数据。每一列通过el-table-column组件定义,prop属性指定了该列对应数据对象的属性名,label属性则定义了表头的显示文本。

二、Table组件的功能特性

Element UI的Table组件提供了丰富的功能特性,以满足不同场景下的需求。

2.1 排序

Table组件支持对表格数据进行排序。只需在el-table-column组件上添加sortable属性,即可开启该列的排序功能:

<el-table-column prop="age" label="年龄" sortable></el-table-column>

2.2 筛选

除了排序,Table组件还支持对表格数据进行筛选。可以通过在el-table-column组件上添加filtersfilter-method属性来实现自定义筛选:

<el-table-column
  prop="age"
  label="年龄"
  :filters="[{ text: '20-25', value: [20, 25] }, { text: '25-30', value: [25, 30] }]"
  filter-method="filterAge"
></el-table-column>

在上面的例子中,我们定义了两个筛选条件:“20-25”和“25-30”。filter-method属性指定了筛选方法,该方法会在筛选时调用,传入两个参数:筛选值和当前行的数据,返回一个布尔值表示该行是否满足筛选条件。

2.3 分页

当表格数据量较大时,通常需要使用分页功能来展示数据。Element UI提供了el-pagination组件来实现分页功能。可以将其与Table组件结合使用,通过监听分页组件的current-change事件来更新Table组件的数据源。


2.4 行操作

Table组件还支持对表格行进行操作,如点击行、选中行等。可以通过在el-table组件上添加@row-click@select等事件监听来实现行操作的功能。

三、Table组件的优化技巧

在使用Table组件时,可能会遇到一些性能问题,尤其是在处理大量数据时。下面介绍一些优化技巧,以提高Table组件的性能。

3.1 虚拟滚动

当表格数据量非常大时,一次性渲染所有数据可能会导致页面卡顿。此时可以使用虚拟滚动技术来优化性能。Element UI的Table组件本身不直接支持虚拟滚动,但可以通过结合第三方库(如vue-virtual-scroller)来实现。

3.2 懒加载数据

另一种优化技巧是懒加载数据。即只在用户需要时才加载数据,而不是一次性加载所有数据。可以通过监听分页组件的current-change事件来实现懒加载功能。

3.3 减少不必要的渲染

在Vue中,使用v-if可以控制组件的渲染。当表格中的某些列不是始终需要显示时,可以使用v-if来控制其渲染,以减少不必要的性能开销。

四、封装Table和Pagination分页组件

一、模版部分:

1. 当窗口大小发生变化时,表格的高度也发生变化,让内容始终充满全屏,这个是我自己的喜好 :height=“screen.height - tableHeightY” 组件el-table上的这个属性就代表这个意思。
2. v-loading=“loading” 表示当数据变化时,出现loading效果。
<template>
  <div>
    <el-table
        :data="tableData"
        :height="screen.height - tableHeightY"
        style="width: 100%"
        v-bind="$attrs"
        v-loading="loading"
    >
      <slot></slot>
    </el-table>
    <div class="fenye">
      <el-pagination
          background
          @current-change="handleCurrentChange"
          :current-page="currentPage"
          :page-sizes="[15, 20, 30,40]"
          :page-size="pageSize"
          layout="total, prev, pager, next, jumper"
          :total="total"
      >
      </el-pagination>
    </div>
  </div>
</template>

需要的状态:

  props: {
    //table高度差
    tableHeightY: {
      type: Number,
      default: 0,
    },
    //数据
    tableData: {
      required: true
    },
    //当前页
    currentPage: {
      required: true,
      type: Number,
      default: 1,
    },
    //总数
    total: {
      required: true,
      type: Number,
      default: 0,
    },
    pageSize: {
      type: Number,
      default: 20,
    },

  },
  data() {
    //这里存放数据
    return {
      //窗口大小
      screen: {
        height: window.innerHeight,
        width: window.innerWidth,
      },
      loading: true,
    }
  },

当窗口变化时给screen赋值,使得table高度响应式变化;之前我是在app的最外层监听窗口变化,在需要的地方注入就可以。考虑到我们要做一个单组件,就不去依赖过多的没必要的东西了。

mounted() {//生命周期 - 挂载完成(可以访问DOM元素)
    window.onresize = () => {
      return (() => {
        this.screen.height = window.innerHeight;
        this.screen.width = window.innerWidth;
      })();
    };
  },

监听table中数据的变化,数据变了,加载动画就结束

watch: {
    // whenever question changes, this function will run
    tableData(newData, oldData) {
      this.loading = false;
    }
  },

暴露一个当前页改变时的事件

handleCurrentChange(val) {
      console.log(`当前页: ${val}`);
      this.loading = true;
      this.$emit("currentChange", val)
    },

好了,大功告成,如果帮助到了您,快点赞关注吧!

相关文章
|
9月前
|
人工智能 自然语言处理 JavaScript
通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
通义灵码基于自然语言需求,快速生成完整Vue组件。例如,用Vue 2和JavaScript实现贪吃蛇游戏:包含键盘控制、得分系统、游戏结束判定与Canvas动态渲染。AI生成的代码符合规范,支持响应式数据与事件监听,还能进阶优化(如增加启停按钮、速度随分数提升)。传统需1小时的工作量,使用通义灵码仅10分钟完成,大幅提升开发效率。操作简单:安装插件、输入需求、运行项目即可实现功能。
465 4
 通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
|
8月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
597 17
|
9月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
868 17
|
10月前
|
存储 JavaScript 前端开发
基于 ant-design-vue 和 Vue 3 封装的功能强大的表格组件
VTable 是一个基于 ant-design-vue 和 Vue 3 的多功能表格组件,支持列自定义、排序、本地化存储、行选择等功能。它继承了 Ant-Design-Vue Table 的所有特性并加以扩展,提供开箱即用的高性能体验。示例包括基础表格、可选择表格和自定义列渲染等。
872 6
|
11月前
|
JavaScript 前端开发 UED
vue2和vue3的响应式原理有何不同?
大家好,我是V哥。本文详细对比了Vue 2与Vue 3的响应式原理:Vue 2基于`Object.defineProperty()`,适合小型项目但存在性能瓶颈;Vue 3采用`Proxy`,大幅优化初始化、更新性能及内存占用,更高效稳定。此外,我建议前端开发者关注鸿蒙趋势,2025年将是国产化替代关键期,推荐《鸿蒙 HarmonyOS 开发之路》卷1助你入行。老项目用Vue 2?不妨升级到Vue 3,提升用户体验!关注V哥爱编程,全栈开发轻松上手。
757 2
|
缓存 JavaScript UED
优化Vue的响应式性能
【10月更文挑战第13天】优化 Vue 的响应式性能是一个持续的过程,需要不断地探索和实践,以适应不断变化的应用需求和性能挑战。
295 57
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
193 18
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
409 17
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。