【HTML+REACT+ANTD 表格操作】处理(改变)数据,改变DOM

news2024/11/25 11:50:31

在这里插入图片描述

博主:_LJaXi
专栏: React | 前端框架

主要是一些表格DOM操作,数据更换 个人向

HTML

<!DOCTYPE html>
<html lang="en">
<link>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>生产监控</title>
<link rel="stylesheet" href="https://unpkg.com/antd@3.9.3/dist/antd.min.css" />
<link rel="stylesheet" href="/css/jiankongindex.css">
</link>
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>
<script src="https://unpkg.com/antd@3.9.3/dist/antd.min.js"></script>
<script src="/js/jquery.1.10.min.js"></script>
<script src="/js/appjs/shengchan/changeShifts/contant.js"></script>

</head>

<body>
  <div id="root"></div>
  <script th:inline="javascript" type="text/babel">
    let collect = [[${collect}]];
    let changeShifts = [[${changeShifts}]];
    const ProductionMonitoring = () => {
      'use strict';
      let disposeArray = [];
      const { useState, useEffect, useRef } = React;
      const [someDay, setSomeDay] = useState(new Date());
      const [startWorkshop, setStartWorkshop] = useState('');
      const [maintenanceWorkshop, setMaintenanceWorkshop] = useState('');
      const [footerDomWidth, setFooterDomWidth] = useState('');
      const tableDOM = useRef(null);
      const [selectValue, setSetlectValue] = useState('');
      const [date, setDate] = useState('');
      const [searchData, setSearchData] = useState([]);

      useEffect(() => {
        setStartWorkshop(changeShifts?.yproductionlog);
        setMaintenanceWorkshop(changeShifts?.wproductionlog);
      }, []);

      useEffect(() => {
        curstomFontColor();
        if (tableDOM.current) {
          countFootWidth()
        }
        windowResizeTableFooterWidth()
        const rableBodyContainer = tableDOM.current.getPopupContainer().querySelector('.ant-table-tbody').children;
        for (let i = 0; i < rableBodyContainer.length; i++) {
          const trItem = rableBodyContainer[i];
          const children = trItem.children;
          for (let j = 0; j < children.length; j++) {
            const childElement = children[j];
            if (j === 1 || j === 2 || j === 4 || j === 5) {
              childElement.style.backgroundColor = 'rgb(7,33,75)'
            }
          }
        }
      }, [searchData, setSearchData]);

      const isToday = (date) => {
        const today = new Date();
        return today.getFullYear() === date.getFullYear() &&
                today.getMonth() === date.getMonth() &&
                today.getDate() === date.getDate()
      };

      const replaceString = (str) => {
        const lastChar = str.slice(-1);
        switch (lastChar) {
          case "0":
            return str.replace(lastChar, ": 停止");
          case "1":
            return str.replace(lastChar, ": 运行");
          case "2":
            return str.replace(lastChar, ": 故障");
          default:
            return str;
        }
      };

      const concatArray = (arr_one, arr_two) => {
        let concatedArray = [];
        for (let i = 0; i < arr_one.length; i++) {
          if (arr_one[i].name1 || arr_one[i].name2) {
            for (let j = 0; j < arr_one[i].name1.length; j++) {
              arr_one[i].name1[j] = replaceString(arr_one[i].name1[j])
            }
            for (let j = 0; j < arr_one[i].name2.length; j++) {
              arr_one[i].name2[j] = replaceString(arr_one[i].name2[j])
            }
          }
        }
        disposeArray = arr_one;
        for (let i = 0; i < 5; i++) {
          let startIndexOne = JSON.parse(JSON.stringify(disposeArray[i]));
          let startIndexTwo = JSON.parse(JSON.stringify(arr_two[i]));
          concatedArray.push({ ...startIndexOne, ...startIndexTwo });
        }
        for (let i = 0; i < concatedArray.length; i++) {
          const concatStringOne = concatedArray[i].name1.reduce((acc, curr, index) => {
            return acc + curr + (index < concatedArray[i].name1.length - 1 ? '、' : '');
          }, '');
          const concatStringTwo = concatedArray[i].name2.reduce((acc, curr, index) => {
            return acc + curr + (index < concatedArray[i].name2.length - 1 ? '、' : '');
          }, '');
          concatedArray[i].name1 = concatStringOne;
          concatedArray[i].name2 = concatStringTwo;
        }
        return concatedArray;
      };

      const countFootWidth = () => {
        const footDomWidth = tableDOM.current.getPopupContainer().querySelector('.ant-table-row').children[0].offsetWidth
        setFooterDomWidth(footDomWidth);
      };

      const windowResizeTableFooterWidth = () => {
        const handleResize = () => {
          countFootWidth();
        };
        window.addEventListener('resize', handleResize);
        return () => {
          window.removeEventListener('resize', handleResize);
        };
      };

      const selectChange = (e) => {
        setSetlectValue(e)
      };

      const dateChange = (e) => {
        let newDate = new Date(e._d);
        setSomeDay(newDate);
        let selectDateValue = newDate.getFullYear() + '-' + ((newDate.getMonth()
          + 1) < 10 ? '0' + (newDate.getMonth() + 1) : newDate.getMonth() + 1
        ) + '-' + (newDate.getDate() < 10 ? '0' + newDate.getDate() : newDate.getDate());
        setDate(selectDateValue)
      };

      const submitTable = () => {
        if (!selectValue) return alert("类型为必填项");
        if (!date) return alert("时间为必填项");
        $.ajax({
          type: "POST",
          url: "/shengchan/changeShifts/update",
          data: JSON.stringify({ id: changeShifts.id, yproductionlog: startWorkshop, wproductionlog: maintenanceWorkshop }),
          contentType: 'application/json;charset=utf-8',
        })
      };

      const onSearch = async () => {
        await $.ajax({
          type: "POST",
          url: "/shengchan/changeShifts/search",
          data: JSON.stringify({id: changeShifts.id, datadate: date, atype: selectValue}),
          contentType : 'application/json;charset=utf-8',
        }).then(res => {
            if ( Array.isArray(res?.collect)) {
                const beforeClearArray = edTableColumnInnerHtml(edTableColumnInnerHtml(concatArray(res.collect, TABLE_DATA), 1), 2).slice();
                setSearchData([{a: ''}]);
                setSearchData(beforeClearArray);
            }
        });
      };

      const curstomFontColor = () => {
        let tableColumnDOM = tableDOM.current?.getPopupContainer()?.querySelectorAll('td');
        tableColumnDOM.forEach((node) => {
          let handleData = handlerNodeStr(node.innerHTML.slice("、"));
          node.innerHTML = handleData;
        });
      };

      const handlerNodeStr = (node) => {
        return node.replace(/&lt;/g, "<").replace(/&gt;/g, ">");
      };

      const edTableColumnInnerHtml = (d, index) => {
        for (let i = 0; i < d.length; i++) {
          let splitArr = d[i][(`name${index}`)].split("、");
          for (let j = 0; j < splitArr.length; j++) {
            if (splitArr[j].slice(-2) === "运行") {
              splitArr[j] = splitArr[j].replace(splitArr[j].slice(-2),  `<span style="color: green">${splitArr[j].slice(-2)}</span>`)
            } else if (splitArr[j].slice(-2) === "故障") {
              splitArr[j] = splitArr[j].replace(splitArr[j].slice(-2),  `<span style="color: orange">${splitArr[j].slice(-2)}</span>`)
            } else if (splitArr[j].slice(-2) === "停止") {
              splitArr[j] = splitArr[j].replace(splitArr[j].slice(-2),  `<span style="color: red">${splitArr[j].slice(-2)}</span>`)
            }
          }
          d[i][`name${index}`] = splitArr.join("、");
        }
        return d;
      };

      const FootDom = () => {
        return (
          <>
            <div className="footer-container">
              <div
                className="footer-item"
                style={{
                  width: `${footerDomWidth}px`,
                  borderRight: '1px solid #eee'
                }}
              >
                <span className="content">
                  {FOOTER_OPERATION}
                </span>
              </div>
              <div style={{ flex: 1 }}>
                <antd.Input value={startWorkshop} className="w1 h1" placeholder="请输入" onChange={(e) => setStartWorkshop(e.target.value)} />
              </div>
            </div>
            <div className="footer-container">
              <div
                className="footer-item"
                style={{
                  width: `${footerDomWidth}px`,
                  borderRight: '1px solid #eee'
                }}>
                <span className="content">
                  {FOOTER_MAINTENANCE}
                </span>
              </div>
              <div style={{ flex: 1 }}>
                <antd.Input value={maintenanceWorkshop} className="w1 h1" placeholder="请输入" onChange={(e) => setMaintenanceWorkshop(e.target.value)} />
              </div>
            </div>
          </>
        )
      };

      return (
        <div className="table-container">
          <antd.Table
                  ref={tableDOM}
                  pagination={false}
                  columns={COLUMNS}
                  dataSource={searchData.length > 0 ? searchData : (edTableColumnInnerHtml(edTableColumnInnerHtml(concatArray(collect, TABLE_DATA), 1), 2))}
                  footer={() => FootDom()}
          />
          <div className="operate-table">
            <div className="operate-item">
              <antd.DatePicker className="i1" onChange={dateChange} placeholder="选择日期" />
              <antd.Select value={selectValue} onChange={selectChange} className="w1 i1">
                <Option value="白班">白班</Option>
                <Option value="夜班">夜班</Option>
              </antd.Select>
              <antd.Button className="w1 i1" type="primary" size="large" onClick={onSearch}>< img src="/img/search.png" className="icon" />搜索</antd.Button>
              {isToday(someDay) && (
                <antd.Button className="w1 i1" type="primary" size="large" onClick={submitTable}>< img src="/img/submit.png" className="icon" />提交</antd.Button>
              )}
            </div>
          </div>
        </div>
      )
    };
    const container = document.getElementById('root');
    ReactDOM.render(<ProductionMonitoring />, container)
  </script>
