Element UI 2.x 校验数组每个对象中的name不能为空

在 Element UI 2.x 中验证数组中多个对象的 name 字段不能为空,需要结合 el-form + el-form-itemprop 属性和自定义校验规则实现。核心是通过 prop 绑定数组索引 来定位每个对象的 name,并统一设置校验规则。

完整实现步骤

1. 基础结构(HTML 部分)

循环渲染数组时,给每个 el-form-itemprop 设置为 数组名[索引].字段名(如 list[0].name),确保表单能识别每个元素的字段:

vue 复制代码
<template>
  <el-form 
    ref="form" 
    :model="form" 
    :rules="rules" 
    label-width="80px"
  >
    <!-- 循环渲染数组中的对象 -->
    <div v-for="(item, index) in form.list" :key="index">
      <!-- prop 格式:数组字段名[索引].要校验的字段名 -->
      <el-form-item 
        label="名称" 
        :prop="`list[${index}].name`"  <!-- 关键:绑定索引和字段 -->
        :rules="rules.name"  <!-- 复用同一个校验规则 -->
      >
        <el-input v-model="item.name"></el-input>
      </el-form-item>
    </div>

    <el-button type="primary" @click="submitForm">提交</el-button>
  </el-form>
</template>
2. 数据与校验规则(JS 部分)
  • data 中定义表单数据(包含数组 list);
  • rules 中给 name 字段设置 非空校验规则(支持自定义提示):
javascript 复制代码
<script>
export default {
  data() {
    return {
      form: {
        // 要校验的数组,每个对象包含 name 字段
        list: [
          { name: '' },  // 第一个对象
          { name: '' },  // 第二个对象
          { name: '' }   // 可动态添加更多
        ]
      },
      rules: {
        // 校验 name 字段的规则(适用于数组中所有对象)
        name: [
          { 
            required: true, 
            message: '名称不能为空',  // 自定义提示文字
            trigger: 'blur'  // 失焦时触发校验
          }
        ]
      }
    };
  },
  methods: {
    // 提交表单时手动校验
    submitForm() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          this.$message.success('校验通过');
        } else {
          this.$message.error('请完善所有必填项');
          return false;
        }
      });
    }
  }
};
</script>
3. 动态添加/删除数组元素(扩展场景)

如果数组长度是动态变化的(如可点击添加新对象),需要确保新增元素也能被校验。关键是 保持 prop 与数组索引同步

vue 复制代码
<template>
  <el-form ref="form" :model="form" :rules="rules">
    <div v-for="(item, index) in form.list" :key="index">
      <el-form-item 
        label="名称" 
        :prop="`list[${index}].name`" 
        :rules="rules.name"
      >
        <el-input v-model="item.name"></el-input>
        <!-- 删除当前行 -->
        <el-button 
          type="danger" 
          icon="el-icon-delete" 
          @click="form.list.splice(index, 1)"
        ></el-button>
      </el-form-item>
    </div>

    <!-- 添加新行 -->
    <el-button type="primary" @click="form.list.push({ name: '' })">
      添加
    </el-button>
    <el-button type="success" @click="submitForm">提交</el-button>
  </el-form>
</template>
  • 新增元素时,form.list.push({ name: '' }) 会自动触发循环,prop 会随索引动态更新;
  • 删除元素后,索引重新排序,prop 也会自动适配,无需额外处理。

核心原理

  1. prop 的绑定格式数组字段名[索引].字段名(如 list[0].name)是 Element UI 识别数组内字段的固定语法,必须严格遵循;
  2. 复用校验规则 :通过 :rules="rules.name" 让数组中所有对象的 name 字段共享同一套非空校验规则,避免重复定义;
  3. 动态校验适配 :数组长度变化时,只要 v-forindex 正确,prop 会自动关联新元素,确保校验生效。

常见问题

  • 校验不生效? 检查 prop 格式是否正确(是否包含数组名、索引、字段名),或 v-model 是否正确绑定到 item.name
  • 提示信息不显示? 确保 rules 中定义了 message,且 trigger 触发方式(blur/change)与交互匹配;
  • 动态添加后不校验? 新增元素时需初始化 name: ''(避免 undefined),否则校验可能失效。

按照这个方式,即可实现数组中所有对象 name 字段的非空校验,且支持动态增删场景。

相关推荐
沐墨染1 小时前
敏感词智能检索前端组件设计:树形组织过滤与多维数据分析
前端·javascript·vue.js·ui·数据挖掘·数据分析
xkxnq2 小时前
第二阶段:Vue 组件化开发(第 18天)
前端·javascript·vue.js
WebGISer_白茶乌龙桃2 小时前
Cesium实现“悬浮岛”式,三维立体的行政区划
javascript·vue.js·3d·web3·html5·webgl
计算机学姐2 小时前
基于SpringBoot的汽车租赁系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·spring·汽车·推荐算法
不一样的少年_2 小时前
产品催: 1 天优化 Vue 官网 SEO?我用这个插件半天搞定(不重构 Nuxt)
前端·javascript·vue.js
BingoGo2 小时前
免费可商用商业级管理后台 CatchAdmin V5 正式发布 插件化与开发效率的全面提升
vue.js·后端·php
一 乐10 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
北辰alk12 小时前
Vue 模板引擎深度解析:基于 HTML 的声明式渲染
vue.js
北辰alk12 小时前
Vue 自定义指令完全指南:定义与应用场景详解
vue.js
北辰alk12 小时前
Vue 动态路由完全指南:定义与参数获取详解
vue.js