uniapp表单校验超详细讲解

作者:小满时间:2026-10-31 06:48:24浏览:227

本文详解uniapp中uni-forms组件的表单校验机制。涵盖rules规则配置、model绑定、validate与setValue方法使用,以及同步/异步自定义校验函数的编写。重点解析动态表单的Array类型name处理与校验时机优先级,提供完整代码示例与API参考。

uni-forms表单校验

首先,uni-forms组件必须通过rules属性传入预定义的校验规则。

其次,uni-forms需要绑定model属性,该属性的值应为包含表单所有key/value的对象。

同时,每个uni-forms-item子组件必须设置name属性,其值对应当前字段的名称,类型支持String或Array。

对于内置组件或已支持v-model的第三方组件,只需正常绑定v-model即可,无需额外操作。

若使用原生checkbox或不支持v-model的第三方组件,只需给组件绑定binddata方法即可触发表单校验,无需在methods中单独绑定事件。

binddata('name',$event.detail.value,'form')方法接收三个参数。

第一个参数为当前表单组件所在的name,需与父组件uni-forms-item绑定的name属性值一致。

第二个参数为需要校验的值,内置组件可通过$event.detail.value获取返回值,自定义组件则需传入待校验的具体值。

第三个参数为uni-forms组件绑定的ref值,多表单场景下必须传入以区分不同表单;若页面仅有一个uni-forms,可忽略此参数。

若内置binddata方法无法满足需求,可在当前页面的methods中复写该方法。复写时需调用uni-forms的setValue方法来触发表单校验。

<template>
    <view>
        <uni-forms ref="form" :modelValue="formData" :rules="rules">
            <uni-forms-item label="姓名" name="name">
                <uni-easyinput type="text" v-model="formData.name" placeholder="请输入姓名" />
            </uni-forms-item>
            <uni-forms-item label="邮箱" name="email">
                <input class="input" v-model="formData.email" type="text" placeholder="请输入用户名" @input="binddata('email',$event.detail.value)" />
            </uni-forms-item>
        </uni-forms>
        <button @click="submit">Submit</button>
    </view>
</template>
<script>
export default {
    data() {
        return {
            // 表单数据
            formData: {
                name: 'LiMing',
                email: 'dcloud@email.com'
            },
            rules: {
                // 对name字段进行必填验证
                name: {
                    rules: [{
                            required: true,
                            errorMessage: '请输入姓名',
                        },
                        {
                            minLength: 3,
                            maxLength: 5,
                            errorMessage: '姓名长度在 {minLength} 到 {maxLength} 个字符',
                        }
                    ]
                },
                // 对email字段进行必填验证
                email: {
                    rules: [{
                        format: 'email',
                        errorMessage: '请输入正确的邮箱地址',
                    }]
                }
            }
        }
    },
    methods: {
        /**
         * 复写 binddata 方法,如果只是为了校验,无复杂自定义操作,可忽略此方法
         * @param {String} name 字段名称
         * @param {String} value 表单域的值
         */
        // binddata(name,value){
        // 通过 input 事件设置表单指定 name 的值
        //   this.$refs.form.setValue(name, value)
        // },
        // 触发提交表单
        submit() {
            this.$refs.form.validate().then(res=>{
                console.log('表单数据信息:', res);
            }).catch(err =>{
                console.log('表单错误信息:', err);
            })
        }
    }
}
</script>

校验规则说明

校验规则接收一个Object类型的值,通过传入不同的规则配置来定义每个表单域值的校验逻辑。

该对象的key表示当前表单域的字段名,value则包含具体的校验规则配置。

以下为value字段所包含的具体内容说明。

属性名

类型

说明

rules

Array

校验规则,下方rules属性说明

validateTrigger

String

表单校验时机【1.4.0】已废弃

label

String

当前表单域的字段中文名,多用于errMessage的显示,可以不填

rules: {
    // 对name字段进行必填验证
    name: {
        // name 字段的校验规则
        rules:[
            // 校验 name 不能为空
            {
                required: true,
                errorMessage: '请填写姓名',
            },
            // 对name字段进行长度验证
            {
                minLength: 3,
                maxLength: 5,
                errorMessage: '{label}长度在 {minLength} 到 {maxLength} 个字符',
            }
        ],
        // 当前表单域的字段中文名,可不填写
        label:'姓名',
        validateTrigger:'submit'
    }
}

rules属性说明

