vue中使用v-for实现两次嵌套循环,判断某子元素是否显示,进行复杂表单校验

一、需求场景:

有以下一个使用场景,名称111、名称222、名称333,是放在一个大数组里的,然后通过第一层for循环显示出来的。名称333数组里又包含自己的子数组,子数组再通过第二次for循环展示出来。当我们选择发放方式的时候,符合选择条件的只显示自己对应那一行的首发比例。最后对子数组里的每一项进行表单校验。
在这里插入图片描述
关于数组结构,我们前端这边可以自定义写好。

const form = reactive({title: '',templateList: [{key: 'region',label: '名称111',list: [{ settlement_type: '1', limit_days: '0', rate: '', settlement_way: '' }]}, {key: 'partner',label: '名称222',list: [{ settlement_type: '2', limit_days: '0', rate: '', settlement_way: '' }]}, {key: 'user',label: '名称333',list: [{ settlement_type: '3', limit_days: '30', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '60', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '180', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '90', rate: '', settlement_way: '' },]}]
})

二、解决方法:

可以考虑使用 v-for 进行双层嵌套循环,其中有几个需要注意的点:

1. 父循环中的 index 与子循环的 index 写的时候必须区分开,不要搞混。
2. 不要忽略 :key 值。父级循环对应父级的index,子级循环对应子级的index。

三、代码实现:

<template>
<!-- ========= 这是循环取出第一层数组,保存在item里面 ======== --><divv-for="(item,index) in form.templateList":key="index"><div style="margin-bottom:10px;">{{ item.label }}</div><!-- ========= 这是循环出第二层数组,注意要在item里面取出 ======== --><a-row:gutter="15"v-for="(itemChild,indexChild) in item.list":key="indexChild"><a-col :span="8"><a-form-item:field="`templateList[${index}].list[${indexChild}].rate`":label="Number(itemChild.limit_days) > 0 ? itemChild.limit_days + '天利息':'利息'":rules="formRules.rate"><a-inputv-model="itemChild.rate"placeholder="请填写"allow-clear><template #append>%</template></a-input></a-form-item></a-col><a-col :span="8"><a-form-item:field="`templateList[${index}].list[${indexChild}].settlement_way`"label="发放方式":rules="formRules.settlement_way"><a-selectv-model="itemChild.settlement_way"placeholder="请选择"allow-clear@change="((val) => {changeSelect(val,itemChild)})"><a-optionv-for="item in giveModelList":key="item.key":label="item.val":value="item.key"/></a-select></a-form-item></a-col><a-col:span="8"v-if="itemChild.settlement_way === '3'"><a-form-item:field="`templateList[${index}].list[${indexChild}].first_rate`"label="首发比例":rules="formRules.first_rate"><a-inputv-model="itemChild.first_rate"placeholder="请填写"allow-clear><template #append>%</template></a-input></a-form-item></a-col></a-row></div>
</template><script setup lang="ts">
import { ref, unref, reactive, onMounted } from "vue"
const form = reactive({title: '',templateList: [{key: 'region',label: '名称111',list: [{ settlement_type: '1', limit_days: '0', rate: '', settlement_way: '' }]}, {key: 'partner',label: '名称222',list: [{ settlement_type: '2', limit_days: '0', rate: '', settlement_way: '' }]}, {key: 'user',label: '名称333',list: [{ settlement_type: '3', limit_days: '30', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '60', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '180', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '90', rate: '', settlement_way: '' },]}]
})const formRules = {rate: [{ required: true, validator: validatePercentageNumber, trigger: 'blur' }],settlement_way: [{ required: true, trigger: 'change', message: '请选择' }],first_rate: [{ required: true, validator: validatePercentageNumber, trigger: 'blur' }]
}const giveModelList = [{ key: '1', val: '一次性发放' },{ key: '2', val: '每天发放' },{ key: '3', val: '首次+每天' }
]
</script><style lang="less" scoped></style>

方案1:

