ElementUI解决自定义表头

element-ui自定义表头;el-table自定义表头;render-header自定义表头 阅读详情

开门见山,我直接阐述我的问题的由来:

根据Element官方的Demo,使用其渲染一个表格需要以下代码:

<el-table
    :data="data"
    stripe border>
    <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>

在此,我们不讨论多级表头及各种骚操作,假设项目经理提出了一个新的需求。”不同的用户表格需要展示的列不同,不同用户可以根据自己的使用偏好自定义表格列的顺序(序号列不参与)。“

我们开始着手实现这个需求,我们提出两个实现方案:1、v-if;2、v-for;

本文主要阐述以v-for来实现这一需求,因此对于方案1的实现仅仅阐述思路。v-if仅仅可以根据权限的不同实现表格展示特定的列,单表格的顺序是没法控制的,在编码的时候就被局限了。通过保留一个JSON,为表格的每个字段分配一个布尔变量,对于每个<el-table-column /> 使用v-if,编码繁琐,使用及其不便还不能完全实现需求。

下面开始阐述v-for的实现细节:

我们首先分析<el-table-column />有几种形态。1、checkbox列;2 、序号列;3、标准列(标准列很简单,就是行数据是什么样,就展示成什么样,如上述代码所示);4、自定义显示内容列(划重点);自定义列有两类,4.1是当前列的内容由行数据的多个字段确定;4.2 当前列渲染出来的html片段需要能触发事件;4.2是整个需求里最复杂的点,因为我们在v-for的时候是没法像x写寻常的时候写如下代码:

<el-table-column label="操作">
    <template slot-scope="scope">
        <span @click="someHandler(scope.row)">Click Me!</span>
    </template>
</el-table-column>

此时,我们需要用到动态组件,先直接贴代码,随后进行解释:

html部分:

<template>
  <el-table-column
    :label="column.label"
    :prop="column.prop"
    :width="column.width"
    :min-width="column.minWidth"
    :header-align="column.align"
    :sortable="column.sortable"
    :fixed="column.fixed"
    :sort-method="column.sortMethod"
    show-overflow-tooltip
  >
    <template v-if="!column.columns" #default="{ row }">
      <a
        class="f-csp"
        v-if="column.routeHandler"
        @click="column.routeHandler(row)"
      >{{ row[column.prop] }}</a>
      <div v-else-if="column.html" v-html="column.html(row)"></div>
      <component v-else-if="column.component" :is="column.component.name" :row="row"></component>
      <div
        v-else
        :class="$ui.renderColumnClass(row, column)"
        v-html="$ui.renderColumn(row, column)"
      ></div>
    </template>
    <template v-if="column.columns">
      <base-table-column
        v-for="subColumn in column.columns"
        :key="subColumn.prop"
        :column="subColumn"
      ></base-table-column>
    </template>
  </el-table-column>
</template>

JS部分(基于TypeScript):


import { Vue, Component, Prop } from 'vue-property-decorator';
import { CustomColumn } from '@/types';
@Component({
  name: 'BaseTableColumn',
})
export default class BaseTableColumn extends Vue {
  @Prop({ type: Object, required: true }) column!: CustomColumn;
  created() {
    if (this.column.component) {
      Vue.component(this.column.component.name, {
        props: {
          row: {
            type: Object,
            required: true,
          },
        },
        render: this.column.component.render,
      });
    }
  }
}

在HTML部分有一个关键的标签是<component />,传送门

于是,我们在基础组件创建的时候,全局注册一个名为this.column.component.name的组件。Vue的组件html部分有2种形态,一种是写在单文件里面的html代码的形式。另一种是使用render函数的形式。其实最终都是转换为render形式,只不过前者需要经过vue的compile变成render函数的形式,使得我们开放上书写更简洁。render函数请参看:Here

基础组件编写完成,假设我们需要往我们的基础组件传递columns的数组,当我们在外部使用的时候对于这类列只需要编写代码如下:

[{
          label: '评分次数',
          prop: 'scoreCounter',
          width: '80',
          render: (col: any) => {
            return typeof col == 'undefined' ? '暂无评分' : col;
          },
          component: {
            name: 'RateEntry',
            render(h) {
              let row = this.$props.row;
              let empty = typeof row.scoreCounter == 'undefined' || row.scoreCounter <= 0;
              return h(
                'span',
                {
                  class: {
                    'f-csp': !empty,
                  },
                  style: {
                    color: empty ? 'black' : '#337ab7',
                    textDecoration: empty ? 'none' : 'underline',
                  },
                  on: {
                    click: (e: Event) => {
                        // do something that you want to do
                    },
                  },
                },
                empty ? '暂无评分' : row.scoreCounter,
              );
            },
          },
        },]

注意,在render函数里面的this并不是vm。

我在之前使用过iview,iview是通过配置实现表格列的展示,个人观点是它把这一过程于内部进行了隐藏。

写在最后:slot-scope 或者 scope 已经不再推荐使用,详情请看Here

【Vue+ElementUI】Table表格实现自定义表头展示+表头拖拽排序(附源码) 阅读详情

相关推荐

element-ui 自定义表头label(利用 :slot=“header“ slot-scope=“slot“)

【代码】element-ui 自定义表头label(利用 :slot=“header“ slot-scope=“slot“)

weixin_43923808的博客 1566

elementui表格自定义表头的两种方法

这篇文章总结了elementui组件自定义表头的方法,因为自己在开发中遇到了坑,就总结一下

weixin_70245286的博客 4561

基于浏览器插件的拼多多买家订单导出方法

基于浏览器插件的拼多多买家订单导出方法

2501_93542170的博客 1731

elementUI的el-table自定义表头

elementUI的el-table自定义表头,添加一个el-tooltip提示内容

程序媛的博客 3266

大厂案例:快手AI人才管理系统的架构设计与效果

凌晨两点刷简历的HR、说不清“团队离职率高”原因的业务leader、不知道“该学什么”的员工——这些人力资源场景中的“痛点”,曾是快手高速增长期的真实写照。当员工规模从几千扩张到几万,传统HR系统的“经验驱动”模式彻底失效。2021年,快手启动AI人才管理系统建设,用“数据+算法”重构招聘、培养、绩效、留存全流程。本文将拆解这套系统的架构设计逻辑核心技术实现,以及真实业务效果AI如何让HR从“事务执行者”变成“战略伙伴”?

大模型应用工坊 1712

NVIDIA NCCL 安装和测试实战教程

ibrary)是用于深度学习应用的高性能通信库,可加速多GPU通信和同步。它能够在多个GPU之间进行高效的数据传输和集体操作,显著提高了分布式GPU系统上深度学习训练和推理的性能。NVIDIA NCCL是加速多GPU系统上深度学习应用的必不可少的工具。其高效的通信原语和集体操作显著提高了分布式训练和推理的性能,使其成为现代深度学习基础架构的关键组成部分。

weixin_39818775的博客 4431

elementui 中el-table表头使用自定义下拉框,以及下拉框值无法选中问题的解决

效果:使用下拉选择框作为表头 方法,在el-table-column标签中使用template标签 问题:这样写的问题是表头确实是下拉框,但是无法选中下拉框中的值。 后面看elementui官网的写法 除了slot=“header"外还多了一个slot-scope=‘scope’ 于是我也在代码中加上 但是代码确报错了(这个要看项目的配置):原因是因为定义了scope却没有被使用 解决:将slot-scope=“scope"修改为slot-scope=”{}” 这里参考了:Vue规范中设置的’vue

lingliu0824的博客 4762

win10下Miracast无线投屏使用教程及异常解决方案(超详细)