每个验证规则中可以配置多个属性,以下列举常见规则属性。

属性名

类型

默认值

可选值

说明

required

Boolean

-

-

是否必填,配置此参数不会显示输入框左边的必填星号,如需要,请配置uni-forms-item组件的的required为true

range

Array

-

-

数组至少要有一个元素,且数组内的每一个元素都是唯一的。

format

String

-

-

内置校验规则,如这些规则无法满足需求,可以使用正则匹配或者自定义规则

pattern

RegExp

-

-

正则表达式,注意事项见下方说明

maximum

Number

-

-

校验最大值(大于)

minimum

Number

-

-

校验最小值(小于)

maxLength

Number

-

-

校验数据最大长度

errorMessage

String

-

-

校验失败提示信息语,可添加属性占位符,当前表格内属性都可用作占位符

validateFunction

Function

-

-

自定义校验规则

format属性值说明

属性名

说明

string

必须是 string 类型,默认类型

number

必须是 number 类型

boolean

必须是 boolean 类型

array

必须是 array 类型

object

必须是 object 类型

url

必须是 url 类型

email

必须是 email 类型

validateFunction自定义校验规则使用说明

validateFunction方法返回四个参数:validateFunction:function(rule,value,data,callback){},参数名可由开发者自定义。

rule:当前校验字段在rules中所对应的校验规则对象。

value:当前校验字段的实际值。

data:所有校验字段的字段名和值的完整对象。

callback:校验完成时的回调函数。通常无需手动执行callback,直接返回true(校验通过)或false(校验失败)即可。若需显示不同的errMessage,校验不通过时执行callback('提示错误信息'),校验通过时执行callback()。

<template>
    <view>
        <uni-forms ref="form" :modelValue="formData">
            <uni-forms-item label="兴趣爱好" required name="hobby">
                <uni-data-checkbox v-model="formData.hobby" multiple :localdata="hobbys" />
            </uni-forms-item>
        </uni-forms>
        <button class="button" @click="submit">校验表单</button>
    </view>
</template>
<script>
export default {
    data() {
        return {
            formData:{
            },
            rules: {
                hobby: {
                    rules: [{
                        required: true,
                        errorMessage: '请选择兴趣',
                    },{
                        validateFunction:function(rule,value,data,callback){
                            if (value.length < 2) {
                                callback('请至少勾选两个兴趣爱好')
                            }
                            return true
                        }
                    }]
                }
            }
        }
    },
    onReady() {
        // 需要在onReady中设置规则
        this.$refs.form.setRules(this.rules)
    },
    methods: {
        submit(form) {
            this.$refs.form.validate().then(res=>{
                console.log('表单数据信息:', res);
            }).catch(err =>{
                console.log('表单错误信息:', err);
            })
        }
    }
}
</script>

validateFunction异步校验

上述自定义校验方式为同步校验。如需进行异步校验,validateFunction需返回一个Promise对象。校验不通过时执行reject(new Error('错误信息'))以返回错误信息,校验通过则直接执行resolve()。在异步校验方法中,无需使用callback。

<template>
    <view>
        <uni-forms :modelValue="formData" ref="form">
            <uni-forms-item name="age" label="年龄">
                <uni-easyinput v-model="formData.age" type="text" placeholder="请输入年龄" />
            </uni-forms-item>
        </uni-forms>
        <button class="button" @click="submit">校验表单</button>
    </view>
</template>
<script>
export default {
    data() {
        return {
            formData:{
                age:''
            },
            rules: {
                age: {
                    rules: [{
                        required: true,
                        errorMessage: '请输入年龄',
                    },{
                        validateFunction: (rule, value, data, callback) => {
                            // 异步需要返回 Promise 对象
                            return new Promise((resolve, reject) => {
                                setTimeout(() => {
                                    if (value > 10 ) {
                                        // 通过返回 resolve
                                        resolve()
                                    } else {
                                        // 不通过返回 reject(new Error('错误信息'))
                                        reject(new Error('年龄必须大于十岁'))
                                    }
                                }, 2000)
                            })
                        }
                    }]
                }
            }
        }
    },
    onReady() {
        // 需要在onReady中设置规则
        this.$refs.form.setRules(this.rules)
    },
    methods: {
        /**
         * 表单提交
         * @param {Object} event
         */
        submit() {
            uni.showLoading()
            this.$refs.form.validate().then(res => {
                uni.hideLoading()
                console.log('表单数据信息:', res);
            }).catch(err => {
                uni.hideLoading()
                console.log('表单错误信息:', err);
            })
        }
    }
}
</script>

