uni-app 钉钉小程序开发调试中 uniapp-forms 表单验证问题 必填项的日期选择未填值却直接通过验证

uni-app 钉钉小程序开发调试中 uniapp-forms 表单验证问题 必填项的日期选择未填值却直接通过验证

产品分类

uniapp/小程序/阿里

PC开发环境操作系统

Windows

PC开发环境操作系统版本号

win10

HBuilderX类型

正式

HBuilderX版本号

3.2.16

第三方开发者工具版本号

小程序开发者工具

基础库版本号

1.15

项目创建方式

HBuilderX

示例代码

<template>
<view class="container">
<view class="example">
<uni-forms ref="baseForm" :modelValue="baseFormData" :rules="rules" label-position="top">
<uni-forms-item label="组别" required name="classname">
<uni-easyinput v-model="baseFormData.groupName" :disabled="true" placeholder="请输入组别" />
</uni-forms-item>
<uni-forms-item label="班次" required name="shift">
<uni-data-checkbox v-model="baseFormData.shift" :localdata="shifts" />
</uni-forms-item>
<uni-forms-item label="排班日期" required name="range">
<uni-datetime-picker v-model="baseFormData.range" type="daterange" :start="startdate" :end="enddate"
rangeSeparator="至" />
</uni-forms-item>
</uni-forms>
<button type="primary" @click="submit('baseForm')">提交</button>
</view>
</view>
</template> 
<script>
export default {
data() {
const date = new Date()
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const endyear = date.getFullYear() + 100
const endday = date.getDate() - 1
return {
startdate: year + '-' + month + '-' + day,
enddate: endyear + '-' + month + '-' + endday,
// 基础表单数据
baseFormData: {
groupName: '',
shift: '',
range: [],
},
// 单选数据源
shifts: [{
text: '白班',
value: 1
}, {
text: '晚班',
value: 2
}],
// 表单校验规则
rules: {
groupName: {
rules: [{
required: true,
errorMessage: '组别不能为空'
}]
},
shift: {
rules: [{
required: true,
errorMessage: '请选择班次'
}]
},
range: {
rules: [{
format: 'array'
}, {
validateFunction: function(rule, value, data, callback) {
if (value.length == 0) {
callback('请选择排班日期范围')
}
return true
}
}]
}
},
processId: 0,
group:0,
};
},
onLoad(option) {
this.processId = option.p;
},
onReady() {
this.getClass()
},
methods: {
submit(ref) {
//debugger
this.$refs[ref].validate().then(res => {
debugger
let self = this;
this.$http({
url: this.$api.add_schedul,
method: "post",
data: {
PlanDate: res.range,
Class: res.shift,
GroupName: res.groupName,
Group: self.group,
}
}).then(res => {
if (res.code == 200) {
uni.showToast({
title: res.message,
duration: 2000,
complete() {
uni.navigateBack({
delta: 1
});
}
});
} else {
uni.showToast({
title: res.message,
duration: 2000
});
}
})
uni.showToast({
title: `校验通过`
})
}).catch(err => {
console.log('err', err);
})
},
getClass() {
let self = this;
this.$http({
url: this.$api.get_class,
method: "get",
data: {
LeaderNo: self.$store.state.userinfo.account,
ProcessID: self.processId,
}
}).then(res => {
if (res.code == 200) {
self.baseFormData.groupName = res.data.fname;
self.group = res.data.fid;
} else {
uni.showToast({
title: res.message,
duration: 2000
});
}
})
}
}
</script> 
.example {
padding: 15px;
background-color: #fff;
}

.segmented-control {
margin-bottom: 15px;
}

.button-group {
margin-top: 15px;
display: flex;
justify-content: space-around;
}

.form-item {
display: flex;
align-items: center;
}

.button {
display: flex;
align-items: center;
height: 35px;
margin-left: 10px;
}

操作步骤

上述

预期结果

应该提示必填

实际结果

应该提示必填

bug描述

在浏览器h5验证是没问题,但小程序开发工具里调试,没有填值也能通过必填验证???


更多关于uni-app 钉钉小程序开发调试中 uniapp-forms 表单验证问题 必填项的日期选择未填值却直接通过验证的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 钉钉小程序开发调试中 uniapp-forms 表单验证问题 必填项的日期选择未填值却直接通过验证的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这个问题是由于 uni-forms 在钉钉小程序中对日期范围选择器的验证处理存在差异导致的。在 H5 端,uni-datetime-pickerv-model 绑定空数组 [] 时,验证规则能正确识别为未填值;但在钉钉小程序中,空数组可能被错误地认为是有值状态。

解决方案:

  1. 调整验证规则:将 range 字段的验证规则修改为:
range: {
  rules: [{
    validateFunction: function(rule, value, data, callback) {
      if (!value || value.length === 0) {
        callback('请选择排班日期范围')
      }
      return true
    }
  }]
}

移除 format: 'array' 规则,因为它在小程序中可能干扰验证逻辑。

  1. 使用自定义验证函数:确保验证函数明确检查数组长度,并处理 valuenullundefined 的情况。

  2. 检查组件版本:确保使用的 uni-datetime-pickeruni-forms 是最新版本,旧版本可能存在平台兼容性问题。

  3. 临时调试方案:在 submit 方法中添加手动验证:

submit(ref) {
  if (!this.baseFormData.range || this.baseFormData.range.length === 0) {
    uni.showToast({ title: '请选择排班日期范围', icon: 'none' })
    return
  }
  // 原有验证逻辑
}
回到顶部