</body>

</html>

js

const COLUMNS = [
  {
    title: '工艺段',
    dataIndex: 'gyd1',
    key: 'gyd1',
    align: 'center'
  },
  {
    title: '项目',
    dataIndex: 'xm1',
    key: 'xm1',
    align: 'center'
  },
  {
      title: '记录',
      dataIndex: 'name1',
      key: 'name1',
      align: 'center'
  },
  {
    title: '工艺段',
    dataIndex: 'gyd2',
    key: 'gyd2',
    align: 'center'
  },
  {
    title: '项目',
    dataIndex: 'xm2',
    key: 'xm2',
    align: 'center'
  },
  {
    title: '记录',
    dataIndex: 'name2',
    key: 'name2',
    align: 'center'
  }
]

const TABLE_DATA = [
  {
    key: '1',
    gyd1: '一二期脱水机房',
    xm1: '一二期脱水机、状态',
    // name1: '',
    gyd2: '聚铁加药间',
    xm2: '聚铁加药间、状态',
    // name2: ''
  },
  {
    key: '2',
    gyd1: '聚铁加药间',
    xm1: '聚铁加药间、状态',
    // name1: '',
    gyd2: '一二期浓缩池',
    xm2: '剩余污泥泵、状态',
    // name2: ''
  },
  {
    key: '3',
    gyd1: '消化池',
    xm1: '阀门、状态',
    // name1: '',
    gyd2: '三期浓缩池',
    xm2: '排泥泵、状态',
    // name2: ''
  },
  {
    key: '4',
    gyd1: '污泥浓缩机',
    xm1: '污泥浓缩机、状态',
    // name1: '',
    gyd2: '一、二期剩余污泥泵',
    xm2: '一、二期剩余污泥泵、状态',
    // name2: ''
  },
  {
    key: '5',
    gyd1: '污泥料仓液位',
    xm1: '污泥料仓液位、状态',
    // name1: '',
    gyd2: '脱水机房',
    xm2: '柱塞泵、皮带机、螺旋、状态',
    // name2: ''
  }
]