这种方式最简单,通过直接判断子数组 settlement_way 字是否等于 ‘3’

   v-if="itemChild.settlement_way === '3'"

方案2:

一开始没想到用 settlement_way 字段是否等于 ‘3’,能直接解决。使用了另外的方法,也记录下,这种方法也经常会用到。

  1. 新建一个数组,符合判断条件的,使用 父级index和子级index 组装成 字符串 ,然后push进新数组;
  2. 不符合判断条件的,for循环新数组,如果当前 父级index和子级index 组装成的 字符串 等于 数组里的某值,则从数组里删除该值。
  3. html中 v-if 判断数组中是否( includes )包含该值,有的话直接显示首发比例input,否则隐藏。
<a-col :span="8"><a-form-item:field="`templateList[${index}].list[${indexChild}].settlement_way`"label="发放方式":rules="formRules.settlement_way"><a-selectv-model="itemChild.settlement_way"placeholder="请选择"allow-clear@change="((val) => {changeSelect(val,index,indexChild,itemChild)})"><a-optionv-for="item in giveModelList":key="item.key":label="item.val":value="item.key"/></a-select></a-form-item>
</a-col><a-col:span="8"v-if="indexArr.length > 0 && indexArr.includes(`${index}${indexChild}`)"><a-form-item:field="`templateList[${index}].list[${indexChild}].first_rate`"label="首发比例":rules="formRules.first_rate"><a-inputv-model="itemChild.first_rate"placeholder="请填写"allow-clear><template #append>%</template></a-input></a-form-item>
</a-col>
const indexArr = ref([])
function changeSelect(val:any, index:any, indexChild:any, itemChild:any) {if (val == '3') {indexArr.value.push(`${index}${indexChild}`)} else {for (let i = 0; i < indexArr.value.length; i++) {if (`${index}${indexChild}` == indexArr.value[i]) {indexArr.value.splice(i, 1)}}delete itemChild.first_rate}console.log(indexArr.value, 'indexArr') // ['00','10','21','22','23']
}

打印结果:

在这里插入图片描述

四、对复杂对象型数组进行表单验证

因为所有的都是必填项,所以涉及到子数组里每一项的校验问题。需要给每个元素添加校验。
先看下这个验证的效果图。

在这里插入图片描述

已知的数据结构:

const form = reactive({title: '',templateList: [{key: 'region',label: '名称111',list: [{ settlement_type: '1', limit_days: '0', rate: '', settlement_way: '' }]}, {key: 'partner',label: '名称222',list: [{ settlement_type: '2', limit_days: '0', rate: '', settlement_way: '' }]}, {key: 'user',label: '名称333',list: [{ settlement_type: '3', limit_days: '30', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '60', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '180', rate: '', settlement_way: '' },{ settlement_type: '3', limit_days: '90', rate: '', settlement_way: '' },]}]
})const formRules = {rate: [{ required: true, validator: validatePercentageNumber, trigger: 'blur' }],settlement_way: [{ required: true, trigger: 'change', message: '请选择' }],first_rate: [{ required: true, validator: validatePercentageNumber, trigger: 'blur' }]
}

定义好校验规则,这里只需要设置 :field 在数据对象中的path就行。 :field=“templateList[${index}].list[${indexChild}].rate

  <divclass="outline"v-for="(item,index) in form.templateList":key="index"><div style="margin-bottom:10px;">{{ item.label }}</div><a-row:gutter="15"v-for="(itemChild,indexChild) in item.list":key="indexChild"><a-col :span="8"><a-form-item:field="`templateList[${index}].list[${indexChild}].rate`":label="Number(itemChild.limit_days) > 0 ? itemChild.limit_days + '天利息':'利息'":rules="formRules.rate"><a-inputv-model="itemChild.rate"placeholder="请填写"allow-clear><template #append>%</template></a-input></a-form-item></a-col>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux(驱动编程)(调试技术)(imx6ull)

