表单动态自定义校验以及数据多层嵌套

目录

一、前提

二、步骤

1.首先先定义实例和规则

2.在组件中绑定实例和数据

3.在需要的项目中确定规则和写上name

4.把规则和实例绑定

5.最后在提取表单的方法中使用实例

三、查看问题


一、前提

使用uniapp,uni-form,数据多层嵌套,并且需要表单动态自定义校验

我的数据,表单动态自定义效验部分是OrderInfo.data.repayment.instalment

const  OrderInfo=reactive({
  data:{
  number: "", // 订单编
  status: 0, // 0 意向订单,1 成交待收,2 已经完成
   ty: "", // 订单类型,下拉字段
    // 交易时间,空字符代表还没有成交,status为1,2时必须设置
   transaction_date: "", 
   receipt_account: "", // 收款账户, 这个先放着不管
   payment_method: "", // 收款方式,下拉字段
  product: {
     id: "",
    name: "",
    discount: "", // 折扣,用浮点数保存,最大值为1,表示没有折扣
    amount: 0 ,// 数量  
    price:""
  },
  customer: {
     id: "",
    name: "",
    company:"",
    address: "", // 收货地址,
    purchase_unit: "" // 购买单位
  },
  salesman: {
  id:userStore.info.id,
  name:userStore.info.name
  },
  repayment: {
    model: 0, // 0 全款,1 分期付款
    instalment: [ // 所有original_amount加起来要等于产品总金额乘以折扣
        {
          interest: "", 
          original_amount: "", 
          date: "", // 回款日期,必须设置
         finish: false, 
        }
        ]
  },
  ship: { 
         shipped: false, // 是否已发货
         date: "",
         storehouse: "", // 发货库房
     },
invoice: {
      required: false, //是否开发票,如果为false忽略下面值
      deadline: "", // 收款期限
      title: "", // 发票抬头
      ty:"",
      number: "", // 发票编号,不设置系统自动生成,唯一值
      description: "" // 财务说明
  }
},
    file:''
  })

二、步骤

1.首先先定义实例和规则

const form=ref(null)

//监听必填的内容
const orderRules={
  discount: {
  	rules: [
  		{
  			required: true,
  			trigger: 'change',
  			errorMessage: '折扣必填'
  		},
  		{
  			validateFunction(rule, value, data, callback) {
        
  				    const numericValue = parseFloat(value);
  				    if (isNaN(numericValue) || numericValue < 0 || numericValue > 1) {
  				        callback('数字必须在0到1之间');
  				    }
  				    if (value && value.includes('.') && value.split('.')[1].length > 2) {
  				        callback('销售单价最多有两位小数');
  				    }
  				    return true;
  			},
  			trigger: 'change'
  		}
  	]
  },
  other:{
    rules: [
    	{
    		required: true,
    		trigger: 'change',
    		errorMessage: '必填'
    	},
    	{
    		validateFunction(rule, value, data, callback) {
    			  if(value&&value.length<=0){
    			    callback("不能为空")
    			  }
    			    return true;
    		},
    		trigger: 'change'
    	}
    ]
  },
  others:{
    rules: [
    	{
    		required: `${OrderInfo.data.status===0?false:true}`,
    		trigger: 'change',
    		errorMessage: '必填'
    	},
    	{
    		validateFunction(rule, value, data, callback) {
          if(OrderInfo.data.status===0){
             return true;
           }
          
    			  if(value&&value.length<=0){
    			    callback("不能为空")
    			  }
    			    return true;
    		},
    		trigger: 'change'
    	}
    ]
  },
  interest_0: {
   	rules: [
   		{
   			required: true,
   			trigger: 'change',
   			errorMessage: '利息必填'
   		},
   		{
   			validateFunction(rule, value, data, callback) {
   				    const numericValue = parseFloat(value);
   				    if (isNaN(numericValue) || numericValue < 0 || numericValue > 1) {
   				        callback('数字必须在0到1之间');
   				    }
   				    if (value && value.includes('.') && value.split('.')[1].length > 2) {
   				        callback('销售单价最多有两位小数');
   				    }
   				    return true;
   			},
   			trigger: 'change'
   		}
   	]
   },
  date_0: {
   	rules: [
   		{
   			required: true,
   			trigger: 'change',
   			errorMessage: '日期必填'
   		},
   		{
   			validateFunction(rule, value, data, callback) {
   				 if(value&&value.length<=0){
              callback("回款日期不能为空")
            }
   				    return true;
   			},
   			trigger: 'change'
   		}
   	]
   },
   original_amount_0: {
   	rules: [
   		{
   			required: true,
   			trigger: 'change',
   			errorMessage: '回款金额必填'
   		},
   		{
   			validateFunction(rule, value, data, callback) {
   				 if(value&&value.length<=0){
              callback("回款日期不能为空")
            }
   				    return true;
   			},
   			trigger: 'change'
   		}
   	]
   },
}

2.在组件中绑定实例和数据

3.在需要的项目中确定规则和写上name

部分

动态表单部分

4.把规则和实例绑定

5.最后在提取表单的方法中使用实例

三、查看问题

如果出现问题的话,可以console.log(form.value)去查看一下看是否绑定formData和formRules是否有绑定,动态表单校验应该是触发了才绑定的这部分我使用v-if满足条件才渲染,所以以下图片没有这个信息,但是我的效验没问题

我遇到的问题是:formData里面的值找不到绑定数据,就显示undefined,然后导致校验不了。出问题部分是 :name="['product','amount']" 的时候,一开始我还是单纯的name="amount",但是由于数据太多了不唯一没有绑定上,改成了这种命名:name="['product','amount']" 就可以了绑定了

::::不明白的可以看uniapp官网

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值