iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Element怎么实现动态表格
  • 922
分享到

Element怎么实现动态表格

2023-06-20 19:06:40 922人浏览 薄情痞子
摘要

本篇内容介绍了“Element怎么实现动态表格”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录【代码背景】【代码实现】#1# ->

本篇内容介绍了“Element怎么实现动态表格”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 【代码背景】

  • 【代码实现】

    • #1# -> 代码复用的基础是你需要一个可复用的组件

    • #2# -> 在展示页面使用动态表格组件

    • #3# -> 如何给动态表格根据需求动态添加序号列/索引

【代码背景】

有这样一个业务需求场景,有大概十几张表归属于某个类别,用户希望在同一个页面,通过选择不同的查询指标展示不同的表格,这些表的表头样式类似但是又不完全相同,怎么做呢?

到目前为止所有基于Element UI的表格样式都是直接在页面写死的,像官方这样:

<el-table :data="tableData" >    <el-table-column prop="date" label="日期" width="180"></el-table-column>    <el-table-column prop="name" label="姓名" width="180"></el-table-column>    <el-table-column prop="address" label="地址"></el-table-column></el-table>

要解决上述问题,最简单暴力的方式是为每个表写一个单独组件,然后通过select框触发事件切换不同组件路由渲染页面,当然这种方式很笨,也不符合代码复用的基本原则,所以为了偷懒,为了坚守代码复用的基本原则,开始思考有没有更好的方式来解决这个问题。

仔细观察这个<el-table>,表格数据是通过:data绑定的,表格头部数据则是通过<el-table-column>标签展示的,表头数据是不是也可以通过某种传参的方式结合v-for来渲染<el-table-column>的具体数据呢?在度娘的帮助下,果然有大佬已经这样做了,实现了动态表格,参考链接挂在最底下了哦,在此特别感谢免费分享知识的大佬们,知识无价,学无止境。

现将本项目的具体实现代码记录如下,完善了一些代码的注解,尝试帮助理解。

【代码实现】

#1# -> 代码复用的基础是你需要一个可复用的组件

在/components/Table文件夹下新建两个组件

DynamicTable.Vue