const FOOTER_OPERATION = '运行车间、交班内容'
const FOOTER_MAINTENANCE = '维护车间、交班内容'

css

.ant-table-thead > tr > th {
  color: #aadbfa;
  background-color: #2b5689;
  border-right: 1px solid #eee;
  border-bottom: 1px solid #eee;
}
.ant-table-tbody > tr > td {
  height: 80px;
  color: #aadbfa;
  background-color: #2b5689;
  border-right: 1px solid #eee;
  border-bottom: 1px solid #eee;
}
.footer-container {
  display: flex;
  min-height: 80px;
  color: #aadbfa;
  border-right: 1px solid #eee;
  border-bottom: 1px solid #eee;
  background-color: #2b5689;
}

.ant-input {
  color: #fff;
  background-color: rgb(7,33,75);
}

.footer-container .footer-item {
  position: relative;
  max-height: 100px;
  text-align: center;
}

.footer-container .footer-item .content {
  display: inline-block;
  width: 100%;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.ant-table-footer {
  padding: 0 !important;
  border-top: 0 !important;
}
.table-container {
  display: flex;
}
.table-container .ant-table-wrapper {
  flex: 1;
}
.table-container .operate-table {
  padding: 8px;
  min-width: 150px;
  max-width: 150px;
  color: #aadbfa;
  background-color: #2b5689;
  border-right: 1px solid #eee;
  border-bottom: 1px solid #eee;
}

.operate-item {
  /*display: flex;*/
  /*flex-direction: column;*/
  /*justify-content: space-between;*/
  height: 170px;
}
.table-container .operate-table .w1 {
  width: 100%;
}
.h1 {
  height: 100%;
}
.i1 {
  margin: 5px 0 5px 0;
}
.table-container .operate-table .icon {
  width: 20px;
  height: 20px;
  margin: 0 10px 0 0;
}

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

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

相关文章

MacBook/MacOS如何更新到指定的版本

背景 现在是A版本&#xff0c;想要更新到B&#xff0c;而目前能最新更新到C。 是可以做到的&#xff0c;不一定更新就得更新到最新的。 只要下载好B之后更新即可。 方法 思路是下载好目标的版本后更新&#xff0c;这里可以下载&#xff1a; https://support.apple.com/zh-…

算法练习13——跳跃游戏II

LeetCode 45 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回…

VS2015编译Qt工程发生MSB4018错误完整解决过程

一、错误产生环境 操作系统&#xff1a;Windows10 开发工具&#xff1a;VS2015企业版 Qt版本&#xff1a;Qt5.7.1 64位 二、错误内容 MSB4018 “VCMessage”任务意外失败。 System.FormatException: 索引(从零开始)必须大于或等于零&#xff0c;且小于参数列表的大小。 …

Compose 组件 - 分页器 HorizontalPager、VerticalPager

一、概念 类似于 ViewPager&#xff0c;1.4 版本之前需要借助 accompanis 库&#xff0c;底层基于 LazyColumn、LazyRow 实现&#xff0c;在使用上也基本相同。默认情况下 HorizontalPager 占据屏幕的整个宽度&#xff0c;VerticalPager 会占据整个高度。 fun HorizontalPager(…

@ConditionalOnProperty 用法

文章目录 前言一、使用场景二、使用步骤1.错误示例2.ConditionalOnProperty的解决方案 总结 前言 ConditionalOnProperty 是Spring Boot中的条件注解&#xff0c;它的核心功能是通过属性名以及属性值来实现的&#xff0c;常被用于判断某个属性是否存在&#xff0c;然后决定某个…

049:mapboxGL本地上传WKT文件,在地图上显示图形

第049个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中本地上传wkt文件,先将wkt转换为geojson格式,然后通过mapbox加载geojson数据的方法解析,在地图上显示图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示…

SQLite4Unity3d安卓 在手机上创建sqlite失败解决

总结 要在Unity上运行一次出现库&#xff0c;再打包进APK内 问题 使用示例代码的创建库 var dbPath string.Format("Assets/StreamingAssets/{0}", DatabaseName); #else// check if file exists in Application.persistentDataPathvar filepath string.Format…

组件协作模式

二、组件协作模式 组件协作模式概念1、模板方法模式&#xff08;Template_Method&#xff09;模式定义动机(Motivation)具体代码举例实现要点总结 2、策略模式&#xff08;Strategy&#xff09;3、观察者模式&#xff08;Observer/Event&#xff09; 组件协作模式概念 现代软件…

【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构

微服务&#xff08;1&#xff09; 文章目录 【微服务】&#xff08;1&#xff09;1. 微服务相关技术栈2. 微服务学习路线3. 认识微服务架构3.1 单体架构3.2 分布式架构3.3 微服务(架构)3.4 微服务(架构)治理落实相关的SpringCloud、SpringCloudAlibaba和阿里巴巴的Dubbo提供的服…

【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口

文章目录 【MySQL SpringBoot 小点子】全面实现流程 数据库导出Excel表格文件的接口1. 什么是VO&#xff08;View Object&#xff09;对象2. BeanCopyUtils进行两个对象的数据转移3. mapper层实现4. service层实现5. vo对象创建6. 保存路径配置7. controller层核心代码实现8.…

048:mapboxGL本地上传geojson文件,在map上解析显示图形

第048个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中本地上传geojson文件,通过mapbox加载geojson数据的方法解析,在地图上显示图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共112行)相关API…

