vue3弹窗中循环生成表单的校验和重置问题

news2024/11/20 12:40:00

应用场景:

1、弹框里的表单是根据后台返回的时段生成的,后台返回几个时段,就渲染几组表单。

       -1- 重置:遍历每个表单,获取当前表单的引用,在resetFields()

       -2- 校验:创建一个数组来存储每个表单的校验结果,遍历每个表单,获取当前表单的引用,校验当前表单,将校验结果存储到数组中,判断到最后一个表单的时候,检查所有的校验结果,校验通过,执行提交操作,否则,执行失败操作。

2、hour 和 hourSupHeat 不可编辑,需计算 hourSupHeat = hour * supHeat,

        这里需要监听 initFormdata的变化,再循环item,再监听每个item里的supHeat,然后计算结果,我这里需要的结果是字符串形式,所以转了String。

3、表单限制只能输入数字,限制2位或3位小数,rules规则里使用正则表达式匹配,hourSupHeat 鼠标移入有公式提示,el-tooltip,使用 label 插槽把 icon 放到文字后面。

数据结构:数组对象形式

initFormData:[
  { start: '9', end: '16', supTemp: '', supPres: '', hour: '8', supHeat: '', supFlow: '', hourSupHeat: '' },
  { start: '16', end: '9', supTemp: '', supPres: '', hour: '16', supHeat: '', supFlow: '', hourSupHeat: '' },
]

效果显示:

<template>
  <PatrolDialog :show="show" @close="show = false" @define="save(ruleFormRef)" @cancel="cancel(ruleFormRef)" beforeClose
    @handleBeforeClose="handleBeforeClose(ruleFormRef)" width="600px" top="10vh">
    <template #title>
      <div class="dialog-title"><img :src="weatherStationIcon" />{{ title }}</div>
    </template>
    <div class="formPart">
      <div class="item" v-for="(item, index) in initFormData" :key="index">
        <div class="time" style="padding-bottom: var(--base-padding); color: var(--gdky-primary-color);"> [{{ item.start
        }}时-{{ item.end }}时]
        </div>
        <el-form ref="ruleFormRef" :model="item" :rules="rules" label-position="top">
          <el-row :gutter="16">
            <el-col :span="8">
              <el-form-item label="供温 ℃" prop="supTemp">
                <el-input v-model="item.supTemp" style="width:100%" placeholder="请输入" />
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="供压 MPa" prop="supPres">
                <el-input v-model="item.supPres" style="width:100%" placeholder="请输入" />
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="时段 h" prop="hour">
                <el-input v-model="item.hour" disabled style="width:100%" placeholder="请输入" />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="16">
            <el-col :span="8">
              <el-form-item label="供热 GJ/h" prop="supHeat">
                <el-input v-model="item.supHeat" style="width:100%" placeholder="请输入" />
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="供流 t/h" prop="supFlow">
                <el-input v-model="item.supFlow" style="width:100%" placeholder="请输入" />
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-tooltip class="box-item" effect="dark" content="应供热量*时间段小时数" placement="top">
                <el-form-item prop="hourSupHeat">
                  <template #label>
                    <div>
                      <span>时段供热 GJ</span>
                      <i class="iconfont icon-xiangqing1" style="font-size: 14px; padding-left: 5px;"></i>
                    </div>
                  </template>
                  <el-input v-model="item.hourSupHeat" disabled style="width:100%" placeholder="请输入" />
                </el-form-item>
              </el-tooltip>

            </el-col>
          </el-row>
        </el-form>
        <div style="border-bottom:2px dashed rgba(215, 215, 215, 0.4);margin-bottom: 16px;"></div>
      </div>
    </div>
  </PatrolDialog>
</template>

<script>
import { reactive, toRefs, computed, watch, ref, onMounted } from 'vue'
import PatrolDialog from '@/views/Components/PatrolDialog.vue'
import weatherStationIcon from '@/assets/imgs/title_img.png'
import { ElMessage } from 'element-plus'
import { debounce } from 'lodash-es'
import { getUpdateTimeDataList } from '@/api/PlatTool/CustomModules/HeatSourceDispatch/index'

