vue elementUI 表单校验功能之数组多层嵌套

我将为您提供关于“vue elementUI 表单校验功能之数组多层嵌套”的完整攻略。

1. 前置知识

在学习“vue elementUI 表单校验功能之数组多层嵌套”前,需要掌握以下知识点:

  • Vue.js基础使用方法
  • Vue组件和Props使用方法
  • ElementUI表单组件使用方法

2. 数组多层嵌套表单校验方法

默认情况下,ElementUI只针对表单对象进行校验,但是在实际开发中,我们经常会遇到需要校验数组中某个元素的情况。例如在表单中需要填写多个电话号码,每个电话号码又包含了区号、号码和分机号等信息。

假设我们的数据结构如下所示:

form: {
  name: '',
  phones: [
    {
      areaCode: '',
      number: '',
      ext: ''
    }
  ]
},

(1). 自定义校验规则

首先我们需要定义一个自定义的校验规则,并将其封装成为一个函数。该函数接收两个参数:value和callback。其中,value表示需要校验的值,callback表示校验完成后需要执行的函数。

下面是一个自定义校验规则的示例代码:

// 自定义电话号码校验规则
const validatePhone = (rule, value, callback) => {
  if (!value) {
    return callback(new Error('手机号码不能为空'));
  }
  const reg = /^1[3|4|5|6|7|8|9]\d{9}$/;
  if (!reg.test(value)) {
    callback(new Error('您输入的手机号码不合法'));
  } else {
    callback();
  }
};

(2). 组件中使用校验规则

在组件中,我们需要使用到ElementUI提供的校验规则validator。我们可以在每个需要校验的表单项中定义validator属性,并将上面定义的自定义规则传递进去。

下面是示例代码:

<el-form-item label="电话号码" prop="phones">
  <el-row v-for="(phone, index) in form.phones" :key="index">
    <el-col span="6">
      <el-form-item :prop="`phones.${index}.areaCode`" label="区号">
        <el-input v-model="phone.areaCode"></el-input>
      </el-form-item>
    </el-col>
    <el-col span="9">
      <el-form-item :prop="`phones.${index}.number`" label="号码">
        <el-input v-model="phone.number" v-validate:phone-number="{ validator: validatePhone, trigger: 'blur' }"></el-input>
        <span v-show="errors.has(`phones.${index}.number`)" class="error">{{ errors.first(`phones.${index}.number`) }}</span>
      </el-form-item>
    </el-col>
    <el-col span="9">
      <el-form-item :prop="`phones.${index}.ext`" label="分机号">
        <el-input v-model="phone.ext"></el-input>
      </el-form-item>
    </el-col>
  </el-row>
</el-form-item>

在上面的代码中,我们将在每个号码输入框中定义v-validate指令,并传递自定义校验规则validatePhone。同时,我们也定义了一个prop属性,该属性的值为phones.${index}.number,表示phones数组中第index个元素的number属性需要进行校验。注意,该属性必须以字符串的形式进行传递。

3. 示例说明

(1). 校验规则示例

假设我们需要在表单中,验证输入的电话号码是否符合要求。例如,我们需要输入3个电话号码,每个电话号码由一个区号、一个号码和一个分机号组成,其中号码为必填项。对于号码的校验,我们使用上面所提供的自定义校验规则validatePhone。下面是示例代码:

<template>
  <el-form :model="form" ref="form" :rules="rules" label-width="80px" style="width: 800px;">
    <el-form-item label="姓名" prop="name">
      <el-input v-model="form.name"></el-input>
    </el-form-item>
    <el-form-item label="电话号码" prop="phones">
      <el-row v-for="(phone, index) in form.phones" :key="index">
        <el-col span="6">
          <el-form-item :prop="`phones.${index}.areaCode`" label="区号">
            <el-input v-model="phone.areaCode"></el-input>
          </el-form-item>
        </el-col>
        <el-col span="9">
          <el-form-item :prop="`phones.${index}.number`" label="号码">
            <el-input v-model="phone.number" v-validate:phone-number="{ validator: validatePhone, trigger: 'blur' }"></el-input>
            <span v-show="errors.has(`phones.${index}.number`)" class="error">{{ errors.first(`phones.${index}.number`) }}</span>
          </el-form-item>
        </el-col>
        <el-col span="9">
          <el-form-item :prop="`phones.${index}.ext`" label="分机号">
            <el-input v-model="phone.ext"></el-input>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm('form')">提交表单</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        phones: [
          {
            areaCode: '',
            number: '',
            ext: ''
          },
          {
            areaCode: '',
            number: '',
            ext: ''
          },
          {
            areaCode: '',
            number: '',
            ext: ''
          }
        ]
      },
      rules: {
        name: [
          { required: true, message: '姓名不能为空', trigger: 'blur' },
          { min: 2, max: 10, message: '长度应在2-10个字符之间', trigger: 'blur' }
        ],
        phones: [
          {
            validator: (rule, value, callback) => {
              if (!value || value.length === 0) {
                callback(new Error('至少需要填写一个电话号码'));
              } else {
                callback();
              }
            }
          }
        ]
      }
    };
  },
  methods: {
    validatePhone(rule, value, callback) {
      if (!value) {
        return callback(new Error('手机号码不能为空'));
      }
      const reg = /^1[3|4|5|6|7|8|9]\d{9}$/;
      if (!reg.test(value)) {
        callback(new Error('您输入的手机号码不合法'));
      } else {
        callback();
      }
    },
    submitForm(formName) {
      this.$refs[formName].validate(valid => {});
    }
  }
};
</script>

该示例会通过validator自定义校验规则,对输入的电话号码进行校验。其中,号码的校验规则由validatePhone函数实现。

(2). 数组嵌套示例

假设我们现在需要完成一个关于旅游景点的信息录入表单,其中包含景点的名称、地点和包含景点的城市。每个城市由一个名称、一个省份和一个包含景点信息的数组组成,例如:

form: {
  name: '',
  locations: [
    {
      name: '',
      province: '',
      spots: [
        {
          name: '',
          desc: ''
        }
      ]
    }
  ]
};

我们需要对这样一个多层嵌套数组进行校验。下面是示例代码:

<template>
  <el-form :model="form" ref="form" :rules="rules" label-width="80px" style="width: 800px;">
    <el-form-item label="名称" prop="name">
      <el-input v-model="form.name"></el-input>
    </el-form-item>
    <el-form-item label="旅游地点" prop="locations">
      <el-row v-for="(location, index) in form.locations" :key="index">
        <el-col span="8">
          <el-form-item :prop="`locations.${index}.name`" label="城市名称">
            <el-input v-model="location.name"></el-input>
          </el-form-item>
        </el-col>
        <el-col span="8">
          <el-form-item :prop="`locations.${index}.province`" label="所在省份">
            <el-input v-model="location.province"></el-input>
          </el-form-item>
        </el-col>
        <el-col span="8">
          <el-form-item :prop="`locations.${index}.spots`" label="景点信息">
            <el-row v-for="(spot, spotIndex) in location.spots" :key="spotIndex">
              <el-col :span="spotIndex === 0 ? 9 : 10">
                <el-form-item :prop="`locations.${index}.spots.${spotIndex}.name`" label="景点名称">
                  <el-input v-model="spot.name"></el-input>
                </el-form-item>
              </el-col>
              <el-col :span="spotIndex === 0 ? 15 : 14">
                <el-form-item :prop="`locations.${index}.spots.${spotIndex}.desc`" label="景点描述">
                  <el-input v-model="spot.desc"></el-input>
                </el-form-item>
              </el-col>
            </el-row>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm('form')">提交表单</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        locations: [
          {
            name: '',
            province: '',
            spots: [
              {
                name: '',
                desc: ''
              }
            ]
          }
        ]
      },
      rules: {
        name: [
          { required: true, message: '名称不能为空', trigger: 'blur' },
          { min: 2, max: 10, message: '长度应在2-10个字符之间', trigger: 'blur' }
        ],
        locations: [
          {
            validator: (rule, value, callback) => {
              if (!value || value.length === 0) {
                callback(new Error('至少需要填写一个旅游地点'));
              } else {
                callback();
              }
            }
          }
        ]
      }
    };
  },
  methods: {
    submitForm(formName) {
      this.$refs[formName].validate(valid => {});
    }
  }
};
</script>