<template>  <!-- 动态展示表格 -->  <el-table :data="tableData" border stripe :height="height" @row-click="handleRowClick">    <!-- v-for 循环取表头数据 -->    <template v-for="item in tableHeader">      <table-column v-if="item.children && item.children.length" :key="item.id" :column-header="item" />      <el-table-column v-else :key="item.id" :label="item.label" :prop="item.prop" align="center" />    </template>  </el-table></template>
<script>  import TableColumn from '@/components/Table/TableColumn'   export default {    name: 'DynamicTable',    components: {      TableColumn    },    props: {      // 表格的数据      tableData: {        type: Array,        required: true      },      // 多级表头的数据      tableHeader: {        type: Array,        required: true      },      // 表格的高度      height: {        type: String,        default: '300'      }    },    methods: {      // 行点击事件      handleRowClick (row, column, event) {        // console.log(row)        // console.log(column)        // console.log(event)        // 通知调用父组件的row-click事件        // row作为参数传递过去        this.$emit('row-click', row)      }    }  }</script>

TableColumn.vue

<template>  <el-table-column    :label="columnHeader.label"    :prop="columnHeader.label"    align="center"  >    <!--columnHeader对应:column-header-->    <template v-for="item in columnHeader.children">      <tableColumn        v-if="item.children && item.children.length"        :key="item.id"        :column-header="item"      />      <el-table-column        v-else        :key="item.name"        :label="item.label"        :prop="item.prop"        align="center"      />    </template>  </el-table-column></template> <script>  export default {    name: 'TableColumn',    props: {      columnHeader: {        type: Object,        required: true      }    }  }</script> <style scoped> </style>

几点重要说明:

(1)表格头部的传参主要分为两类:带children节点和不带children节点的,如下图所示

Element怎么实现动态表格

请注意children节点是为了完成复杂表头的渲染,例如上面这个示例最终的表头渲染样式如下:

Element怎么实现动态表格

那么问题来了,<el-table-column>是<el-table>的标签,那这个<table-column>是个啥?

(2)DynamicTable.vue调用TableColumn.vue组件

Element怎么实现动态表格

DynamicTable.vue通过:column-header给TableColumn.vue传递带children子节点的表头信息,TableColumn.vue接收到这个节点信息后,主要做了以下两件事情:

第一:通过<el-table-column>渲染了一个label标签

第二:继续判断该节点是否存在children子节点

=> 如果存在children节点,继续通过<table-column>进行渲染,继续把这个子节点传给TableColumn.vue组件,重复上述步骤

=> 如果不存在children节点,表示这是一个终止节点,通过<el-table-column>渲染结束

#2# -> 在展示页面使用动态表格组件

<template>  <div class="demo">    <el-card>      <!--查询区域-->      <el-row :gutter="10">        <el-col :span="6">          <div class="grid-content bg-purple">            <span >选择框 -</span>            <el-select              v-model="specified_table"              placeholder="请选择"            >              <el-option                v-for="item in options"                :key="item.zb_code"                :label="item.zb_name"                :value="item.zb_code"              />            </el-select>          </div>        </el-col>        <el-col :span="6">          <div class="grid-content bg-purple">            <el-button type="primary" plain @click="handleQueryClick">查 询</el-button>          </div>        </el-col>      </el-row>      <!--表格区域-->      <dynamic-table        v-if="dynamicTableShow"        :table-data="tableData"        :table-header="tableHeaders"        :height="'550px'"      />    </el-card>  </div></template>
<script>  // 引入组件  import DynamicTable from '@/components/Table/DynamicTable'  // 获取表头信息  import { getTableHeader02_1, getTableHeader02_2, getTableHeader02_3, getTableHeader02_4 } from '@/api/table-header'   export default {    name: 'Index',    components: { // 组件注册      DynamicTable    },    data () {      return {        // -- 查询 ----------------------        options: [          // { zb_name: '指标名', zb_code: '指标代码' }        ],        specified_table: '', // 指标值        // -- 表格 ----------------------        dynamicTableShow: true, // DynamicTable组件重新渲染变量        // 表头数据        tableHeaders: [],        // 表格数据        tableData: []      }    },    created () {      // api-获取指标的下拉框数据      getSpecifiedTable().then(res => {        this.options = res.data      })    },    methods: {      // 判断值是否在数组中      isExistArr (arr, val) {        return arr.includes(val)      },      // 重新渲染表格      refreshTable (zb_code) {        // 根据value值获取label值        const obj = this.options.find((item) => {          return item.zb_code === zb_code        })        console.log(zb_code)        console.log(obj.zb_name)        // 设置dynamicTableShow为false,使得DynamicTable组件重新渲染        this.dynamicTableShow = false        // 根据不同指标渲染不同的表头        const TBArr01 = ['M01', 'M02', 'M03', 'M05'] // 第1类表        const TBArr02 = ['M04', 'M07', 'M08', 'M12'] // 第2类表        const TBArr03 = ['M09', 'M10', 'M11'] // 第3类表        const TBArr04 = ['M06'] // 第4类表        if (this.isExistArr(TBArr01, zb_code)) {          this.tableHeaders = getTableHeader02_1(obj.zb_name) // 渲染表头样式1        }        if (this.isExistArr(TBArr02, zb_code)) {          this.tableHeaders = getTableHeader02_2(obj.zb_name) // 渲染表头样式2        }        if (this.isExistArr(TBArr03, zb_code)) {          this.tableHeaders = getTableHeader02_3(obj.zb_name) // 渲染表头样式3        }        if (this.isExistArr(TBArr04, zb_code)) {          this.tableHeaders = getTableHeader02_4(obj.zb_name) // 渲染表头样式4        }        // api - 获取表格数据        getTableList02(zb_code).then(res => {          this.tableData = res.data        })        // 此处是DOM还没有更新,此处的代码是必须的        this.$nextTick(() => {          // DOM现在更新了          this.dynamicTableShow = true        })      },      // 点击[查询]事件      handleQueryClick () {        const zb_code = this.specified_table        // 校验查询条件不能为空        if (zb_code === '' || zb_code === undefined) {          this.$message.warning('指标不能为空!')        } else {          console.log('zb_code: ' + zb_code)          // 重新渲染表头和表格          this.refreshTable(zb_code)        }      }    }  }</script>

使用动态表格组件相对来说比较简单,唯一需要注意的地方是,渲染表格头部跟数据时必须需要添加以下代码,不然页面无法按照预期完成渲染。

this.$nextTick(() => {    // DOM现在更新了    this.dynamicTableShow = true})

关于this.$nextTick()可以参考官网:https://cn.vuejs.org/v2/guide/Reactivity.html

Element怎么实现动态表格

#3# -> 如何给动态表格根据需求动态添加序号列/索引列

在Element UI官方例子中,如果需要给table添加一个序号列或者索引列非常简单,直接在<el-table>里声明一个特殊的<el-table-column>即可。

<el-table-column type="index" width="50"></el-table-column>

那如何在动态表格组件里添加序号列呢?更甚者如果根据需要自行添加或者不添加?

首先我们来改造 DynamicTable.vue

像官方例子一样,我们先在<el-table>里也声明一个<el-table-column>

<el-table-column v-if="isIndex" type="index" width="100" label="序号" align="center" />

注意到这里有一个v-if绑定了一个isIndex值,这个值就是我们需要在父组件进行传值的关键了

在props里声明isIndex为Boolean类型

 props: {      // 表格的数据      tableData: {        type: Array,        required: true      },      // 多级表头的数据      tableHeader: {        type: Array,        required: true      },      // 表格的高度      height: {        type: String,        default: '300'      },      // 是否需要添加序号列      isIndex: {        type: Boolean      }}

在展示页面使用组件时通过:is-index传入指定参数

 <dynamic-table        v-if="dynamicTableShow"        :table-data="tableData"        :table-header="tableHeaders"        :height="'550px'"        :is-index="true"/>

在同页面表头需要切换的情况下,上面这种写法容易在页面初始化时候单独显示一个序号列,就像下面这样,非常不美观

Element怎么实现动态表格

我希望序号列可以和其他普通列一样在表头渲染的时候同时加载,可以这样做

<dynamic-table        v-if="dynamicTableShow"        :table-data="tableData"        :table-header="tableHeaders"        :height="'550px'"        :is-index="isAddIndex"/>

将原本的常量“true”修改成一个变量isAddIndex替代,然后在表头渲染完成的时候将其值修改成true

 this.isAddIndex = true

这样序号列就能跟其他普通列同时进行渲染了。

“Element怎么实现动态表格”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Element怎么实现动态表格

本文链接: https://www.lsjlt.com/news/299375.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Element怎么实现动态表格
    本篇内容介绍了“Element怎么实现动态表格”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录【代码背景】【代码实现】#1# -> ...
    99+
    2023-06-20
  • Element实现动态表格的示例代码
    目录【代码背景】【代码实现】#1# -> 代码复用的基础是你需要一个可复用的组件#2# -> 在展示页面使用动态表格组件#3# -> 如何给动态表格根据需求动态添加...
    99+
    2022-11-12
  • vue element-ui动态横向统计表格的实现
    目录element-ui动态横向统计表格关于element-ui表格问题表格图片显示问题表格中多出一条线element-ui动态横向统计表格 表格结构 <el-table ...
    99+
    2022-11-13
    vue element-ui 动态横向统计表格 vue element-ui 动态表格
  • JavaScript怎么实现动态表格
    JavaScript怎么实现动态表格,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript实现动态表格(改建版,代码见最下面)基本效果如下点击添加,...
    99+
    2023-06-28
  • element-ui实现表格边框的动态切换并防抖
    目录需求实现过程解决抖动抖动原因解决抖动的实现过程再优化后记固定列需求 需求是这样的: 先前的需求,要求表格按UI设计图来,表格无边框。新来的需求,要求能支持表格列宽的能够支持拖动。...
    99+
    2022-11-13
    element-ui表格 表格边框动态切换 表格边框防抖
  • element ui表格动态列显示空白bug怎么办
    这篇文章将为大家详细讲解有关element ui表格动态列显示空白bug怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在使用element ui框架进行项目开发的时...
    99+
    2022-10-19
  • qt表格动态刷新怎么实现
    要实现Qt表格的动态刷新,可以采取以下几个步骤: 创建一个QTableWidget对象,并初始化表格的行数和列数。 QTable...
    99+
    2023-10-26
    qt
  • vue中Element-ui表格怎么实现树形结构表格
    这篇文章主要为大家展示了“vue中Element-ui表格怎么实现树形结构表格”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中Element-ui表格怎么实现树形结构表格”这篇文章吧。本文...
    99+
    2023-06-15
  • JavaScript怎么实现生成动态表格和动态效果
    本篇内容介绍了“JavaScript怎么实现生成动态表格和动态效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码:<!DOCTYP...
    99+
    2023-06-29
  • element表格多级表头子列固定怎么实现
    这篇“element表格多级表头子列固定怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“element表格多级表头子列...
    99+
    2023-07-02
  • Vue+Element实现表格单元格编辑
    前言 Element的表格组件并没有给出明确的点击单个单元格进行的编辑的方案,我仔细阅读了官方的文档后,发现这个操作还是可以实现的。 实现原理 1、利用Table组件的cell-cl...
    99+
    2022-11-13
  • JavaScript实现动态表格效果
    本文实例为大家分享了JavaScript实现动态表格效果的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html lang="...
    99+
    2022-11-12
  • JavaScript实现表格动态变色
    本文实例为大家分享了JavaScript实现表格动态变色的具体代码,供大家参考,具体内容如下 表格分为:表头、表格主体 两部分 当移动到表格主体的行时,移动到哪一行,哪一行就变化颜色...
    99+
    2022-11-12
  • element表格行列的动态合并示例详解
    目录效果图代码详解数据结构行合并列合并完整代码+注释效果图 合并行 合并列 element的table提供了合并行或者列的方法,并且有一个示例,传送入口:element.elem...
    99+
    2022-11-13
  • Avue和Element-UI动态三级表头的实现
    目录Avue配置方式Element-UI三级表头动态写法需求场景: 业务方希望有表格可以体现员工的考勤信息,要具体到上午下午,统计司机上下班打卡所产生的数据。产品提出想做成三级表头根...
    99+
    2022-11-13
  • jQuery中怎么实现动态添加表格数据
    本篇文章给大家分享的是有关jQuery中怎么实现动态添加表格数据,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。关键代码(一)创建克隆单元格对象...
    99+
    2022-10-19
  • element表格去掉表头的实现方法
    文档提示用属性show-header <el-table :data="tableData1" :span-method...
    99+
    2022-11-12
  • Vue中怎么实现动态表格的排序功能
    这篇文章主要介绍“Vue中怎么实现动态表格的排序功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中怎么实现动态表格的排序功能”文章能帮助大家解决问题。首先,为了实现动态表格的排序,我们需要一...
    99+
    2023-07-06
  • element-ui中Table表格省市区合并单元格怎么实现
    这篇文章主要为大家展示了“element-ui中Table表格省市区合并单元格怎么实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“element-ui中Tab...
    99+
    2022-10-19
  • Vue基于Element-ui怎么实现表格弹窗组件
    本篇内容主要讲解“Vue基于Element-ui怎么实现表格弹窗组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue基于Element-ui怎么实现表格弹窗组件”吧!效果图使用方式acTab...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作