const initFormData = ref([
  { start: '9', end: '16', supTemp: '', supPres: '', hour: '8', supHeat: '', supFlow: '', hourSupHeat: '' },
  { start: '16', end: '9', supTemp: '', supPres: '', hour: '16', supHeat: '', supFlow: '', hourSupHeat: '' },
])
const ruleFormRef = ref([])
export default {
  components: {
    PatrolDialog
  },
  setup(_, { emit }) {

    const state = reactive({
      show: false,
      weatherStationIcon, // icon
      title: '',
      curRow: null,
      rules: {
        supTemp: [
          { required: true, message: '请输入数字', trigger: 'blur' },
          {
            pattern: /^\d+(\.\d{0,2})?$/,
            message: '请输入数字,最多保留两位小数',
            trigger: 'blur',
          },
        ],
        supPres: [
          { required: true, message: '请输入数字', trigger: 'blur' },
          {
            pattern: /^\d+(\.\d{0,3})?$/,
            message: '请输入数字,最多保留三位小数',
            trigger: 'blur',
          },
        ],
        supHeat: [
          { required: true, message: '请输入数字', trigger: 'blur' },
          {
            pattern: /^\d+(\.\d{0,2})?$/,
            message: '请输入数字,最多保留两位小数',
            trigger: 'blur',
          },
        ],
        supFlow: [
          { required: true, message: '请输入数字', trigger: 'blur' },
          {
            pattern: /^\d+(\.\d{0,2})?$/,
            message: '请输入数字,最多保留两位小数',
            trigger: 'blur',
          },
        ],
      },
    })

    const methods = {
      // 打开弹窗
      async open(curRow) {
        state.show = true;
        state.curRow = curRow;
        state.title = `修改表单数据[${curRow.outletName}]`
        // 设置选项
        initFormData.value = curRow.timeDataList
        // initFormData = [
        //   { start: '9', end: '12', supTemp: '45', supPres: '12', hour: '11', supHeat: '2', supFlow: '7', hourSupHeat: '22' },
        //   { start: '15', end: '18', supTemp: '66', supPres: '36', hour: '2', supHeat: '10', supFlow: '5', hourSupHeat: '20' },
        //   { start: '18', end: '23', supTemp: '89', supPres: '65', hour: '3', supHeat: '33', supFlow: '6', hourSupHeat: '99' },
        //   { start: '23', end: '9', supTemp: '36', supPres: '55', hour: '4', supHeat: '1', supFlow: '3', hourSupHeat: '4' }
        // ]
      },

      // 保存
      save(ruleFormRef) {
        // 创建一个数组来存储每个表单的校验结果
        const formValidationResults = [];

        // 循环遍历每个表单
        for (let i = 0; i < ruleFormRef.length; i++) {

          // 获取当前表单的引用
          const formRef = ruleFormRef[i];
          // 校验当前表单
          formRef.validate((valid) => {
            // 将校验结果存储到数组中
            formValidationResults[i] = valid;

            if (i === ruleFormRef.length - 1) {
              const allFormsValid = formValidationResults.every((result) => result);
              if (allFormsValid) {
                // 执行提交操作
                methods.submitForms();
              } else {
                console.log('error submit!')
                ElMessage.error('修改失败')
              }
            }
          });
        }
      },

      submitForms() {
        let data = {
          outletId: state.curRow.outletId,
          getTime: state.curRow.getTime,
          timeDataList: initFormData.value
        }
        getUpdateTimeDataList(data).then(res => {
          if (res.code == '0') {
            ElMessage.success('修改成功');
            // 刷新表格数据
            emit('saveSuccess');
            state.show = false;
          } else {
            ElMessage.error(`修改失败:${res?.msg}`);
          }
        }).catch(err => {
          console.log(err)
          ElMessage.error('修改失败')
        })
      },

      // 重置
      cancel(formEl) {
        if (!formEl) return
        // 循环遍历每个表单
        for (let i = 0; i < formEl.length; i++) {
          // 获取当前表单的引用
          const formRef = formEl[i];
          formRef.resetFields()
        }
      },

      handleBeforeClose(formEl) {
        if (!formEl) return
        // 循环遍历每个表单
        for (let i = 0; i < formEl.length; i++) {
          // 获取当前表单的引用
          const formRef = formEl[i];
          formRef.resetFields()
        }
        state.show = false
      },
    }


    watch(
      initFormData,
      debounce((newVal, oldVal) => {
        newVal.forEach(item => {
          // 监听item.supHeat的变化
          watch(() => item.supHeat, (newVal, oldVal) => {
            // 更新item.hourSupHeat的值
            item.hourSupHeat = String(item.supHeat * item.hour);
          });
        });
      }, 300),
      { deep: true }
    );

    onMounted(() => {
    })
    return {
      ...toRefs(state),
      ...methods,
      initFormData,
      ruleFormRef
    }
  }
}
</script>
<style lang='less' scoped>
.dialog-title {
  display: flex;
  font-size: 16px;
  font-family: MicrosoftYaHeiSemibold;
  color: var(--gdky-main-content-color);
  line-height: 24px;
  padding-bottom: var(--base-padding);

  img {
    margin-right: 8px;
  }
}

