在vue中实现树形结构的表格,以及对数据结构的处理

news2025/2/28 21:37:47

需求:有一些告警数据,如果他们的计划编码相同则实现折叠效果,单击某行数据可以进行关闭,状态发生改变,关闭以后按钮禁用

实现效果:目前所有告警消息都被关闭,如果未被关闭则可以进行关闭

实现代码:

<!--物料管理 -->
<template>
  <div class="app-container">
    <el-table
      v-loading="loading"
      :data="tableList"
      row-key="alarmId"
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
    >
      <el-table-column label="计划编码" prop="planCode" />
      <el-table-column label="产品编码" prop="itemCode" />
      <el-table-column label="产品名称" prop="itemName" />
      <el-table-column label="缺少重量" prop="diffValue" />
      <el-table-column label="关闭时间" prop="shutTime" />
      <el-table-column fixed="right" label="操作" width="200">
        <template slot-scope="scope">
          <el-button
            type="text"
            size="small"
            @click="close(scope.row)"
            v-if="scope.row.dealStatus == 0"
            >关闭</el-button
          >
          <el-button
            type="text"
            size="small"
            v-show="scope.row.dealStatus == 1"
            disabled
            >已关闭</el-button
          >
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total > 0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
  </div>
</template>

<script>
import { alarmList, closeAlarm } from "../../../api/alarm/index";
export default {
  data() {
    return {
      queryParams: {
        pageNum: 1,
        pageSize: 10,
      },
      total: 0,
      loading: false,
      tableList: [],
    };
  },
  created() {
    this.getList();
  },
  methods: {
    async close(row) {
      console.log("参数", row);
      const obj = { alarmId: row.alarmId, dealStatus: 1 };
      const res = await closeAlarm(obj);
      if (res) {
        this.$notify({
          title: "成功",
          message: "该物料告警已被关闭",
          type: "success",
        });
        console.log("关闭成功", res);
        this.getList();
      }
    },
    async getList() {
      const res = await alarmList(this.queryParams);
      if (res) {
        console.log("告警记录", res);
        const newTableList = [];
        res.rows.forEach((item) => {
          const existingItem = newTableList.find(
            (newItem) => newItem.planCode === item.planCode
          );

          if (existingItem) {
            // 如果已存在相同 planCode 的项,将当前项添加到其 children 数组中
            existingItem.children.push({
              alarmId: item.alarmId,
              planId: item.planId,
              planCode: item.planCode,
              itemId: item.itemId,
              itemCode: item.itemCode,
              itemName: item.itemName,
              diffValue: item.diffValue,
              dealStatus: item.dealStatus,
              createTime: item.createTime,
              shutTime: item.shutTime,
              clientIp: item.clientIp,
            });
          } else {
            // 如果不存在相同 planCode 的项,直接添加当前项
            newTableList.push({
              alarmId: item.alarmId,
              planId: item.planId,
              planCode: item.planCode,
              itemId: item.itemId,
              itemCode: item.itemCode,
              itemName: item.itemName,
              diffValue: item.diffValue,
              dealStatus: item.dealStatus,
              createTime: item.createTime,
              shutTime: item.shutTime,
              clientIp: item.clientIp,
              children: [],
            });
          }
        });
        // console.log("告警记录数据结构", newTableList);
        this.tableList = newTableList;
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.callback-btn {
  font-size: 16px;
  font-weight: bold;
  margin-top: 16px;
  color: red;
}
</style>

需要处理的就是表格数据结构,如果后端没有对数据结构进行处理,那我们就要自己处理了

假设这是后端返回的数据结构:

[
    {
        "alarmId": 1,
        "planId": 2,
        "planCode": "DDDDDD1",
        "itemId": 100,
        "itemCode": "CP.021.22.01",
        "itemName": "Sovbond TBBS-80GE(水粉色)",
        "diffValue": 3,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107"
    },
    {
        "alarmId": 2,
        "planId": 2,
        "planCode": "DDDDDD1",
        "itemId": 100,
        "itemCode": "CP.021.22.01",
        "itemName": "Sovbond TBBS-80GE(水粉色)",
        "diffValue": 2,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107"
    },
    {
        "alarmId": 3,
        "planId": 17,
        "planCode": "生产计划2",
        "itemId": 108,
        "itemCode": "CP.040.21.01",
        "itemName": "Sovbond TMTM-80GE",
        "diffValue": 5,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107"
    },
    {
        "alarmId": 4,
        "planId": 17,
        "planCode": "生产计划2",
        "itemId": 108,
        "itemCode": "CP.040.21.01",
        "itemName": "Sovbond TMTM-80GE",
        "diffValue": 4,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107"
    },
    {
        "alarmId": 5,
        "planId": 17,
        "planCode": "生产计划2",
        "itemId": 108,
        "itemCode": "CP.040.21.01",
        "itemName": "Sovbond TMTM-80GE",
        "diffValue": 5,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107"
    },
    {
        "alarmId": 6,
        "planId": 2,
        "planCode": "DDDDDD1",
        "itemId": 101,
        "itemCode": "CP.021.24.01",
        "itemName": "Sovbond TBBS-80GS",
        "diffValue": 2,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107"
    },
    {
        "alarmId": 7,
        "planId": 2,
        "planCode": "DDDDDD1",
        "itemId": 103,
        "itemCode": "CP.023.21.01",
        "itemName": "Sovbond OTOS-80GE",
        "diffValue": 6,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107"
    },
    {
        "alarmId": 8,
        "planId": 15,
        "planCode": "生产计划1",
        "itemId": 732,
        "itemCode": "CP.02",
        "itemName": "美年达",
        "diffValue": 7,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107"
    }
]

而我们需要得到的数据结构是这样的,将planId相同的做成折叠效果,实现方式在上述代码中getList方法中就已经实现了。

[
    {
        "alarmId": 1,
        "planId": 2,
        "planCode": "DDDDDD1",
        "itemId": 100,
        "itemCode": "CP.021.22.01",
        "itemName": "Sovbond TBBS-80GE(水粉色)",
        "diffValue": 3,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107",
        "children": [
            {
                "alarmId": 2,
                "planId": 2,
                "planCode": "DDDDDD1",
                "itemId": 100,
                "itemCode": "CP.021.22.01",
                "itemName": "Sovbond TBBS-80GE(水粉色)",
                "diffValue": 2,
                "dealStatus": 1,
                "createTime": "2024-01-11",
                "shutTime": "2024-01-12",
                "clientIp": "192.168.90.107"
            },
            {
                "alarmId": 6,
                "planId": 2,
                "planCode": "DDDDDD1",
                "itemId": 101,
                "itemCode": "CP.021.24.01",
                "itemName": "Sovbond TBBS-80GS",
                "diffValue": 2,
                "dealStatus": 1,
                "createTime": "2024-01-11",
                "shutTime": "2024-01-12",
                "clientIp": "192.168.90.107"
            },
            {
                "alarmId": 7,
                "planId": 2,
                "planCode": "DDDDDD1",
                "itemId": 103,
                "itemCode": "CP.023.21.01",
                "itemName": "Sovbond OTOS-80GE",
                "diffValue": 6,
                "dealStatus": 1,
                "createTime": "2024-01-11",
                "shutTime": "2024-01-12",
                "clientIp": "192.168.90.107"
            }
        ]
    },
    {
        "alarmId": 3,
        "planId": 17,
        "planCode": "生产计划2",
        "itemId": 108,
        "itemCode": "CP.040.21.01",
        "itemName": "Sovbond TMTM-80GE",
        "diffValue": 5,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107",
        "children": [
            {
                "alarmId": 4,
                "planId": 17,
                "planCode": "生产计划2",
                "itemId": 108,
                "itemCode": "CP.040.21.01",
                "itemName": "Sovbond TMTM-80GE",
                "diffValue": 4,
                "dealStatus": 1,
                "createTime": "2024-01-11",
                "shutTime": "2024-01-12",
                "clientIp": "192.168.90.107"
            },
            {
                "alarmId": 5,
                "planId": 17,
                "planCode": "生产计划2",
                "itemId": 108,
                "itemCode": "CP.040.21.01",
                "itemName": "Sovbond TMTM-80GE",
                "diffValue": 5,
                "dealStatus": 1,
                "createTime": "2024-01-11",
                "shutTime": "2024-01-12",
                "clientIp": "192.168.90.107"
            }
        ]
    },
    {
        "alarmId": 8,
        "planId": 15,
        "planCode": "生产计划1",
        "itemId": 732,
        "itemCode": "CP.02",
        "itemName": "美年达",
        "diffValue": 7,
        "dealStatus": 1,
        "createTime": "2024-01-11",
        "shutTime": "2024-01-12",
        "clientIp": "192.168.90.107",
        "children": []
    }
]

需要值得注意的时候,你已关闭按钮在被关闭时需要使用v-show而不是v-if

因为:

已关闭按钮的 disabled 属性是通过 v-if 条件来控制的。这样的实现方式可能会导致 Vue 在渲染时忽略 disabled 属性,因为在 v-if 的条件下,即使按钮处于已关闭状态,它仍然存在于 DOM 中,只是在用户界面上被隐藏了。

解决这个问题的一种方式是使用 v-show 指令而不是 v-if 来控制按钮的显示与隐藏。v-show 不会在元素隐藏时将其从 DOM 中移除,而是使用 CSS 样式来控制显示和隐藏,这样在已关闭状态下,按钮依然存在于 DOM 中,但用户无法与其交互。

或者将关闭按钮写成这样:

<el-button
  type="text"
  size="small"
  :disabled="scope.row.dealStatus === 1"
>已关闭</el-button>

所以v-showv-if有时候达到的效果可能一样,但也不能乱使用,更何况有时候产生的效果是完全不一样的。

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

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

相关文章

leetcode 2645. 构造有效字符串的最少插入数-python

题目&#xff1a; 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次&#xff0c;返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到&#xff0c;则认为该字符串 有效 。 解题方法 1.先判断字符串是否…

李沐之神经网络基础

目录 1.模型构造 1.1层和块 1.2自定义块 1.3顺序块 1.4在前向传播函数中执行代码 2.参数管理 2.1参数访问 2.2参数初始化 3.自定义层 3.1不带参数的层 3.2带参数的层 4.读写文件 4.1加载和保存张量 4.2加载和保存模型参数 1.模型构造 1.1层和块 import torch fr…

一种具有轨迹优化的无人驾驶车实时运动规划器 论文阅读

论文题目&#xff1a;A Real-Time Motion Planner with Trajectory Optimization for Autonomous Vehicles Abstract 本文的实时规划器首先将空间离散化&#xff0c;然后基于一组成本函数搜索出最佳轨迹。迭代优化所得到的轨迹的Path和Speed。post-optimization计算复杂度低&…

阿里云服务部署docker容器

1.1 为什么要用docker 问题 开发、测试、生产环境不统一&#xff0c;造成项目测试、部署时产生问题 解决方案 使用容器化技术&#xff0c;将环境和项目一起发送给测试、部署人员&#xff0c;测试人数和运维人员直接使用发过 来的环境和项目进行操作&#xff0c;避免环境不统一…

【卡梅德生物】单B细胞技术:牛单抗制备

1.牛单B细胞技术原理 单个B细胞抗体制备技术是近年来新发展的一类快速制备单克隆抗体的技术&#xff0c;基于流式细胞分选技术进行单B细胞单抗制备&#xff0c;利用每个B细胞只含有一个功能性重链可变区DNA序列和一个轻链可变区DNA序列且只产生一种特异性抗体的特性&#xff0c…

嵌入式linux 编译qt5(以v851s为例)

本文参考Blev大神的博客&#xff1a;Yuzuki Lizard V851S开发板 --移植 QT5.12.9教程&#xff08;群友Blev提供&#xff09; - Allwinner / 柚木PI-V851S - 嵌入式开发问答社区 (100ask.net) 一. 环境准备 1.下载qt5源码&#xff1a;Open Source Development | Open Source …

MathType绝对是我数学编辑的首选工具!

去年&#xff0c;微软曾说&#xff0c;要去掉Office里的公式编辑器&#xff0c;建议用户使用MathType编辑公式。目前Office用户可以到微软官网安装MathType的插件&#xff0c;现在免费使用&#xff0c;以后要收费。Word里安装这个插件以后&#xff0c;就会出现MathType的菜单。…

双交叉限幅控制总结

空燃比小于等于1使用下图&#xff1a;空燃比大于1&#xff0c;MAX变MIN&#xff0c;MIN变MAX&#xff0c;高低选互换即可。加负荷&#xff0c;先加空气&#xff0c;后加煤气&#xff0c;降负荷&#xff0c;先降煤气&#xff0c;后降空气。 交叉限幅和双交叉限幅的区别 交叉限幅…

磷酸铁锂电池生产污废水需要哪些工艺及设备

磷酸铁锂电池作为一种常见的锂离子电池&#xff0c;已广泛应用于电动汽车、储能系统等领域。然而&#xff0c;在磷酸铁锂电池的生产过程中&#xff0c;难免会产生一定量的污废水。为了有效处理和处理这些污废水&#xff0c;我们需要合适的工艺和设备。 首先&#xff0c;针对磷酸…

java期末复习题

1.任何一个Java程序都默认引入一个包&#xff0c;这个包的名字是________________。 正确答案&#xff1a;java.lang Java程序默认引入的包是java.lang包。这个包是Java语言的核心&#xff0c;它提供了Java中的基础类&#xff0c;包括基本Object类、Class类、String类、基本类…

react 项目结构配置

1 项目整体目录结构的搭建 如下图&#xff1a; 2 重置css样式: normalize.css reset.less ; 第一步 安装 npm i normalize.css 入口文件index.tsx导入&#xff1a;import ‘noremalize.css’ 第二步 创建自己的css样式&#xff1a;在assets文件夹中创建css…

【MySQL】:掌握SQL中DDL的数据库定义与操作

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. SQL的分类二. DDL数据库操作2.1 查询所有数据库2.2 查询当前数据库2.3 创建数…

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】分类效果基本描述模型描述程序设计参考资料 分…

《设计模式的艺术》笔记 - 简单工厂模式

介绍 定义一个工厂类&#xff0c;它可以根据参数的不同返回不同类的实例&#xff0c;被创建的实例通常都具有相同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法&#xff0c;因此简单工厂模式又被称为静态工厂方法模式&#xff0c;属于类创建型模式 实现 class Pr…

实现JavaScript的函数链式执行

本篇文章将会实现函数链式执行&#xff0c;链式步骤延时等操作。 1.工具类 const executor (name) > {/*** 执行器名称*/const executorName name;/*** 方法数组*/const methodArray [];/*** 同步执行某个方法*/function run(func){methodArray.push(func);return this…

谷歌aab包在Android 14闪退而apk没问题(targetsdk 34)

问题原因 Unity应用(target SDK 34)上线到GooglePlay&#xff0c;有用户反馈fold5设备上&#xff08;Android14系统&#xff09;疯狂闪退&#xff0c;经测试&#xff0c;在小米手机Android14系统的版本复现成功了&#xff0c;奇怪的是apk直接安装没问题&#xff0c;而打包成aa…

Android开发基础(二)

Android开发基础&#xff08;二&#xff09; 上篇主要描述了Android系统架构&#xff0c;代码是通过Java表示的&#xff1b; 本篇将从介绍Android组件去理解Android开发&#xff0c;代码将对Java和Kotlin进行对比。 Android组件 Android应用程序由一些零散的有联系的组件组成…

伴鱼离线数仓建设案例

伴鱼数仓建设案例 伴鱼离线数仓建立&#xff0c;与伴鱼的业务一起快速发展&#xff0c;从一条业务线&#xff0c;到多条业务线。在演进的过程中&#xff0c;有很多总结和沉淀的内容。本篇文章主要介绍伴鱼离线数据仓库的发展历史&#xff0c;在发展过程中遇到的各种问题&#…

人工智能ai写作软件哪个好,看看这6款

现如今人工智能AI写作软件逐渐成为写作者们的得力助手。这些软件利用先进的自然语言处理技术&#xff0c;能够帮助用户快速生成高质量的中文文章。在众多中文人工智能AI写作软件中&#xff0c;以下6款软件凭借其独特的优势脱颖而出&#xff0c;为用户提供了高效的写作体验。 软…

NetApp E系列(E-Series)OEM产品介绍以及如何收集日志和保存配置信息

NetApp E系列是NetApp收购LSI存储后建立的一条新的产品线&#xff0c;由于LSI存储的历史悠久&#xff0c;所以这条产品线给NetApp带来了很多的OEM产品&#xff0c;可以说E系列是世界上OEM给最多公司的存储产品线也不为过&#xff0c;因为最早LSI的产品销售测率就是OEM&#xff…