el-table 结合 slot 具名插槽遍历封装列表模板

news2025/3/12 10:25:51

基础效果

在这里插入图片描述

  • 要实现以上效果,可对 el-table 进行封装,将列配置视为数组,循环 el-table-column 标签
  • 模板组件
<div class="tableSlot">
   <el-table :data="dataList" border>
    <el-table-column
      v-for="(item, index) in columns"
      :key="index"
      :prop="item.prop"
      :label="item.label"
      :width="item.width"
    ></el-table-column>
  </el-table>
</div>
<script>
export default {
  props: {
    // 表格数据
    dataList: {
      type: Array,
      default: () => [],
    },
    // 列配置
    columns: {
      type: Array,
      default: () => [],
    },
  },
  name: "tableSlot",
};
</script>
  • 父组件
<div class="dataList">
  <p>表格 - 嵌套渲染</p>
  <tableSlot :dataList="dataList" :columns="columns"></tableSlot>
</div>
<script>
import tableSlot from "../../common/tableSlot.vue";
import axios from "axios";
export default {
  name: "dataList",
  components: { tableSlot },
  data() {
    return {
      dataList: [],
      // prop 为数据的 key,label 为表头
      columns: [
        { prop: "id", label: "用户ID" },
        { prop: "date", label: "日期" },
        { prop: "name", label: "姓名" },
        { prop: "count", label: "金额" },
        { prop: "address", label: "地址", width: "400" },
      ],
    };
  },
  mounted() {
    this.getData1();
  },
  methods: {
    getData1() {
      this.dataList = [];
      axios.get("/list2").then((res) => {
        console.log("res", res);
        if (res.status == 200) {
          this.dataList = res.data;
        }
      });
    },
  },
};
</script>

添加特殊样式

  • 如果想为某些列添加特殊样式,可以在 columns 中添加特殊参数
  • 比如为金额列添加颜色,大于 0 的显示绿色,否则显示红色
  • 比如添加操作列并回传点击事件

在这里插入图片描述

  • 模板组件
<el-table :data="dataList" border>
  <el-table-column
    v-for="(item, index) in columns"
    :key="index"
    :prop="item.prop"
    :label="item.label"
    :width="item.width"
  >
    <template slot-scope="scope">
      <template v-if="item.reset">
        <!-- 特殊样式 - 数值颜色 -->
        <template v-if="item.reset == 'countColor'">
          <div :class="scope.row[item.prop] > 0 ? 'green' : 'red'">
            {{
              scope.row[item.prop] > 0
                ? "+" + scope.row[item.prop]
                : scope.row[item.prop]
            }}
          </div>
        </template>
        <!-- 特殊样式 - 操作按钮组 -->
        <template v-if="item.reset == 'operate'">
          <el-button
            type="text"
            v-for="(itemBtn, indexBtn) in item.btns"
            :key="indexBtn"
            @click="handelRow(itemBtn, scope.row)"
          >
            {{ itemBtn }}
          </el-button>
        </template>
      </template>
      <template v-else>
        <!-- 非特殊样式,直接展示 -->
        {{ scope.row[item.prop] }}
      </template>
    </template>
  </el-table-column>
</el-table>
<script>
export default {
  props: {
    // 表格数据
    dataList: {
      type: Array,
      default: () => [],
    },
    // 列配置
    columns: {
      type: Array,
      default: () => [],
    },
  },
  name: "tableSlot",
  methods: {
    handelRow(type, row) {
      console.log("点击了当前行", type, row);
      this.$emit("handelRow", type, row);
    },
  },
};
</script>
<style lang="less" scoped>
.tableSlot {
  .red {
    color: red;
  }
  .green {
    color: green;
  }
}
</style>
  • 父组件
<div class="dataList">
  <p>表格 - 嵌套渲染</p>
  <tableSlot :dataList="dataList" :columns="columns" @handelRow="handelRow"></tableSlot>
