当前位置: 首页 > news >正文

动态增减输入框并做校验

仅做记录之用

<template><el-formref="createForm":model="createForm":rules="formRules"label-width="180px"style="max-width: 800px"><!-- 动态 --><div v-for="(switchItem, index) in createForm.switches" :key="index" style="margin-bottom: 16px"><el-row :gutter="20"><el-col :span="10"><el-form-itemlabel="名称":prop="`switches.${index}.switch_name`"><el-input v-model="switchItem.switch_name" placeholder="名称" /></el-form-item></el-col><el-col :span="10"><el-form-itemlabel="IP":prop="`switches.${index}.switch_ip`"><el-input v-model="switchItem.switch_ip" placeholder="如:192.168.1.10" /></el-form-item></el-col><el-col :span="4" style="display: flex; align-items: center"><el-buttontype="primary"size="small"icon="el-icon-plus"@click="addSwitch"></el-button><el-buttonv-if="createForm.switches.length > 1"type="danger"size="small"icon="el-icon-minus"@click="removeSwitch(index)"></el-button></el-col></el-row></div><el-form-item><el-button type="primary" @click="add"> 添加</el-button><el-button type="success" @click="submitForm">提交</el-button></el-form-item></el-form>
</template><script>
export default {name: 'createForm',data() {return {createForm: {switches: [{ switch_name: '', switch_ip: '' }],},// ⭐️ 手动管理 rules,避免 computed 不响应formRules: {}};},computed: {// 生成完整校验规则generateRules() {const staticRules = {//其他参数};const dynamicRules = {};this.createForm.switches.forEach((_, index) => {// 名称dynamicRules[`switches.${index}.switch_name`] = [{ required: true, message: `第${index + 1}个名称不能为空`, trigger: 'blur' }];// IP(含格式 + 唯一性校验)dynamicRules[`switches.${index}.switch_ip`] = [{ required: true, message: `第${index + 1}个IP不能为空`, trigger: 'blur' },{validator: (rule, value, callback) => {if (!value) {callback();return;}// 格式校验const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;if (!ipv4Regex.test(value)) {callback(new Error('请输入有效的IPv4地址'));return;}const parts = value.split('.').map(Number);if (parts.some(part => isNaN(part) || part < 0 || part > 255)) {callback(new Error('IP地址每段必须在0-255之间'));return;}// 唯一性校验:检查是否与其他IP重复const ipList = this.createForm.switches.map(s => s.switch_ip);const sameCount = ipList.filter(ip => ip === value).length;if (sameCount > 1) {callback(new Error('IP不能重复'));} else {callback();}},trigger: 'blur'}];});return { ...staticRules, ...dynamicRules };}},watch: {// 监听 switches 变化,更新 rules'createIbNetGroupForm.switches': {handler() {this.formRules = this.generateRules;},deep: true}},methods: {addSwitch() {this.createForm.switches.push({ switch_name: '', switch_ip: '' });},removeSwitch(index) {this.createForm.switches.splice(index, 1);},submitForm() {this.$refs.createForm.validate(valid => {if (valid) {this.$message.success('✅ 提交成功!');console.log('提交数据:', this.createForm);// TODO: 调用 API} else {this.$message.error('❌ 表单校验未通过');}});}},mounted() {// 初始化规则this.formRules = this.generateRules;}
};
</script><style scoped>
.el-divider {margin: 24px 0;
}
</style>

http://www.dtcms.com/a/545480.html

相关文章:

  • Matlab 开启并行池
  • 仓颉内存分配优化:从分配器到无分配编程的演进
  • MATLAB的KL展开随机场生成实现
  • MATLAB基于IOWA算子的投影法加权几何平均组合预测模型
  • Jupyter Notebook 使用指南:从入门到进阶
  • 基于MATLAB的禁忌搜索算法解决物流网络枢纽选址问题
  • 基于MATLAB的三维结构拓扑优化实现方案
  • 汕尾网站网站建设桐乡网站二次开发
  • qData数据中台开源版快速部署教程(Docker Compose方式|官方教学视频)
  • S11e Protocol:点燃共创之火 · 重构RWA品牌未来
  • [技术前沿] 2025电商格局重构:当流量红利消失,AI与数据如何成为增长的新基石?
  • 描述网站的含义郑州正规网站制作公司
  • 做网站做手机站还是自适应站河南省住房和城乡建设部网站
  • 执行shell脚本的各种方法
  • Rust 深度解析:控制流 —— 安全的“逻辑轨道”
  • 坪山建设网站自己怎么设置网站
  • 廊坊建设部网站怎么进网站后台管理系统
  • Rust 中 LinkedList 的双向链表结构深度解析
  • 从零开始学 Maven:Java 项目管理的高效解决方案
  • FAQ05047:在进入camera或者在camera中切换场景时,出现“很抱歉,相机已停止运行”
  • 以数字域名为网址的网站网站关键词 公司
  • 网站制作书生百度认证
  • leetcode 283. 移动零 pythton
  • wap网站服务器企业网站建设方案论文
  • 嵌入式网络编程深度探索:无线网络驱动开发实战指南
  • 数学分析简明教程课后习题详解——1.2
  • --- 单源BFS权值为一算法 迷宫中离入口最近的出口 ---
  • LVGL3(Helloworld)
  • 量化交易网站开发自己的网站做弹出广告
  • 三明市建设局网站官网网络营销方案