调试技术 1、在写驱动程序时函数未包含头文件 在linux内核源码driver/char目录下输入命令 grep “XXXX” * -nrw查看次函数在那个.c里用过&#xff0c;然后在vscode界面下按altp搜索这个.c就可以参考这个.c的头文件。 2、编译完驱动跟应用后先 insmod xxx.ko //插入 cat /…

4.9 x64dbg 内存处理与差异对比

LyScript 插件中针对内存读写函数的封装功能并不多&#xff0c;只提供了最基本的内存读取和内存写入系列函数的封装&#xff0c;本章将继续对API接口进行封装&#xff0c;实现一些在软件逆向分析中非常实用的功能&#xff0c;例如ShellCode代码写出与置入&#xff0c;内存交换&…

Nativefier 将网站打包成桌面程序

Nativefier是一个命令行工具&#xff0c;仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序 1 Mac 电脑 安装Nativefier 打开终端 npm install nativefier -g2 创建一个桌面应用程序&#xff1a; nativefier "https://biglead.blog.csdn.net/article/details…

Pytorch基本使用—激活函数

✨1 介绍 ⛄ 1.1 概念 激活函数是神经网络中的一种数学函数&#xff0c;它被应用于神经元的输出&#xff0c;以决定神经元是否应该被激活并传递信号给下一层。常见的激活函数包括Sigmoid函数、ReLU函数、Tanh函数等。 &#x1f384; 1.2 性质 激活函数是神经网络中的一种重…

RFID系统的部署流程和关键环节

RFID系统的部署与集成对于实现高效的物流管理、提升运营效益和实现自动化过程至关重要。本文将为您解释RFID系统的部署流程和关键环节&#xff0c;并探讨RFID系统与现有IT基础设施的集成方式。我们还将提供RFID系统部署和集成中常见问题的解决方案&#xff0c;帮助您制定RFID系…

ELK日志分析系统

目录 开始 第一台安装elasticsearch-head插件 第一台node1安装logstash 配置收集系统日志 第一台 安装kibana第一台 第三台 简述&#xff1a; 日志分析是运维工程师解决系统故障&#xff0c;发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运…

cesium 实现多颗卫星与多颗地面站雷达通信效果

最主要的部分是计算空间内两点之间的距离以及卫星对地点是否在雷达扫描范围内 先看效果 1.计算空间内两点之间的距离 //计算距离 function distance(point1, point2) {var point1cartographic = Cesium.Cartographic.fromCartesian(point1);var</

基于STM32智能窗帘控制系统仿真设计(含源程序+proteus仿真+讲解视频)

# 基于STM32智能窗帘设计&#xff08;含源程序proteus仿真&#xff09; 仿真&#xff1a;proteus8.11 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 编号C0007 资料下载链接 讲解视频 基于STM32的简易智能窗帘控制系统仿真设计 功能说明&#xff1a; 实现功能&a…

Kubernetes:快速入门指南

原文作者&#xff1a;NGINX 原文链接&#xff1a;Kubernetes&#xff1a;快速入门指南 转载来源&#xff1a;NGINX 官方网站 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 什么是 Kubernetes&#xff1f; Kubernetes又称为 k8s&#xff0c;是一个开源平台&#xff…

Java虚拟机(JVM)

Java虚拟机&#xff08;JVM&#xff09; 类加载 类加载 Java类加载的过程可以分为以下几个步骤&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;类加载的第一步是将类的字节码文件加载到内存中。 通过类的全名&#xff0c;全限定名&#xff08;包括包名和类名&…

【STM32MP135】移除stm32mp135d-atk-u-boot.dtsi设备树config节点,否则会进入fastboot下载模式

文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/arch/arm/dts/stm32mp135d-atk-u-boot.dtsi

flutter开发实战-Theme主题切换

flutter开发实战-Theme主题切换 之前做的应用中有用到Theme主题切换&#xff0c;一直没有整理&#xff0c;这里整理一下。 使用的是Android studio 一、效果图 二、创建ThemeModel // 提供五套可选主题色 const _themes <MaterialColor>[Colors.blue,Colors.cyan,Co…