</div>
<script>
import tableSlot from "../../common/tableSlot.vue";
import axios from "axios";
export default {
  name: "dataList",
  components: { tableSlot },
  data() {
    return {
      dataList: [],
      // 用 reset 来标记特殊列的展示样式
      columns: [
        { prop: "id", label: "用户ID" },
        { prop: "date", label: "日期" },
        { prop: "name", label: "姓名" },
        { prop: "count", label: "金额", reset: "countColor" }, // reset 标记,特殊颜色
        { prop: "address", label: "地址", width: "400" },
        {
          prop: "operate",
          label: "操作",
          width: "200",
          reset: "operate",
          btns: ["按钮1", "按钮2"],
        }, // reset 标记,按钮组
      ],
    };
  },
  mounted() {
    this.getData1();
  },
  methods: {
    getData1() {
      this.dataList = [];
      axios.get("/list2").then((res) => {
        console.log("res", res);
        if (res.status == 200) {
          this.dataList = res.data;
        }
      });
    },
    handelRow(type, row) {
      console.log("从表格模板传过来的点击事件", type, row);
    },
  },
};
</script>
  • 点击表格第一行的按钮1时,可以看到,父组件可以接收到传递的参数
    在这里插入图片描述

利用具名插槽

  • 如果 reset 标记不够满足父组件中的定制化样式,还可以利用具名插槽
  • 比如为姓名列添加文本内容
  • 比如截取日期格式

在这里插入图片描述

  • 可以将 columns 数组中的 prop 属性作为具名插槽的 name 来使用

  • 模板组件

<template>
  <div class="tableSlot">
    <el-table :data="dataList" border>
      <el-table-column
        v-for="(item, index) in columns"
        :key="index"
        :prop="item.prop"
        :label="item.label"
        :width="item.width"
      >
        <template slot-scope="scope">
          <template v-if="item.reset">
            <!-- 特殊样式 - 数值颜色 -->
            <template v-if="item.reset == 'countColor'">
              <div :class="scope.row[item.prop] > 0 ? 'green' : 'red'">
                {{
                  scope.row[item.prop] > 0
                    ? "+" + scope.row[item.prop]
                    : scope.row[item.prop]
                }}
              </div>
            </template>
            <!-- 特殊样式 - 操作按钮组 -->
            <template v-if="item.reset == 'operate'">
              <el-button
                type="text"
                v-for="(itemBtn, indexBtn) in item.btns"
                :key="indexBtn"
                @click="handelRow(itemBtn, scope.row)"
              >
                {{ itemBtn }}
              </el-button>
            </template>
            <!-- 特殊样式 - 具名插槽,去父组件展示,回传 row 的内容 -->
            <template v-if="item.reset == 'slot'">
              <!-- 将 prop 属性作为具名插槽的 name 来保证唯一 -->
              <slot :name="item.prop" :item="scope.row"></slot>
            </template>
          </template>
          <template v-else>
            <!-- 非特殊样式,直接展示 -->
            {{ scope.row[item.prop] }}
          </template>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
export default {
  props: {
    // 表格数据
    dataList: {
      type: Array,
      default: () => [],
    },
    // 列配置
    columns: {
      type: Array,
      default: () => [],
    },
  },
  name: "tableSlot",
  methods: {
    handelRow(type, row) {
      console.log("点击了当前行", type, row);
      this.$emit("handelRow", type, row);
    },
  },
};
</script>
<style lang="less" scoped>
.tableSlot {
  .red {
    color: red;
  }
  .green {
    color: green;
  }
}
</style>
  • 父组件
<template>
  <div class="dataList">
    <p>表格 - 嵌套渲染</p>
    <tableSlot :dataList="dataList" :columns="columns" @handelRow="handelRow">
      <!-- 姓名的插槽,接收 item 值,渲染格式 【姓名】 -->
      <template v-slot:name="{ item }">{{ `【${item.name}】` }}</template>
      <!-- 日期的插槽,接收 item 值,渲染格式 截取掉时间中的时分秒,只保留年月日 -->
      <template v-slot:date="{ item }">{{ item.date.split(" ")[0] }}</template>
    </tableSlot>
  </div>
