uni-app uni-forms validate方法传入要保留的字段,校验通过后无法获取到表单数据

uni-app uni-forms validate方法传入要保留的字段,校验通过后无法获取到表单数据

开发环境 版本号 项目创建方式
Windows 7旗舰版 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.1.22

手机系统:Android

手机系统版本号:Android 8.0

手机厂商:华为

手机机型:荣耀8

页面类型:vue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

<template>  
    <view class="edit-order-address-page">  

        <view class="billing-form-root">  
            <view class="form-title">  
                <text class="title-text">Billing Address</text>  
                <text class="title-select">Select from address book</text>  
            </view>  
            <uni-forms class="billing-form"   
                :rules="rules"   
                :value="addressForm"   
                label-position="top"  
                ref="_address_form"   
                validate-trigger="bind"  
                err-show-type="undertext"  
            >  
                <view class="billing-form-group">  
                    <view class="form-label required">First Name</view>  
                    <uni-forms-item name="firstname" required>  
                        <uni-easyinput type="text" class="form-input" :clearable="false" v-model="addressForm.firstname"></uni-easyinput>  
                    </uni-forms-item>  
                </view>  
                <view class="billing-form-group">  
                    <view class="form-label required">Last Name</view>  
                    <uni-forms-item name="lastname" required>  
                        <uni-easyinput type="text" class="form-input" :clearable="false" v-model="addressForm.lastname"></uni-easyinput>  
                    </uni-forms-item>  
                </view>  
                <view class="billing-form-group">  
                    <view class="form-label required">Address(text No accepting PO.box)</view>  
                    <uni-forms-item name="street" required>  
                        <uni-easyinput type="textarea" class="form-input" :clearable="false" v-model="addressForm.street"></uni-easyinput>  
                    </uni-forms-item>  
                </view>  

                <view class="billing-form-group">  
                    <view class="form-label required">Zip/Postal Code</view>  
                    <uni-forms-item name="postcode" required>  
                        <uni-easyinput type="text" class="form-input" :clearable="false" v-model="addressForm.postcode"></uni-easyinput>  
                    </uni-forms-item>  
                </view>  
                <view class="billing-form-group">  
                    <view class="form-label required">City</view>  
                    <uni-forms-item name="city" required>  
                        <uni-easyinput type="text" class="form-input" :clearable="false" v-model="addressForm.city"></uni-easyinput>  
                    </uni-forms-item>  
                </view>  

                <view class="billing-form-group">  
                    <view class="form-label required">State/Province</view>  
                    <uni-forms-item name="region" required>  
                        <uni-easyinput type="text" class="form-input"   
                            placeholder="Place Input region, state or province"  
                            :clearable="false"   
                            v-model="addressForm.region"  
                        ></uni-easyinput>  
                    </uni-forms-item>  
                </view>  

                <view class="billing-form-group">  
                    <view class="form-label required">Telephone</view>  
                    <uni-forms-item name="telephone" required>  
                        <uni-easyinput type="text" class="form-input" :clearable="false" v-model="addressForm.telephone"></uni-easyinput>  
                    </uni-forms-item>  
                </view>  

            </uni-forms>  
        </view>  
        <!--底部提交按钮-->  
        <view class="order-address-bottom">  
            <view @click="confirmHandler" class="bottom-btn">Confirm</view>  
        </view>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            return {  
                addressForm: {  
                    firstname: '',  
                    lastname: '',  
                    street: '',  
                    postcode: '',  
                    city: '',  
                    region: '',  
                    telephone: '',  
                },  
                rules: {  
                    firstname: {  
                        rules: [{  
                            required: true,  
                            errorMessage: 'This is a required field.'  
                        }]  
                    },  
                    lastname: {  
                        rules: [{  
                            required: true,  
                            errorMessage: 'This is a required field.'  
                        }]  
                    },  
                    street: {  
                        rules: [{  
                            required: true,  
                            errorMessage: 'This is a required field.'  
                        }]  
                    },  
                    postcode: {   
                        rules:[{  
                            required: true,  
                            errorMessage: 'This is a required field.'  
                        }],  
                    },  
                    city: {   
                        rules:[{  
                            required: true,  
                            errorMessage: 'This is a required field.'  
                        }]  
                    },  

                    region: {   
                        rules:[{  
                            required: true,  
                            errorMessage: 'This is a required field.'  
                        }]  
                    },  
                    telephone: {   
                        rules:[{  
                            required: true,  
                            errorMessage: 'This is a required field.'  
                        }]  
                    },  
                }  
            };  
        },  
        onLoad(options) {  

            this.addressForm.test = 'qwe';  
        },  

        methods: {  

            confirmHandler() {  
                // 不参与校验的字段名,保留  
                console.log(9999999999);  
                let otherKey = ['test'];  
                // 这里有一个问题:按照uni-forms的  
                this.$refs._address_form.validate(otherKey).then((res) => {  
                    console.log('validate res -- ',res);  
                }).catch((err) => {  
                    console.log('validate err -- ',err);  
                });  
            }  
        }  
    }  
