Element-ui表单验证(二)

业务场景

  • 新增一个字段,该字段对应多个输入框,该字段属性动态获取,对该字段进行动态校验

解决措施

  • data中定义,发送请求,为该字段进行属性初始化
return {
      language: this.$store.getters.language,
      loading: false, // 加载动画
      info: {
        // 基本信息
        name: '', // 系统接口名称
        languageInterfaceName: {}, // 接口名称中英文 (需)
        ...     
    },
};

  created() {
    this.getLanguageType();
  },
  getLanguageType() {
      getLang('') // 获取多语言
      .then(response => {
        const obj = {};
        response.data.list.forEach(val => {
          const prop = val.language; // en
          obj[prop] = '';
        });
        this.info.languageInterfaceName = obj;
      })
      .catch(error => {
        console.log(error);
      });
    }
  • 定义结构
<!-- 多语言接口名称 -->
<el-form-item :label="'多语言接口名:'+key"
    v-for="(value, key, index) in this.info.languageInterfaceName"
    :key="index" :prop="`languageInterfaceName.${key}`" :rules="rules.language1">
    <el-input class="MW300" v-model="info.languageInterfaceName[key]" placeholder="请输入"></el-input>
</el-form-item>
  • 自定义校验
rules: {
    language1: [
      { required: true, message: '不能为空', trigger: 'blur' }
    ]
}

效果

踩坑

  • 直接暴力修改属性,导致数据绑定不上

  即写 getLanguageType() 方法时,直接使用 this.info.languageInterfaceName[key] 方式 给其增加属性,导致vue绑定不上

  • 不懂 prop 跟 rules
    • prop:form里面的校验只能校验到form绑定的值的第一层,即假如,form上写的为 :model="info",只能绑定到 info.xxxx,诸如上述的 info.xxx.yy这种需要进行自定义
    • :prop="'languageInterfaceName.'+key"(与上述方式一样,相当于简化了字符串拼接操作)
    • rules:如果是自定义的校验,需要rules精确指定具体的检验,比如将language1写在rules下,就要写成 :rules = “rules.language1”
posted @ 2020-06-04 11:18  honor的博客  阅读(237)  评论(0编辑  收藏  举报