</template>
<script>
import tableSlot from "../../common/tableSlot.vue";
import axios from "axios";
export default {
  name: "dataList",
  components: { tableSlot },
  data() {
    return {
      dataList: [],
      columns: [
        { prop: "id", label: "用户ID" },
        { prop: "date", label: "日期", reset: "slot" }, // reset 标记,插槽
        { prop: "name", label: "姓名", reset: "slot" }, // reset 标记,插槽
        { prop: "count", label: "金额", reset: "countColor" },
        { prop: "address", label: "地址", width: "400" },
        {
          prop: "operate",
          label: "操作",
          width: "200",
          reset: "operate",
          btns: ["按钮1", "按钮2"],
        },
      ],
    };
  },
  mounted() {
    this.getData1();
  },
  methods: {
    getData1() {
      this.dataList = [];
      axios.get("/list2").then((res) => {
        console.log("res", res);
        if (res.status == 200) {
          this.dataList = res.data;
        }
      });
    },
    handelRow(type, row) {
      console.log("从表格模板传过来的点击事件", type, row);
    },
  },
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2300619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏引擎学习第108天

仓库:https://gitee.com/mrxiao_com/2d_game_2 看一下我们现在的进展 今天的工作重点是处理游戏中的Z轴问题&#xff0c;特别是如何在不同的层级之间进行移动&#xff0c;并确保Z轴的处理方式与真实世界中的透视效果一致。当前&#xff0c;游戏中的Z轴运动存在问题&#xff0…

遵循规则:利用大语言模型进行视频异常检测的推理

文章目录 速览摘要01 引言02 相关工作视频异常检测大语言模型 03 归纳3.1 视觉感知3.2 规则生成Normal and Anomaly &#xff08;正常与异常&#xff09;Abstract and Concrete &#xff08;抽象与具体&#xff09;Human and Environment &#xff08;人类与环境&#xff09; 3…

网页制作01-html,css,javascript初认识のhtml的基本标记

一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1&#xff09;头部标…

linux常用命令大全(包括抓包、网络检测、路由等,做项目一点点总结而来!)

文章目录 常用命令**apt相关****ls**&#xff1a;**cd****cp****ls -l | grep ssh**&#xff1a;会列出当前目录中包含 “ssh” 的文件或目录的详细信息。**系统资源**linux路由相关抓包工具和命令tcpdumpwiresharktshark iperf 常用命令 通过上下方向键 ↑ ↓ 来调取过往执行过…

Linux学习笔记之虚拟地址空间

1.示例引入 运行如下代码那么运行结果如下图。 #include<stdio.h> #include<unistd.h>int main() {pid_t id fork();if(id-1){printf("创建进程错误&#xff01;\n");return 1;}int size0;if(id0){//子进程while(1){printf("我是子进程&#xff0c…

HTTP的“对话”逻辑:请求与响应如何构建数据桥梁?

一、前言 作为现代互联网通信的基石&#xff0c;HTTP协议定义了客户端与服务器之间的“对话规则”。每一次网页加载、API调用或文件传输的背后&#xff0c;都离不开精心构造的HTTP请求与响应。请求中封装了用户的意图——从请求方法、资源路径到提交的数据&#xff1b;响应则承…

[论文阅读] SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution

文章目录 一、前言二、主要贡献三、Introduction四、Methodology4.1 Motivation &#xff1a;4.2Framework Overview.** 一、前言 通信作者是香港理工大学 & OPPO研究所的张磊教授&#xff0c;也是图像超分ISR的一个大牛了。 论文如下 SeeSR: Towards Semantics-Aware Rea…

LM Studio笔记

一、什么是 LM Studio&#xff1f; LM Studio 是一款功能强大、易于使用的桌面应用程序&#xff0c;用于在本地机器上实验和评估大型语言模型&#xff08;LLMs&#xff09;。它允许用户轻松地比较不同的模型&#xff0c;并支持使用 NVIDIA/AMD GPU 加速计算。 功能集&#xff1…

Linux CentOS 7部署Vulhub靶场

漏洞复现环境&#xff1a; 1、Linux操作系统中通过Docker部署的Vulhub靶场&#xff1a; docker docker-compose 2、Nmap扫描工具 一、部署靶场 1、安装Docker 1、下载docker yum install docker 安装完成&#xff0c;如下图&#xff1a; 2、开启docker服务 [rootlocalhost…

Golang GORM系列:GORM分页和排序

高效的数据检索和表示是应用程序开发的关键方面。GORM是健壮的Go对象关系映射库&#xff0c;它为开发人员提供了强大的工具来实现这一点。无论你是在构建动态web应用程序还是数据密集型服务&#xff0c;掌握GORM中的分页和排序使您能够提供无缝且高效的用户体验。本文我们将深入…

【怎么使用Redis实现一个延时队列?】

怎么使用Redis实现一个延时队列? 详细说明Java代码示例解释注意事项使用Redis实现延时队列通常通过有序集合(Sorted Set)来实现,利用Redis的ZSET类型及其相关命令可以很方便地实现这一功能。 有序集合中的每个元素都有一个分数(score),我们可以利用这个分数来存储消息需…

HarmonyNext上传用户相册图片到服务器

图片选择就不用说了&#xff0c;直接用 无须申请权限 。 上传图片&#xff0c;步骤和android对比稍微有点复杂&#xff0c;可能是为了安全性考虑&#xff0c;需要将图片先拷贝到缓存目录下面&#xff0c;然后再上传&#xff0c;当然你也可以转成Base64&#xff0c;然后和服务…

宝塔docker 安装oracle11G

1、拉取镜像 sudo docker pull iatebes/oracle_11g #iatebes为用户名2、查看镜像 sudo docker images3、创建并运行容器 docker run -d --privileged --name oralce11g -p 1521:1521 iatebes/oracle_11g4、登录到容器 5、进入容器并修改system用户密码 docker exec -it orac…

计算机视觉-OpenCV图像处理

1.Matplotlib数据可视化&#xff08;绘制图像直方图、可视化矩阵&#xff09; # Matplotlib 数据可视化&#xff08;绘制图像直方图、可视化矩阵&#xff09; # 本节主要讲解如何使用 Matplotlib 绘制图像直方图和可视化矩阵。 # 1. 绘制图像直方图 # 2. 可视化矩阵# 1. 绘制图…

【论文笔记】Transformer^2: 自适应大型语言模型

Code repo: https://github.com/SakanaAI/self-adaptive-llms 摘要 自适应大型语言模型&#xff08;LLMs&#xff09;旨在解决传统微调方法的挑战&#xff0c;这些方法通常计算密集且难以处理多样化的任务。本文介绍了Transformer&#xff08;Transformer-Squared&#xff09;…

【医学影像AI】50个眼科影像数据集(1)分类任务

【医学影像】50个眼科影像数据集&#xff08;1&#xff09;分类任务 【医学影像】50个眼科影像数据集&#xff08;2&#xff09;分割任务 【医学影像】50个眼科影像数据集&#xff08;3&#xff09;其它任务 【医学影像AI】50 个眼科影像数据集&#xff08;1&#xff09;分类任…

2025年-G4--lc75--Best Time to Buy and Sell Stock(java版)

1.题目描述 2.思路 思路1: 3.java代码实现 class Solution {public int maxProfit(int[] prices) {// //初始化最小价格为最大值&#xff0c;最大利润为0// int minPriceInteger.MAX_VALUE;// int maxProfit0;// //遍历价格数组// for (int price : prices)// …

STM32 PWM脉冲宽度调制介绍

目录 背景 PWM 模式 影子寄存器和预装载寄存器 PWM对齐模式 PWM 边沿对齐模式 向上计数配置 向下计数的配置 PWM 中央对齐模式 程序 第一步、使能GPIOB组、AFIO、TIM3外设时钟 第二步、输出通道端口配置​编辑 第三步、定时器配置产生频率 第四步、PWM输出配置 第…

ZYNQ TCP Server PS端千兆网口速率低问题,要修改BSP中LWIP配置参数

用VITIS教程里面 TCP UDP应用工程例程 打算测试PS端千兆网口速率。ZYNQ核心板用黑金的&#xff0c;外部板子自画的网口电路和其它电路。TCP SERVER时 iperf测试速率 只有60~70Mbit/s&#xff1f;然后用UDP SERVER方式&#xff0c;发现能达到 950Mbit/s&#xff1f;&#xff1f;…