</script>  

<style scoped lang="scss">  
page{  
    width: 100%;          
}  
.edit-order-address-page{  
    position: relative;  
    box-sizing: border-box;  
    width: 100%;  
    padding-bottom: 150rpx;  
}  
.billing-form-root{  
    box-sizing: border-box;  
    width: 100%;  
}  
.billing-form{  
    box-sizing: border-box;  
    width: 100%;  
    padding: 0 20rpx;  
}  
.form-title{  
    box-sizing: border-box;  
    width: 100%;  
    padding: 20rpx;  
    display: flex;  
    justify-content: space-between;  
    align-items: center;  
    .title-text{  
        font-size: 34rpx;  
        font-weight: bold;  
    }  
    .title-select{  
        font-size: 12px;  
        text-decoration: underline;  
        color: $base-color;  
    }  
}  
.uni-forms-item{  
    position: relative;  
}  
// /deep/ .uni-easyinput__content{  
//  height: 76rpx; // 38  
// }  
.uni-forms-item.uni-forms-item-error .form-picker{  
    border-color: #dd524d;  
}  
.form-picker{  
    height: 76rpx;  
    border: 1px solid rgb(229,229,229);  
    border-radius: 4px;  
}  
.form-picker-content{  
    height: 100%;  
    display: flex;  
    align-items: center;  
    padding-left:10px;  
    line-height: normal;  
}  
.form-picker-content.tips{  
    color: $font-color-light;  
}  

.form-label{  
    position: relative;  
    box-sizing: border-box;  
    width: 100%;  
    font-size: 30rpx;  
    .form-label-tips{  
        color: $font-color-light;  
        font-size: 28rpx;  
    }  
}  

.form-label.required{  
    padding-left: 20rpx;  
}  
.form-label.required:after{  
    position: absolute;  
    content: '*';  
    top: 50%;  
    left:0;  
    transform: translateY(-50%);  
    font-size: 28rpx;  
    color: $base-color;  
    height: 1em;  
}  

.order-address-bottom{  
    position:fixed;  
    left:0;  
    bottom:0;  
    box-sizing: border-box;  
    width: 100%;  
    height: 120rpx;  
    background-color: #fff;  
    padding: 20rpx;  
    box-shadow: 0px -5px 5px -5px rgba(0,0,0,0.3);  
}  
.bottom-btn{  
    display: flex;  
    justify-content: center;  
    align-items: center;  
    width: 100%;  
    height: 100%;  
    color: #fff;  
    background-color: $base-color;  
    font-size: 34rpx;  
    line-height: normal;  
    border-radius: 8rpx;  
}  
</style>

更多关于uni-app uni-forms validate方法传入要保留的字段,校验通过后无法获取到表单数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app uni-forms validate方法传入要保留的字段,校验通过后无法获取到表单数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html


根据你的代码和问题描述,这是 uni-forms 组件的一个已知行为。当使用 validate() 方法并传入要保留的字段数组时,校验通过后返回的 res 只包含参与校验的字段数据,不会包含你指定的保留字段。

在你的代码中:

let otherKey = ['test'];
this.$refs._address_form.validate(otherKey).then((res) => {
    console.log('validate res -- ',res);  // 这里不会包含 test 字段
});

validate() 方法的参数 otherKey 只是告诉表单哪些字段不需要校验,但并不会将这些字段包含在返回结果中。这是 uni-forms 的设计逻辑:返回的是通过校验的字段数据。

解决方案:

  1. 手动合并数据
confirmHandler() {
    let otherKey = ['test'];
    this.$refs._address_form.validate(otherKey).then((res) => {
        // 手动合并需要保留的字段
        const formData = {
            ...res,
            test: this.addressForm.test
        };
        console.log('完整表单数据 -- ', formData);
    }).catch((err) => {
        console.log('validate err -- ', err);
    });
}
  1. 或者直接使用原始数据
confirmHandler() {
    let otherKey = ['test'];
    this.$refs._address_form.validate(otherKey).then(() => {
        // 校验通过后直接使用 this.addressForm
        console.log('完整表单数据 -- ', this.addressForm);
    }).catch((err) => {
        console.log('validate err -- ', err);
    });
}
回到顶部