el-form表单校验报错 [XXX] is not a string

 

  在做表单自定义校验规则的时候遇到很奇怪的问题,这一项明明没有设置必填,却出现验证,且内容不是message里的提示语,而是 XXX is not String.

具体报错如下:

首先,附上相关代码:

复制代码
//html代码
<el-form ref="baseForm" :model="baseForm" :rules="ruleValidate" label-position="right" label-width="320px">
  <el-form-item label="请选择" prop="status">
    <el-radio-group v-model="baseForm.status">
      <el-radio label="1">参加</el-radio>
      <el-radio label="2">不参加</el-radio>
    </el-radio-group>
  </el-form-item>
  <el-form-item label="具体选择(活动一和活动二必须二选一):" prop="checkList" :rules="ruleList">
    <el-checkbox-group v-model="baseForm.checkList">
      <el-checkbox label="1" disabled>必选一</el-checkbox>
      <el-checkbox label="2" disabled>必选二</el-checkbox>
      <el-checkbox label="3" >活动一</el-checkbox>
      <el-checkbox label="4" >活动二</el-checkbox>
    </el-checkbox-group>
  </el-form-item>
</el-form>

//js代码
export default {
  data() {
    const validateInput = (rule, value, callback) => {
      if(this.baseForm.status === '2') {
        callback()
      } else {
        if(value.includes('3') || value.includes('4')) {
          callback()
        }else {
          callback(new Error('活动一和活动二必须二选一'))
        }
      }
    };
    return {
      baseForm:{
        checkList:['1','2'],
        status:'1',
      },
      ruleValidate:{}    //整个form表单的校验规则
    }
  },
  computed:{
    //这里由于根据baseForm.status的不同取值 动态更新其他表单项的校验规则,所以放在computed里监听
    ruleList() {
      return [
        { required:this.baseForm.status === '2'?false:true, type:'array', message:'活动一和活动二必须二选一', trigger:'blur'},
        { validator:this.validateInput, trigger:'change'}
      ]
    }
  },
  methods: {
    handleOk(){        //表单提交
      console.log(this.ruleList)
      this.$refs.baseForm.validate(valid => {
        if (valid) {
          //...
        }
      })
    },
  }
}
复制代码

   尝试打印该表单项绑定的校验规则发现,其中的自定义校验规则没有被调用到,undifined

   同理,如果试着将校验规则传一个空对象,发现会报同样XXX is not String的错误:

computed:{
  ruleList() {
    return [
      { required:this.baseForm.status === '2'?false:true, type:'array', message:'活动一和活动二必须二选一', trigger:'blur'},
      { }
    ]
  }
},

原因:校验规则的对象数组传的空对象{ } ,没有内容,从而出现 ‘’ is not a string 错误。

 修改:

复制代码
computed:{
  ruleList() {
    //将validateInput放到computed中,下面的对象才能被引用到
    const validateInput = (rule, value, callback) => {
      if(this.baseForm.status === '2') {
        callback()
      } else {
        if(value.includes('3') || value.includes('4')) {
          callback()
        }else {
          callback(new Error('活动一和活动二必须二选一'))
        }
      }
    };
    return [
      { required:this.baseForm.status === '2'?false:true, type:'array', message:'活动一和活动二必须二选一', trigger:'blur'},
      { validator:validateInput, trigger:'change'}
    ]
  }
},
复制代码

如果没有校验规则,不能传ruleList: [ { } ],而应该改为ruleList: [  ]

 

补:

1.在自定义校验规则中,无论校验是否通过,都要callback()回调函数 (这里的‘callback’可随意命名,跟传参保持一致即可)

2.表单部分字段的校验:(通常写在特定需要部分校验的函数里,如radio切换)

this.$refs.baseForm.validateField('checkList'); // 再次校验prop传值为checkList的表单项

 

posted @   Morango  阅读(5060)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
*{cursor: url(https://files-cdn.cnblogs.com/files/morango/fish-cursor.ico),auto;}
点击右上角即可分享
微信分享提示