uni-app uni-forms组件在开发者工具和真机上校验失效

发布于 1周前 作者 gougou168 来自 uni-app

uni-app uni-forms组件在开发者工具和真机上校验失效

产品分类

uniapp/小程序/字节跳动

示例代码:

<template>  
    <view :class="classes.root">  
        <uni-forms ref="formRef" :modelValue="formData" :rules="formRules" validateTrigger="blur">  
            <uni-forms-item name="mobile">  
                <uni-easyinput v-model="formData.mobile" type="number" placeholder="请输入手机号" maxlength="11" />  
            </uni-forms-item>  
            <uni-forms-item name="sms_vcode">  
                <uni-easyinput v-model="formData.sms_vcode" type="number" placeholder="请输入验证码" maxlength="6">  
                    <template #right>  
                        <view :class="classes.vcode" @click="sendVcode">{{ vcodeText }}</view>  
                    </template>  
                </uni-easyinput>  
            </uni-forms-item>  
        </uni-forms>  
        <view :class="classes.footer">  
            <button :class="classes.button" @click="doSubmit">立即登录</button>  
        </view>  
    </view>  
</template>  

<script setup>  
import { createNamespace } from '@/utils/create.js';  
import { setStorageSync, getStorageSync } from '@/utils/storage.js';  
import { goBack } from '@/composables/useLoginJump.js';  
import uploadData from '@/composables/useUploadInfo.js';  
import { sendSms, smsLogin } from '@/apis/login';  
import { loginCodeSubmitLog } from '@/datareport/loginLog.js';  

const { bem } = createNamespace('child-login-form');  
const classes = reactive({  
    root: computed(() => [bem()]),  
    vcode: computed(() => [bem('vcode', { disabled: isCountDown.value })]),  
    footer: computed(() => [bem('footer')]),  
    button: computed(() => [bem('button')])  
});  

const formData = reactive({  
    mobile: null,  
    sms_vcode: null  
});  

const formRules = reactive({  
    mobile: {  
        rules: [  
            {  
                required: true,  
                errorMessage: '请输入手机号'  
            },  
            {  
                validateFunction: function (rule, value, data, callback) {  
                    if (0 < value.length && value.length < 11) {  
                        callback('请输入正确的手机号');  
                    }  
                    return true;  
                }  
            }  
        ]  
    },  
    sms_vcode: {  
        rules: [  
            {  
                required: true,  
                errorMessage: '请输入验证码'  
            },  
            {  
                validateFunction: function (rule, value, data, callback) {  
                    if (0 < value.length && value.length < 6) {  
                        callback('请输入正确的验证码');  
                    }  
                    return true;  
                }  
            }  
        ]  
    }  
});  

const isCountDown = ref(false);  
const counter = ref(59);  
const btnText = ref('');  
const timer = ref(null);  
const startTimer = () => {  
    let _counter = counter.value;  
    let _timer;  
    isCountDown.value = true;  
    btnText.value = _counter;  
    _timer = setInterval(() => {  
        _counter--;  
        btnText.value = _counter;  
        if (_counter == 0) {  
            isCountDown.value = false;  
            clearInterval(_timer);  
        }  
    }, 1000);  
    timer.value = _timer;  
};  
const vcodeText = computed(() => {  
    return isCountDown.value ? `${btnText.value}s` : '获取验证码';  
});  

const sendVcode = () => {  
    // 倒计时中不能点击  
    if (isCountDown.value) return;  

    // 校验手机号  
    formRef.value  
        .validateField(['mobile'])  
        .then((res) => {  
            let data = {  
                mobile: formData.mobile  
            };  
            console.log('===获取验证码校验结果===', res);  
            // sendSms(data)  
            //  .then((res) => {  
            //      // 发送短信验证码,开始倒计时  
            //      startTimer();  
            //  })  
            //  .catch((err) => {});  
        })  
        .catch((err) => {});  
};  

const formRef = ref('formRef');  
const doSubmit = () => {  
    formRef.value  
        .validate()  
        .then((res) => {  
            // 登录  
            let extraData = JSON.parse(getStorageSync('allParams'));  
            let data = {  
                ...formData,  
                ...extraData  
            };  
            smsLogin(data)  
                .then((res) => {  
                    // 返回上上页  
                    res = res.data;  
                    loginCodeSubmitLog();  
                    uploadData(() => {  
                        setStorageSync('isLogin', true);  
                        setStorageSync('customer', res.customer);  
                        setStorageSync('openid', res.openid);  
                        setStorageSync('uid', res.uid);  
                        goBack(2);  
                    });  
                })  
                .catch((err) => {});  
        })  
        .catch((err) => {  
            console.log('err', err);  
        });  
};  
</script>

操作步骤:

不填写手机号,直接点击获取验证码

预期结果:

校验不通过,不能发送短信

实际结果:

校验通过,触发了发短信接口

bug描述:

表单校验失效,不填写内容时,开发者工具、真机,返回校验通过。
uni-forms版本:1.4.13

图片

开发环境信息

项目 信息
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 14.2.1 (23C71)
HBuilderX类型 正式
HBuilderX版本号 4.44
第三方开发者工具版本号 4.3.3
基础库版本号 3.49.0.7
项目创建方式 HBuilderX

3 回复

解决了吗?


参考 issues 关闭 virtual host 虚拟节点试试。

针对您提到的uni-app中uni-forms组件在开发者工具和真机上校验失效的问题,这通常涉及到表单验证逻辑的配置和实现。以下是一个简单的代码示例,展示如何使用uni-forms和uni-form-item组件进行表单验证,并确保验证逻辑在开发者工具和真机上都能正确执行。

首先,确保您的uni-app项目已经安装了必要的依赖,并且uni-ui组件库已经正确引入。

示例代码

1. 在pages/index/index.vue中编写表单页面

<template>
  <view>
    <uni-forms ref="formRef" :rules="rules" @validate="onValidate">
      <uni-form-item label="用户名" name="username" required>
        <input v-model="formData.username" />
      </uni-form-item>
      <uni-form-item label="密码" name="password" required type="password">
        <input v-model="formData.password" />
      </uni-form-item>
      <button type="primary" @click="submitForm">提交</button>
    </uni-forms>
  </view>
</template>

<script>
export default {
  data() {
    return {
      formData: {
        username: '',
        password: '',
      },
      rules: {
        username: [
          { required: true, message: '请输入用户名', trigger: 'blur' },
          { min: 3, max: 15, message: '用户名长度在3到15个字符之间', trigger: 'blur' },
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' },
          { min: 6, message: '密码长度不能少于6个字符', trigger: 'blur' },
        ],
      },
    };
  },
  methods: {
    submitForm() {
      this.$refs.formRef.validate((valid) => {
        if (valid) {
          console.log('表单验证通过', this.formData);
        } else {
          console.error('表单验证失败');
          return false;
        }
      });
    },
    onValidate(valid, fields) {
      console.log('验证结果:', valid, '错误字段:', fields);
    },
  },
};
</script>

注意事项

  • 确保uni-ui组件库已经正确安装并引入,可以通过npm安装或直接在HBuilderX中通过插件市场安装。
  • 验证规则中的trigger属性设置为blurchange,根据实际需求选择合适的触发时机。
  • 在真机上测试时,注意检查是否有权限问题或网络请求限制导致验证逻辑未能正确执行。
  • 如果开发者工具和真机上表现不一致,检查控制台是否有报错信息,可能是环境差异或代码兼容性问题。

通过上述代码和注意事项,您应该能够在uni-app中正确使用uni-forms组件进行表单验证,并确保验证逻辑在开发者工具和真机上都能正确运行。

回到顶部