.formPart {
  display: flex;
  flex-direction: column;
  justify-content: center;
  overflow: hidden;
}
</style>

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

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

相关文章

MySQL学习(五)——索引

文章目录 1. 索引介绍2. 索引结构2.1 索引结构介绍2.2 二叉树2.3 B-Tree2.4 BTree2.5 Hash 3. 索引分类3.1 索引分类3.2 聚集索引和二级索引 4 索引语法4.1 语法介绍4.2 数据准备4.3 索引演示 5 SQL 性能优化5.1 执行频率查询5.2 慢查询日志5.3 profile详情5.4 explain 6 索引使…

谈谈 Redis 如何来实现分布式锁

谈谈 Redis 如何来实现分布式锁 基于 setnx 可以实现&#xff0c;但是不是可重入的。 基于 Hash 数据类型 Lua脚本 可以实现可重入的分布式锁。 获取锁的 Lua 脚本&#xff1a; 释放锁的 Lua 脚本&#xff1a; 但是还是存在分布式问题&#xff0c;比如说&#xff0c;一个客…

金融信息化研究所与YashanDB等单位启动金融多主数据库应用行动计划

10月13日&#xff0c;2023金融业 数据库技术大会在京成功召开。会上&#xff0c;金融信息化研究所与崖山数据库YashanDB、阿里巴巴、奥星贝斯、达梦、南大通用、华为、天翼云、万里数据库、优炫数据库共同启动金融多主数据库应用行动计划&#xff0c;并成立金融多主数据库应用…

基于SpringBoot的大学生体质测试管理系统

基于SpringBoot的大学生体质测试管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 管理员界面 教师界面 学生界面 摘要 大学生体质测试管理系统是一…

谁懂?这23个关于大数据的灵魂拷问!

在企业内训行业也深耕蛮多年了&#xff0c;每次做大数据培训&#xff0c;都会遇到一些发人深省的灵魂拷问。 在这些拷问的人群中&#xff0c;有一些是没有接触过大数据平台&#xff0c;有一些甚至已经是大数据老兵。 那趁着这次机会&#xff0c;让我们索性一次把这些问题言简意…

maven依赖冲突以及解决方法

什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包&#xff0c;有多个不同的版本&#xff0c;因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包&#xff0c;这些隐式的类包会被maven间接引…

竞赛 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习YOLO抽烟行为检测 该项目较为新颖&#xff0c;适合作为竞赛课…

Yaml语法学习

SpringBoot使用一个全局的配置文件 &#xff0c; 配置文件名称是固定的 application.properties&#xff08;官方不推荐&#xff09; 语法结构 &#xff1a; keyvalue application.yml 语法结构 &#xff1a;key&#xff1a;空格 value server:port: 8081 配置文件的作用 &…

jvm 各个版本支持的参数