39 本书助力精益成长

目录 ​编辑 Idea - 思考者的世界处处都是台风口 人才 - 所有的问题,归根结底都是人的问题 产品 - 不仅要满足需求,还要满足想象力

云上攻防-云原生篇KubernetesK8s安全APIKubelet未授权访问容器执行

文章目录 K8S集群架构解释&#xff08;见上图参考&#xff09;K8S集群攻击点(见上图参考)-重点API Server未授权访问&kubelet未授权访问复现 K8S集群架构解释&#xff08;见上图参考&#xff09; Kubernetes是一个开源的&#xff0c;用于编排云平台中多个主机上的容器化的…

[动手学深度学习]生成对抗网络GAN学习笔记

论文原文&#xff1a;Generative Adversarial Nets (neurips.cc) 李沐GAN论文逐段精读&#xff1a;GAN论文逐段精读【论文精读】_哔哩哔哩_bilibili 论文代码&#xff1a;http://www.github.com/goodfeli/adversarial Ian, J. et al. (2014) Generative adversarial network…

【Kotlin精简】第3章 类与接口

1 简介 Kotlin类的声明和Java没有什么区别&#xff0c;Kotlin中&#xff0c;类的声明也使用class关键字&#xff0c;如果只是声明一个空类&#xff0c;Kotlin和Java没有任何区别&#xff0c;不过定义类的其他成员会有一些区别。实例化类不用写new&#xff0c;类被继承或者重写…