文章目录一、什么是Miracast?二、主流的无线投屏技术有哪些特点?三、如何查看自己的win10电脑是否支持Miracast无线投屏功能?四、win10电脑如何使用Miracast无线投屏功能? 一、什么是Miracast? Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连(Wi-Fi Direct)为基础的无线显示标准。支持此标准的3C设备(如智能手机、电视、投影、电脑等...

帅气的小白的博客 44万+

elementUI table 表头合并

elementUI table 表头合并

dashenanc的博客 4581

[官方培训]07-UE材质基础 孙丹璐 Epic 笔记

勾选允许自定义深度写入再在模型上勾选然后可以通过Scene Texture节点拿到渲染的自定义深度信息,有了自定义深度信息就可以与当前渲染的像素深度进行对比,自定义深度信息存放的是最靠近我们的深度,如果当前像素离自定义深度比较远我们就不要这个像素。效果如下这种方案的缺点也很明显,因为这样看不到第二层的透明了,如果是两层的半透明的裙摆,这样就看不到第二层的裙摆了。对于半透明排序问题最根本能解决的还是光线追踪,ue5中又加入了OIT(基于像素的排序)。官方透明材质的理解和应用。

Tcohneyn的博客 1562

ORCAD 层次化原理图使用TCL获取位号的方法

orcad tcl 获取occurrence位号的方法。

m0_46675718的博客 1133

Element ui 自定义表头 数据不渲染

今天开发使用Element ui 中的table,需要自定义表头功能,将slot=“header”后,在里面写单选按钮,点击有值就是不选中,自己想了好久没找到解决办法,偶然之间百度到了,将 slot=“header” 换成 #header,完美解决,nice! ...

ITk_Programmer的博客 1077

YOLOv8改进策略【注意力机制篇】| CVPRW-2024 分层互补注意力混合层 H-RAMi 针对低质量图像的特征提取模块

许多证据表明层次化网络对图像恢复(IR)任务通常不太有效,因为IR的目标是逐个预测像素值(密集预测),而缩小特征图会丢失重要的像素级信息。然而,层次化结构有降低时间复杂度以及学习语义级和像素级特征表示的优点。为了弥补缺点并利用优点,设计了H - RAMi层。

Limiiiing的博客 378

【踩坑+实践】 ElementUI +Vue table表头添加tooltip

话不多说,直接上范例地址。 范例地址 elementui 提供了一个render-head 方法,这个我试过了,不好使,不管怎样,结构都是只显示tooltip 的边框,不显示tooltip 的背景,查了很多资料,发现elementUI还有一个方法自定义表头,自定义表头里面提到使用Scoped slot 方法来重置表头,最后,根据这个方法,解决了表头添加tootip的问题 扩展,类似的方法...

izengjing的博客 10000

H3C BGP联盟实验

bgp,bgp联盟,bgp公认团体属性,

一只懒羊羊 971

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ElementUI的Table-column_render-header自定义表头

ElementUI的Table表格,官方网站上提供了很多样式,但是在日常开发中还会碰到各种情况,显然官方提供的是不能满足需求的。那么,我们就根据自己的需求对table进行改造。 先丢出关于Table的官方文档的传送门,请戳这里→ http://element-cn.eleme.io/#/...官方对Table相关的Attributes介绍...

weixin_33936401的博客 890

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ElementUI的Table组件中的renderHeader方法研究

项目使用ElementUI,挺好用的,页面中有些地方的帮助提示通过使用组件Tooltip和el-icon-question来展示,代码如下: <div class="title">本月累计收益 <el-tooltip class="item" content="截止至昨日本月累计收益" placement="top"> <span class="el-ic...

qq_39505012的博客 6148

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

elementui表格中tip设置_ElementUI table 表头 标题 添加 悬浮提示 tooltip

我的方案:methods中添加方法renderHeader3(h, params) {// console.log('h', h)// console.log('params', params)return h('el-tooltip',{props: {transfer: true// placement: 'bottom-start'}},[h('span', params.column.la...

weixin_39619858的博客 2790

elementUI 2.0.11自定义表头

此文首发于 https://lijing0906.github.io 目前所做的项目都是后台管理系统,前端框架用的VUE,为了开发速度快,我们都会选择合适的组件库。诶!饿了么团队开发的elementUI就被我们选中啦。 用起来还是很顺手的,后台系统的基本功能都有示例代码,很方便,但是有些特殊的功能没有示例代码,只是文档中有简单的说明,这个只能去网上搜索一些大神的博客来帮忙啦。 因为所用的版本是2....

sinat_27514587的博客 312

【vue】ElementUI el-table自定义按钮控制显示隐藏列(表头加自定义按钮&隐藏列&表格刷新闪烁问题&点击按钮变色)&“暂无数据”默认提示修改

1. 表头加自定义按钮通过:render-header实现 2. 隐藏列v-if="false",动态显示隐藏给布尔值 3. 表格刷新闪烁问题,是因为el-table 重新计算表头高度,给整个el-table 加key,每次改变key的值就不会闪烁了

hanne_lovegood的博客 1万+

ElementUi 之el-table 的一点小总结[表头内容错位[自定义border问题][自定义列宽度]

前端在开发PC 端项目时,现在用的比较多的就是Element UI,而在PC端管理系统中,Table 可以说是必不可少,刚开始使用对table没有做过多的处理,可是在需要做一些处理时,对其文档不熟悉使用不熟练总出现一些意想不到的问题。 自定义table 边框及单元格边框 表格设置的border 覆盖掉自定义的border 而且只在最后一列,因为默认是灰色一直以为自己设定的没有生效 开两个效果吧 没有添加table 的 border 属性 添加table 的 border 属性之后 ,看最右侧的.

Sandy_zhi的博客 1988

element的el-table表格自定义表头解决数据不更新问题

element 官网上el-table上使用插槽 slot=“header”来实现自定义表头,在需要动态更新表头数据时,出现无法实时更新的情况,只需要将slot=“header” 改成#header ,效果就正常了。通过插槽传入表头,但是,如果我把表头初始值赋值为null,虽然可以正常显示表头,但是一开始会报错;如果我把表头初始值给列出来设计好的字段="",那么获取到后端返回的数据后,表头并不会自动更新!需要生成一个表格,表头由后端返回,自定义生成。

Vivien_CC的博客 1952

element ui表头合并(单行表头合并)

element ui表头合并 官方文档给出的表头合并,是多行表头的。就是合并的表头下面一行,还有表头。所以只用官方文档的代码,《el-table-column》嵌套《el-table-column》,不符合我的需求。 我的需求原型如下: 如果用官方介绍的,列嵌套列布局的方法,变成了这样,多出了一行表头: 按官方列嵌套列的具体代码如下: <el-table-column align="center" label="复仇者联盟电影票"> <el-table-column>

LJX888666的博客 6020

Element UI - el-table el-table-column 表头自定义

图例 代码 <el-table-column width="180"> <template slot="header" slot-scope="scope"> 销售提成 <el-tooltip effect="dark" content="若销售提成按“百分比”,则根据“活动价”来计算" placement="top"&......

5793

el-table 实现自定义表头 el-select

本文讲述使用ElementUi的表格时,表头实现下拉框的功能: 实现的效果图如下所示: 表格的定义 <el-table :data="tableLogData" style="width: 100%" header-cell-class-name="header-cell-color" v-loading="listLoading"> <el-table-column prop="level" min-width="100" :render-header="renderLa

sq66666的博客 1730

ElementUI表格表头自定义添加checkbox,点击选中样式不生效

场景:需要自定义table的多选效果,不用其自带的,采用官方文档此处(如图)的处理过程,并把全选控件嵌入table的表头,el-checkbox在table表头勾选样式不生效。具体用法,点击全选,样式没有变化。

ew45218的博客 744
上一篇: HTML5视频播放的一点儿小收获
下一篇: 你可能不知道的JSON.stringify
遛狗的代码
博客等级 码龄11年 10粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值