该示例会对所有表单项进行校验,其中locations数组的校验规则为至少需要填写一个旅游地点。在locations中每个城市的子表单都需要一个自定义的prop属性,例如locations.${index}.spots.${spotIndex}.name,表示spots数组中第spotIndex个元素的name属性需要进行校验。同时,在嵌套的子表单中,也需要对每个表单项进行相应的校验规则的定义。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue elementUI 表单校验功能之数组多层嵌套 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • vue项目中使用vue-layer弹框插件的方法

    以下是关于Vue项目中使用vue-layer弹框插件的方法的完整攻略: 1. 下载vue-layer 在Vue项目中使用vue-layer弹框插件之前,首先需要下载vue-layer。可以通过npm包管理器来下载。 npm install vue-layer –save 在安装完成后,可以通过以下方式引入和使用vue-layer弹框。 2. 引入vue-l…

    Vue 2023年5月28日
    00
  • vue2.0实现前端星星评分功能组件实例代码

    下面我将为你详细讲解“vue2.0实现前端星星评分功能组件实例代码”的完整攻略。 1. 安装依赖 首先,我们需要在项目中安装vue-router,并且在前端界面中安装vue2-star-rating这个插件。在终端中输入以下命令: npm install vue-router npm install vue2-star-rating 2. 路由配置 接下来,…

    Vue 2023年5月28日
    00
  • Vue中computed计算属性和data数据获取方式

    下面是关于Vue中computed计算属性和data数据获取方式的完整攻略。 1. 什么是computed计算属性 在Vue中,computed计算属性是一种特殊的属性。它的值不是直接提供的,而是通过计算而来的。computed计算属性是基于它所依赖的数据属性的值进行计算。当依赖的数据属性的值发生改变时,计算属性的值会自动刷新。 computed计算属性常用…

    Vue 2023年5月28日
    00
  • 优雅处理前端异常的几种方式推荐

    错误边界 错误边界是React应用中一种异常处理机制,用于处理任何可能在组件树中发生的未捕获 JavaScript 错误。使用错误边界的方式来处理异常会使整个应用程序更具有容错性,使崩溃影响范围更小。 要创建一个错误边界,只需要实现一个名为 static getDerivedStateFromError() 或 componentDidCatch() 生命周…

    Vue 2023年5月28日
    00
  • Vue3中的ref为何要用.value进行值的调用呢

    在Vue3中,ref用作响应式数据的定义和访问,但其访问方式与Vue2.x有所不同,需要使用 .value 属性来访问具体的值。 这是因为 Vue3.x 中的响应式系统使用了 ES6 的 Proxy,而 .value 非常巧妙地利用了 ES6 Proxy 的 get 和 set 方法。每个 ref 对象本身其实不是一个值,而是一个包含一个值的对象,并且这个值…

    Vue 2023年5月27日
    00
  • Vue双向绑定原理及实现方法

    Vue双向绑定原理及实现方法 1. 什么是Vue双向绑定 双向绑定是Vue框架重要的特点之一,意味着当数据发生改变时,视图会随之发生变化,同时视图的修改也会同步到数据中。这种机制使得开发者只需要关注逻辑的实现而不用担心数据如何与视图同步,便于提高开发效率和减少出错概率。 2. 双向绑定原理 Vue中的双向绑定原理主要是通过以下几个步骤实现的: 数据劫持 首先…

    Vue 2023年5月28日
    00
  • Vue 2.0 基础详细

    Vue 2.0 基础详细攻略 Vue.js是一款流行的JavaScript框架,它可以使我们更容易地编写可重用的组件以及可交互的应用程序。Vue 2.0是Vue.js的最新版本,它具有更高的性能和更好的开发体验。在本文中,我们将介绍Vue.js 2.0的基础知识和相关概念,以及如何使用Vue.js 2.0构建现代Web应用程序。 Vue.js基础 Vue.j…

    Vue 2023年5月27日
    00
  • 浅谈Vue数据响应

    浅谈Vue数据响应 Vue作为一款现代化的前端框架,在数据响应方面使用了响应式编程的思想,以方便开发者管理数据。在本文中,我们将深入探讨Vue数据响应的相关知识。 什么是Vue数据响应 Vue数据响应是指当Vue的组件状态(data)发生变化时,视图自动更新。Vue通过使用响应式的观察者模式实现数据和UI的双向绑定(Two-Way-Binding),即当数据…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部