如何开始使用 Kubernetes RBAC

基于角色的访问控制 (RBAC) 是一种用于定义用户帐户可以在 Kubernetes 集群中执行的操作的机制。启用 RBAC 可以降低与凭证盗窃和帐户接管相关的风险。向每个用户授予他们所需的最低权限集可以防止帐户拥有过多的特权。 大多数流行的 Kubernetes 发行版都从单个用户帐户开始,…

值得拥有的 12 大最佳照片恢复软件 [持续更新]

由于误删、损坏、病毒攻击等原因&#xff0c;您可能会丢失珍贵的照片。幸运的是&#xff0c;市场上有专业的照片恢复工具。但是&#xff0c;根据您的需要找到合适的照片恢复软件的任务可能压力很大。为了帮助您做出正确的决定&#xff0c;我们精心挑选了您可以信赖的收费最高的…

opencv 图像识别 指纹识别 - python 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

STM32Cube高效开发教程<基础篇>(四)----GPIO输入/输出

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 GPIO功能…

Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)

目录 技术栈 1.后端接口实现 2.前端实现 2.1 实现静态结构 2.2 整合上传文件的数据 2.3 实现一键上传文件 2.4 取消上传 博客主页&#xff1a;専心_前端,javascript,mysql-CSDN博客 系列专栏&#xff1a;vue3nodejs 实战--文件上传 前端代码仓库&#xff1a;jiangjunjie…