iView UI FORM 动态添加表单项校验规则写法实例

 更新时间:2023年01月17日 09:44:07   作者:渐行渐远  
这篇文章主要为大家介绍了iView UI FORM 动态添加表单项校验规则写法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

IView UI 表单验证 深入了解

在开发xxx需求中,有个交互是动态添加问题项,并需要做表单验证,在做动态表单验证的过程中遇到了问题,记录下这次是如何解决的。

一直以来对UI框架的form表单验证只局限于 在form 加上 model、rules 、在form-item加上prop,而且要prop要与modelrules的值对应,例如:

<template>
 <Form model="questionFormData" :rules="questionRules" refs="questionFormRefs">
    <FormItem prop="question" lable="问题描述">
      <Input v-model="questionFormData.question"></Input>
    </FormItem>
  </Form>
</template>
<script>
  export default {
    data() {
      return {
        questionFormData: {
          question: ''
        },
        questionRules: {
          question: [{
            { required: true, message: "不允许为空", trigger: "blur" },
          }]
        }
      }
    },
    methods: {
      handleSubmit() {
        this.$refs[name].validate(async valid => {
          // valid true验证通过,false 验证不通过
      	});
      }
    }
  }
</script>

这里要model="questionFormData"指向对应数据对象,:rules="questionRules"指对应规则,prop="question"指对应的表单项的要验证的key(即questionFormData.question);以前只知道这么写就能触发验证规则,但是具体的原理不太清楚。

这次需要动态添加表单项,就是循环渲染FormItem,可问题来了,我要怎么去定义这个proprules,带着疑问,我查了一下iView官网,在FORM下找到对应例子

:prop="'items.' + index + '.value'"
:rules="{required: true, message: 'Item ' + item.index +' can not be empty', trigger: 'blur'}"

原来可以动态添加prop rules,只要将prop指向对应的下标即可,重新调整了一下代码

<template>
<Form model="questionFormData" :rules="questionRules" refs="questionFormRefs">
    <FormItem 
        v-for="(item, index) of questionFormData.questions"
        :prop="'questions.' + index +'.question'"
        :rules="{required: true, message: '问题' + (index + 1) + '不允许为空', trigger: 'blur'}"
        :lable="'问题' + (index + 1) +'描述"
    >
    <Input v-model="questionFormData.question[index]"></Input>
  </FormItem>
</Form>
</template>
<script>
	export default {
    data() {
      return {
        questionFormData: {
          questions: [{
            id: 1,
            question: '问题1'
          }, {
            id: 2,
            question: '问题2'
          }],
        },
        questionRules: {
        }
      }
    }
  }
</script>

经过上面的调整,动态表单的验证也生效了,这里需要注意,prop的值必须是questionFormData的key,即questions.[index].question,如上面的第一项的prop的值questions.0.question,如果换成items.0.question就不生效了。会报[iView warn]: please transfer a valid prop path to form item!,意思是说,prop的值在questionFormData中找不到。

动态表单的验证总算解决了,但是对questions.[index].question有些疑问,FormItem是如何识别字符串,并与questionFormData的值关联起来的。带着问题看一下<FormItem>源码。

探究原理

找到FormItem源码,路径node_modules/view-design/src/components/form/form-item.vue,在源码中找到答案:

computed: {
  fieldValue () {
    // FormInstance 是当前Form的实例,获取到model,也就是questionFormData
    const model = this.FormInstance.model;
    if (!model || !this.prop) { return; }
		// 此处的prop 就是 questions.0.question
    let path = this.prop;
    // 如果遇到:就替换为点,如questions:0.question -> questions.0.question
    if (path.indexOf(':') !== -1) {
      path = path.replace(/:/, '.');
    }
    // 获取到questions.0.question在questionFormData的值
    return getPropByPath(model, path).v;
  },
},
function getPropByPath(obj, path) {
  // tempObj = questionFormData
  let tempObj = obj;
  // 将中括号替换为. 如 questions[0][question] -> questions.0.question
  path = path.replace(/\[(\w+)\]/g, '.$1'); 
  // 替换首个., .questions.0.question -> questions.0.question 最终处理成这个格式
  path = path.replace(/^\./, '');
  // 分割成数组 得到 ['questions','0','question']
  let keyArr = path.split('.');
  let i = 0;
	// 以 i = 0来查此处代码作用
  for (let len = keyArr.length; i < len - 1; ++i) {
    // key = questions
    let key = keyArr[i];
    // questions 在 questionFormData中,进入为true的代码块
    if (key in tempObj) {
      // tempObj = questions
      tempObj = tempObj[key];
    } else {
      throw new Error('[iView warn]: please transfer a valid prop path to form item!');
    }
  }
  return {
    o: tempObj, // { id: 1, question: '问题1' }
    k: keyArr[i], // question
    v: tempObj[keyArr[i]] // 问题1
  };
 }

原来是通过.去分割为数据,数组的值以key的形式去访问model对象,匹配上对应的值。当匹配不上值是会抛出'[iView warn]: please transfer a valid prop path to form item!'错误。

总结:通过阅读源码,我们可以发现动态添加校验规则不止可以用key.[index].key的方式,还可以通过[key][index][key]字符串的方式去定义prop,不过要注意**key要与model中的key一致**

以上就是iView UI FORM 动态添加表单项校验规则写法实例的详细内容,更多关于iView UI FORM 表单项校验规则的资料请关注脚本之家其它相关文章!

相关文章

  • Vue CLI 3.x 自动部署项目至服务器的方法

    Vue CLI 3.x 自动部署项目至服务器的方法

    本教程讲解的是 Vue-CLI 3.x 脚手架搭建的vue项目, 利用scp2自动化部署到静态文件服务器 Nginx。非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-04-04
  • Vue实现项目部署到非根目录及解决刷新页面时找不到资源

    Vue实现项目部署到非根目录及解决刷新页面时找不到资源

    这篇文章主要介绍了Vue实现项目部署到非根目录及解决刷新页面时找不到资源问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue.js input框之间赋值方法

    vue.js input框之间赋值方法

    今天小编就为大家分享一篇vue.js input框之间赋值方法具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • vue中用qrcode库将超链接生成二维码图片的示例代码

    vue中用qrcode库将超链接生成二维码图片的示例代码

    生成二维码是一种常见的需求,无论是用于商业宣传还是个人分享,二维码都可以提供快速方便的方式来传递信息,在Vue框架中,我们可以使用qrcode库来轻松地生成二维码,本篇博文将介绍如何安装qrcode库,并通过一个实际例子来展示如何生成二维码,需要的朋友可以参考下
    2023-12-12
  • vue中的计算属性实例详解

    vue中的计算属性实例详解

    模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。接下来通过本文给大家介绍vue中的计算属性,需要的朋友可以参考下
    2018-09-09
  • vue日志之如何用select选中默认值

    vue日志之如何用select选中默认值

    这篇文章主要介绍了vue日志之如何select选中默认值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue3中虚拟dom的介绍与使用详解

    vue3中虚拟dom的介绍与使用详解

    Vue 是如何将一份模板转换为真实的 DOM 节点的,又是如何高效地更新这些节点的呢,这些都离不开虚拟dom这个概念,下面我们就来了解下虚拟dom这个概念以及它是什么吧
    2024-01-01
  • element-plus中如何实现按需导入与全局导入

    element-plus中如何实现按需导入与全局导入

    本文主要介绍了element-plus中如何实现按需导入与全局导入,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Vee-validate 父组件获取子组件表单校验结果的实例代码

    Vee-validate 父组件获取子组件表单校验结果的实例代码

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息。这篇文章主要介绍了Vee-validate 父组件获取子组件表单校验结果 ,需要的朋友可以参考下
    2019-05-05
  • Vue.Draggable实现拖拽效果

    Vue.Draggable实现拖拽效果

    这篇文章主要介绍了Vue.Draggable实现拖拽效果,使用简单方便 ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论