动态表单校验

动态表单校验多用于同一个字段需要添加多次的场景,例如需要动态创建多个域名参与检验。

  • 在formData中定义一个变量用来接受同一个字段的多个结果。
    dynamicFormData: {
        email: '',
        // domains 字段下会有多个结果
        domains: []
    }
  • 使用uni-forms-item的rules属性定义单个表单域的校验规则。
    <uni-forms-item :label="item.label+' '+index" required
        :rules="[{'required': true,errorMessage: '域名项必填'}]" :key="item.id">
        ...
    </uni-forms-item>
  • name需要动态指定,动态表单推荐使用Array类型,内容从左到右为绑定值的调用链。['domains',index,'value']等同于dynamicFormData.domains[index].value。
    <uni-forms-item 
        required
        :label="item.label+' '+index" 
        :name="['domains',index,'value']"
        :rules="[{'required': true,errorMessage: '域名项必填'}]" 
        :key="item.id"
        >
        ...
    </uni-forms-item>
  • 需要绑定值的组件的v-model也需要动态指定为dynamicFormData.domains[index].value。
    <uni-forms-item 
        required
        :label="item.label+' '+index" 
        :name="['domains',index,'value']"
        :rules="[{'required': true,errorMessage: '域名项必填'}]" 
        :key="item.id"
        >
        <uni-easyinput v-model="dynamicFormData.domains[index].value" placeholder="请输入域名" />
    </uni-forms-item>

    完整实例

    <uni-forms ref="dynamicForm" :rules="dynamicRules" :model="dynamicFormData">
        <uni-forms-item label="邮箱" required name="email">
            <uni-easyinput v-model="dynamicFormData.email" placeholder="请输入姓名" />
        </uni-forms-item>
        <template v-for="(item,index) in dynamicFormData.domains">
            <uni-forms-item :label="item.label+' '+index" required
                :rules="[{'required': true,errorMessage: '域名项必填'}]" :key="item.id"
                :name="['domains',index,'value']">
                <view class="form-item">
                    <uni-easyinput v-model="dynamicFormData.domains[index].value" placeholder="请输入域名" />
                    <button class="button" size="mini" type="default" @click="del(item.id)">删除</button>
                </view>
            </uni-forms-item>
        </template>
    </uni-forms>
    <view class="button-group">
        <button type="primary" size="mini" @click="add">新增域名</button>
        <button type="primary" size="mini" @click="submit('dynamicForm')">提交</button>
    </view>
    <script>
        export default {
        data() {
            return {
                // 数据源
                dynamicFormData: {
                    email: '',
                    domains: []
                },
                // 规则
                dynamicRules: {
                    email: {
                        rules: [{
                            required: true,
                            errorMessage: '域名不能为空'
                        }, {
                            format: 'email',
                            errorMessage: '域名格式错误'
                        }]
                    }
                }
            }
        },
        methods: {
            // 新增表单域
            add() {
                this.dynamicFormData.domains.push({
                    label: '域名',
                    value:'',
                    id: Date.now()
                })
            },
            // 删除表单域
            del(id) {
                let index = this.dynamicLists.findIndex(v => v.id === id)
                this.dynamicLists.splice(index, 1)
            },
            // 提交
            submit(ref) {
                this.$refs[ref].validate((err,value)=>{
                    console.log(err,value);
                })
            },
        }
    }
    </script>

    表单校验时机说明

    若需对子表单进行单独校验,可使用uni-forms-item的rules属性配合onFieldChange方法。

    <template>
        <view>
            <uni-forms  ref="form" :modelValue="formData" validate-trigger="bind">
                <uni-forms-item name="age" label="年龄">
                    <!-- uni-easyinput 的校验时机是数据发生变化, 即触发 input 时 -->
                    <uni-easyinput v-model="formData.age" type="text" placeholder="请输入年龄" />
                </uni-forms-item>
                <uni-forms-item ref="input"  name="email" label="邮箱">
                 <!-- input 的校验时机 -->
                    <input v-model="formData.email"  @blur="(e)=>$refs.input.onFieldChange($event.detail.value)" />
                </uni-forms-item>
                <button class="button" @click="submit">校验表单</button>
            </uni-forms>
        </view>
    </template>

    【1.4.0后此规则已不生效】对于表单校验时机,同时只会有一个validateTrigger发生作用,其作用权重为。

    规则 > uni-forms-item > uni-forms

    如果规则里配置了validateTrigger,则优先使用规则里的validateTrigger属性来决定表单校验时机。

    如果规则里没有配置validateTrigger,则优先使用uni-forms-item的validateTrigger属性来决定表单校验时机。

    如果uni-forms-item组件里没有配置validateTrigger,则优先使用uni-forms的validateTrigger属性来决定表单校验时机。

    以此类推,如果都没有使用validateTrigger属性,则会使用uni-forms的validateTrigger属性默认值来决定表单校验时机。

    API

    Forms Props

    属性名

    类型

    默认值

    可选值

    说明

    兼容说明

    model

    Object

    -

    -

    表单数据

    1.4.0 新增

    rules

    Object

    -

    -

    表单校验规则

    validateTrigger

    String

    submit

    bind/submit/blur

    表单校验时机,blur仅在 uni-easyinput 中生效

    1.4.0 新增 blur 值

    label-position

    String

    left

    top/left

    label 位置

    label-width

    String/Number

    75

    -

    label 宽度,单位 px

    label-align

    String

    left

    left/center/right

    label 居中方式

    err-show-type

    String

    undertext

    undertext/toast/modal

    表单错误信息提示方式

    border

    Boolean

    false

    -

    是否显示分格线

    value

    Object

    -

    -

    表单数据,兼容vue2

    即将弃用,请使用 model 代替

    modelValue

    Object

    -

    -

    表单数据,兼容vue3

    即将弃用,请使用 model 代替

    Forms Events

    事件称名

    说明

    @validate

    任意表单项被校验后触发,返回表单校验信息

    Forms Methods

    方法称名

    说明

    兼容说明

    setRules

    动态设置表单规则

    validate

    对整个表单进行校验的方法,会返回一个 promise

    validateField

    部分表单进行校验

    clearValidate

    移除表单的校验结果

    submit

    对整个表单进行校验的方法,会返回一个 promise

    即将弃用,请使用validate代替

    setValue

    设置表单某一项 name 的对应值,通常在 uni-forms-item 和自定表单组件中使用

    即将弃用,请使用 onFieldChange 兼容相关功能

    resetFields

    重置表单, 需要把uni-forms的modelValue属性改为v-model,且对内置组件可能不生效

    1.4.0 已弃用

    validate(keepItem:Array,callback:Function)方法说明

    validate方法用于对整个表单进行校验,该方法接收两个参数。

    参数称名

    类型

    说明

    keepItem

    Array

    保留不参与校验的字段

    callback

    Function

    校验完成返回函数

    校验成功后,校验对象只保留指定了name的字段(只要uni-forms-item绑定了name,即使不校验也会返回)。如需保留其他字段,则需使用keepItem属性。

    <template>
        <view>
            <uni-forms  ref="form" :modelValue="formData">
                <uni-forms-item name="age" label="年龄">
                    <uni-easyinput v-model="formData.age" type="text" placeholder="请输入年龄" />
                </uni-forms-item>
                <button class="button" @click="submit">校验表单</button>
            </uni-forms>
        </view>
    </template>
    <script>
    export default {
        data() {
            return {
                formData:{
                    age:''
                },
                rules: {
                    // ...
                }
            }
        },
        onLoad(){
            this.formData.id = 'testId'
        },
        methods: {
            submit() {
                // 在 onLoad 生命周期中,formData添加了一个 id 字段 ,此时这个字段是不参数校验的,所以结果中不返回
                // 在 validate(['id']) 方法中,指定第一个参数 ,即可返回id字段
                this.$refs.form.validate(['id'],(err,formData)=>{
                    if(!err){
                        console.log('success',formData)
                    }
                })
            }
        }
    }
    </script>

    validate方法还可以返回一个Promise对象。如果使用了callback,则Promise返回null,validate方法会优先使用callback。

    callback方法会返回两个返回值。

    第一个返回值为检验结果,如果校验失败,则返回失败信息;如果成功,返回null。

    第二个返回值为校验数据。

    // 使用 callback
    // 如果不需要 keepItem 参数 ,则可以省略
    this.$refs.form.validate((err,formData)=>{
        // 如果校验成功 ,err 返回 null
        if(!err){
            console.log('success',formData)
            return
        }
        console.log('error',err)
    }).then(res=>{
        // res 返回 null
    })
    // 使用 Promise
    // 对整个表单进行校验,返回一个 Promise
    this.$refs.form.validate().then((res)=>{
        // 成功返回,res 为表单数据
        // 其他逻辑处理 
        // ...
    }).catch((err)=>{
        // 表单校验验失败,err 为具体错误信息
        // 其他逻辑处理
        // ...
    })

    setValue(name:String,value:any)方法说明

    setValue方法通常用于内置组件或第三方组件返回值的校验。由于uni-easyinput等uni开头的组件内置了对uni-forms的支持,这些组件返回的值可直接使用。但对于input等内置组件,其值的变化无法及时通知uni-forms,从而无法正常校验,此时需手动将这些值加入uni-forms的校验流程。

    setValue方法接受两个参数。

    name:表单域对应的name。

    value:表单域对应的值。

    <template>
        <view>
            <uni-forms  ref="form" :modelValue="formData">
                <uni-forms-item name="age" label="年龄">
                    <input v-model="formData.age" @input="setValue('age',formData.age)">
                </uni-forms-item>
                <button class="button" @click="submit">校验表单</button>
            </uni-forms>
        </view>
    </template>
    <script>
    export default {
        data() {
            return {
                formData:{
                    age:''
                },
                rules: {
                    // ...
                }
            }
        },
        methods: {
            setValue(name,value){
                // 设置表单某项对应得值来触发表单校验
                // 接受两个参数,第一个参数为表单域的 name ,第二个参数为表单域的值
                this.$refs.form.setValue(name,value)
            },
            submit() {
                this.$refs.form.validate(['id'],(err,formData)=>{
                    if(!err){
                        console.log('success',formData)
                    }
                })
            }
        }
    }
    </script>

    其他方法说明

    // 设置规则
    this.$refs.form.setRules({
        //...
    })
    // 部分表单进行校验,接受一个参数,类型为 String 或 Array ,只校验传入 name 表单域的值
    this.$refs.form.validateField(['name', 'email']).then((res)=>{
        // 成功返回,res 为对应表单数据
        // 其他逻辑处理 
        // ...
    }).catch((err)=>{
        // 表单校验验失败,err 为具体错误信息
        // 其他逻辑处理
        // ...
    })
    // 移除表单校验,接受一个参数,类型为 String 或 Array ,只移除传入 name 表单域的值,如果不传入参数,则移除所有
    this.$refs.form.clearValidate(['name', 'email'])

    FormsItem Props

    属性名

    类型

    默认值

    可选值

    说明

    兼容说明

    name

    String/Array

    -

    -

    表单域的属性名,在使用校验规则时必填

    rules

    Object

    -

    -

    表单校验规则

    required

    Boolean

    false

    -

    label 右边显示红色"*"号,样式显示不会对校验规则产生效果

    label

    String

    -

    -

    输入框左边的文字提示

    label-width

    Number

    70

    -

    label的宽度,单位px

    error-message

    String

    -

    -

    显示的错误提示内容,如果为空字符串或者false,则不显示错误信息

    label-align

    String

    left

    left/center/right

    label的文字对齐方式

    label-position

    String

    left

    top/left

    label的文字的位置

    1.4.0已弃用 ,统一使用 uni-forms 的对齐方式

    validateTrigger

    String

    submit

    bind/submit

    表单校验时机

    1.4.0已弃用,统一使用 uni-forms 的校验时机

    left-icon

    String

    -

    -

    label左边的图标,限uni-ui的图标名称

    1.4.0已弃用 ,请使用 #label 插槽实现相关功能

    icon-color

    String

    #606266

    -

    左边通过icon配置的图标的颜色

    1.4.0已弃用 ,请使用 #label 插槽实现相关功

    FormsItem Methods

    方法称名

    说明

    兼容说明

    setRules

    动态设置表单规则

    onFieldChange

    校验子表单

    1.4.0新增

    FormsItem Slots

    插槽名

    说明

    default

    默认插槽

    label

    label插槽,自定义label显示内容

    示例

    <template>
        <view class="container">
            <uni-card :is-shadow="false" is-full>
                <text class="uni-h6">uni-forms 组件一般由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据。</text>
            </uni-card>
            <uni-section title="基本用法" type="line">
                <view class="example">
                    <!-- 基础用法,不包含校验规则 -->
                    <uni-forms ref="baseForm" :modelValue="baseFormData">
                        <uni-forms-item label="姓名" required>
                            <uni-easyinput v-model="baseFormData.name" placeholder="请输入姓名" />
                        </uni-forms-item>
                        <uni-forms-item label="年龄" required>
                            <uni-easyinput v-model="baseFormData.age" placeholder="请输入年龄" />
                        </uni-forms-item>
                        <uni-forms-item label="性别" required>
                            <uni-data-checkbox v-model="baseFormData.sex" :localdata="sexs" />
                        </uni-forms-item>
                        <uni-forms-item label="兴趣爱好" required>
                            <uni-data-checkbox v-model="baseFormData.hobby" multiple :localdata="hobbys" />
                        </uni-forms-item>
                        <uni-forms-item label="自我介绍">
                            <uni-easyinput type="textarea" v-model="baseFormData.introduction" placeholder="请输入自我介绍" />
                        </uni-forms-item>
                        <uni-forms-item label="日期时间">
                            <uni-datetime-picker type="datetime" return-type="timestamp" v-model="baseFormData.datetimesingle"/>
                        </uni-forms-item>
                    </uni-forms>
                </view>
            </uni-section>
            <uni-section title="对齐方式" type="line">
                <view class="example">
                    <view class="segmented-control">
                        <uni-segmented-control :current="current" :values="items" @clickItem="onClickItem" styleType="button">
                        </uni-segmented-control>
                    </view>
                    <!-- 展示不同的排列方式 -->
                    <uni-forms ref="baseForm" :modelValue="alignmentFormData" :label-position="alignment">
                        <uni-forms-item label="姓名" required>
                            <uni-easyinput v-model="baseFormData.name" placeholder="请输入姓名" />
                        </uni-forms-item>
                        <uni-forms-item label="年龄" required>
                            <uni-easyinput v-model="baseFormData.age" placeholder="请输入年龄" />
                        </uni-forms-item>
                    </uni-forms>
                </view>
            </uni-section>
            <uni-section title="表单校验" type="line">
                <view class="example">
                    <!-- 基础表单校验 -->
                    <uni-forms ref="valiForm" :rules="rules" :modelValue="valiFormData">
                        <uni-forms-item label="姓名" required name="name">
                            <uni-easyinput v-model="valiFormData.name" placeholder="请输入姓名" />
                        </uni-forms-item>
                        <uni-forms-item label="年龄" required name="age">
                            <uni-easyinput v-model="valiFormData.age" placeholder="请输入年龄" />
                        </uni-forms-item>
                        <uni-forms-item label="自我介绍" name="introduction">
                            <uni-easyinput type="textarea" v-model="valiFormData.introduction" placeholder="请输入自我介绍" />
                        </uni-forms-item>
                    </uni-forms>
                    <button type="primary" @click="submit('valiForm')">提交</button>
                </view>
            </uni-section>
            <uni-section title="自定义校验规则" type="line">
                <view class="example">
                    <!-- 自定义表单校验 -->
                    <uni-forms ref="customForm" :rules="customRules" :modelValue="customFormData">
                        <uni-forms-item label="姓名" required name="name">
                            <uni-easyinput v-model="customFormData.name" placeholder="请输入姓名" />
                        </uni-forms-item>
                        <uni-forms-item label="年龄" required name="age">
                            <uni-easyinput v-model="customFormData.age" placeholder="请输入年龄" />
                        </uni-forms-item>
                        <uni-forms-item label="兴趣爱好" required name="hobby">
                            <uni-data-checkbox v-model="customFormData.hobby" multiple :localdata="hobbys" />
                        </uni-forms-item>
                    </uni-forms>
                    <button type="primary" @click="submit('customForm')">提交</button>
                </view>
            </uni-section>
            <uni-section title="动态表单" type="line">
                <view class="example">
                    <!-- 动态表单校验 -->
                    <uni-forms ref="dynamicForm" :rules="dynamicRules" :modelValue="dynamicFormData">
                        <uni-forms-item label="邮箱" required name="email">
                            <uni-easyinput v-model="dynamicFormData.email" placeholder="请输入姓名" />
                        </uni-forms-item>
                        <uni-forms-item v-for="(item,index) in dynamicLists" :key="item.id" :label="item.label+' '+index"
                            required :rules="item.rules" :name="'domains[' + item.id + ']'">
                            <view class="form-item">
                                <uni-easyinput v-model="dynamicFormData.domains[item.id]" placeholder="请输入域名" />
                                <button class="button" size="mini" type="default" @click="del(item.id)">删除</button>
                            </view>
                        </uni-forms-item>
                    </uni-forms>
                    <view class="button-group">
                        <button type="primary" size="mini" @click="add">新增域名</button>
                        <button type="primary" size="mini" @click="submit('dynamicForm')">提交</button>
                    </view>
                </view>
            </uni-section>
        </view>
    </template>
    <script>
        export default {
            data() {
                return {
                    // 基础表单数据
                    baseFormData: {
                        name: '',
                        age: '',
                        introduction: '',
                        sex: 2,
                        hobby: [5],
                        datetimesingle: 1627529992399
                    },
                    // 表单数据
                    alignmentFormData: {
                        name: '',
                        age: '',
                    },
                    // 单选数据源
                    sexs: [{
                        text: '男',
                        value: 0
                    }, {
                        text: '女',
                        value: 1
                    }, {
                        text: '保密',
                        value: 2
                    }],
                    // 多选数据源
                    hobbys: [{
                        text: '跑步',
                        value: 0
                    }, {
                        text: '游泳',
                        value: 1
                    }, {
                        text: '绘画',
                        value: 2
                    }, {
                        text: '足球',
                        value: 3
                    }, {
                        text: '篮球',
                        value: 4
                    }, {
                        text: '其他',
                        value: 5
                    }],
                    // 分段器数据
                    current: 0,
                    items: ['左对齐', '顶部对齐'],
                    // 校验表单数据
                    valiFormData: {
                        name: '',
                        age: '',
                        introduction: '',
                    },
                    // 校验规则
                    rules: {
                        name: {
                            rules: [{
                                required: true,
                                errorMessage: '姓名不能为空'
                            }]
                        },
                        age: {
                            rules: [{
                                required: true,
                                errorMessage: '年龄不能为空'
                            }, {
                                format: 'number',
                                errorMessage: '年龄只能输入数字'
                            }]
                        }
                    },
                    // 自定义表单数据
                    customFormData: {
                        name: '',
                        age: '',
                        hobby: []
                    },
                    // 自定义表单校验规则
                    customRules: {
                        name: {
                            rules: [{
                                required: true,
                                errorMessage: '姓名不能为空'
                            }]
                        },
                        age: {
                            rules: [{
                                required: true,
                                errorMessage: '年龄不能为空'
                            }]
                        },
                        hobby: {
                            rules: [{
                                    format: 'array'
                                },
                                {
                                    validateFunction: function(rule, value, data, callback) {
                                        if (value.length < 2) {
                                            callback('请至少勾选两个兴趣爱好')
                                        }
                                        return true
                                    }
                                }
                            ]
                        }
                    },
                    dynamicFormData: {
                        email: '',
                        domains: {}
                    },
                    dynamicLists: [],
                    dynamicRules: {
                        email: {
                            rules: [{
                                required: true,
                                errorMessage: '域名不能为空'
                            }, {
                                format: 'email',
                                errorMessage: '域名格式错误'
                            }]
                        }
                    }
                }
            },
            computed: {
                // 处理表单排列切换
                alignment() {
                    if (this.current === 0) return 'left'
                    if (this.current === 1) return 'top'
                    return 'left'
                }
            },
            onLoad() {},
            onReady() {
                // 设置自定义表单校验规则,必须在节点渲染完毕后执行
                this.$refs.customForm.setRules(this.customRules)
            },
            methods: {
                onClickItem(e) {
                    console.log(e);
                    this.current = e.currentIndex
                },
                add() {
                    this.dynamicLists.push({
                        label: '域名',
                        rules: [{
                            'required': true,
                            errorMessage: '域名项必填'
                        }],
                        id: Date.now()
                    })
                },
                del(id) {
                    let index = this.dynamicLists.findIndex(v => v.id === id)
                    this.dynamicLists.splice(index, 1)
                },
                submit(ref) {
                    this.$refs[ref].validate().then(res => {
                        console.log('success', res);
                        uni.showToast({
                            title: `校验通过`
                        })
                    }).catch(err => {
                        console.log('err', err);
                    })
                },
            }
        }
    </script>
    <style lang="scss">
        .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;
        }
    </style>

总结

到此这篇关于uniapp表单校验的文章就介绍到这了,更多相关uniapp表单校验内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

作者最新文章