知道一些 jvm 调优参数&#xff0c;但是没有找到官网对应的文档&#xff0c;在网上的一些文章偶然发现&#xff0c;记录一下。 https://docs.oracle.com/en/java/javase/ 包含各个版本 jdk 8 分为 windows 和 unix 系统 https://docs.oracle.com/javase/8/docs/technotes/too…

关于CW32单片机pack包安装 KEIL IAR

CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接&#xff1a;武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链&#xff1a; • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…

重生奇迹mu宠物带来不一样的体验

重生奇迹mu宠物有什么作用&#xff1f; 全新版本中更是推出了各种宠物&#xff0c;在玩游戏时还可以带着宠物&#xff0c;一起疯狂的刷怪等等&#xff0c;可以为玩家带来非常不错的游戏体验&#xff0c;那么下面就来给大家说说各种宠物适合做什么事情。 1、强化恶魔适合刷怪 …

电脑无法安装软件怎么办?

无论是个人电脑还是办公电脑&#xff0c;无一例外的都会安装一些软件来帮助我们使用。我们经常在电脑上下载软件&#xff0c;而且会设置下载安装到空余空间大的盘里&#xff0c;但是有时候我们的盘里显示还有很多的空闲空间&#xff0c;但我们安装软件的时候就是无法安装&#…

共享盘文件如何防止别人恶意删除

在如今数字化信息交流的社会中&#xff0c;共享文件已经成为很常见的设置了。然而&#xff0c;对于共享盘文件而言&#xff0c;恶意删除是一种常见的安全威胁&#xff0c;因此用户需要掌握一些方法来保护自己的文件安全。本文将介绍防止别人恶意删除共享盘文件的方法&#xff0…

零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍

概述&#xff1a; 在华为开发者大会2023年8月4日(HDC.Together)大会上,HarmonyOS 4正式发布&#xff0c;其实在2021年那会学习了一点鸿蒙的开发&#xff1a; 不过因为现在的鸿蒙手机完全兼容Android应用&#xff0c;所以学习动力也不是很足&#xff0c;一直就搁置了&#xff0…

搭建GPFS双机集群

1.环境说明&#xff1a; 系统主机名IP地址内存添加共享磁盘大小Centos7.9gpfs1192.168.10.1012G20GCentos7.9gpfs2192.168.10.1022G20G 2.环境配置&#xff1a; 配置网路IP地址&#xff1a; 修改网卡会话&#xff1a; nmcli connection modify ipv4.method manual ipv4.addre…

Web自动化测试中会遇到的特殊场景

前言 做Web自动化测试会遇到一些特殊的场景&#xff0c;在编写自动化脚本时&#xff0c;需要根据具体情况进行处理。 同时&#xff0c;我也准备了一份软件测试视频教程&#xff08;含接口、自动化、性能等&#xff09;&#xff0c;需要的可以直接在下方观看&#xff0c;或者直…

Apache Shiro 组件反序列化漏洞分析

概述 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 它的原理比较简单&#xff1a;为了让浏览器或服务器重启后用户不丢失…

『C语言进阶』const详解

&#x1f525;博客主页&#xff1a; 小羊失眠啦 &#x1f516;系列专栏&#xff1a; C语言、Linux &#x1f325;️每日语录&#xff1a;生活便是寻求新的知识。 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 一、什么是const 常类型&#xff0c;使用类型修饰符const说明的类…

ZY Player:影视爱好者的万能播放器

如果你是一位影视爱好者&#xff0c;一定有过为寻找一款支持各种影视资源、能解析VIP权限的播放器而头疼的经历。今天&#xff0c;我要为大家介绍一款被称为万能影视资源播放器的ZY Player&#xff0c;它由网友Hiram-Wong二次开发&#xff0c;并且是开源免费的 导航 强大的影视…

马来西亚考虑对TikTok电商实施禁令:定价和数据隐私问题浮出水面

近日&#xff0c;马来西亚政府考虑跟进印尼的政策&#xff0c;对社交媒体平台TikTok的电商交易采取一系列限制措施。这一决定产生的影响不容忽视&#xff0c;不仅对TikTok自身&#xff0c;也对整个电商行业和数字经济领域产生了重大影响。 背景 这一决策的背后&#xff0c;是马…