Vue 开发实战实战篇 # 38:表单初始数据自动校验动态赋值

Posted 凯小默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue 开发实战实战篇 # 38:表单初始数据自动校验动态赋值相关的知识,希望对你有一定的参考价值。

说明

【Vue 开发实战】学习笔记。

ant design vue 跟 elementui 的表单校验区别

ant design vue 的表单设计模式是自动校验不能使用双向绑定,而是将数据托管给 form,form 就像一个黑盒,里面的数据不会影响到其他的数据,如果需要数据同步到其他组件,需要调用 form 提供的 api 进行获取。

比对图如下:

v-decorator 指令

https://github.com/vueComponent/ant-design-vue/blob/1.x/components/_util/FormDecoratorDirective.js

v-decorator 指令什么都没做,就是一个标志位。便于form去劫持数据。

export function antDecorator(Vue) 
  return Vue.directive('decorator', );


export default 
  // just for tag
  install: Vue => 
    antDecorator(Vue);
  ,
;

修改手动校验的表单

<template>
    <a-form :layout="formLayout" :form="form">
        <a-form-item
            label="Form Layout"
            :label-col="formItemLayout.labelCol"
            :wrapper-col="formItemLayout.wrapperCol"
        >
            <a-radio-group
                default-value="horizontal"
                @change="handleFormLayoutChange"
            >
                <a-radio-button value="horizontal"> Horizontal </a-radio-button>
                <a-radio-button value="vertical"> Vertical </a-radio-button>
                <a-radio-button value="inline"> Inline </a-radio-button>
            </a-radio-group>
        </a-form-item>
        <a-form-item
            label="Field A"
            :label-col="formItemLayout.labelCol"
            :wrapper-col="formItemLayout.wrapperCol"
        >
            <a-input v-decorator="[
                'fieldA',
                
                    initialValue: fieldA,
                    rules: [
                        
                            required: true,
                            min: 6,
                            message: '必须大于5个字符'
                        
                    ]
                ,
            ]" placeholder="input placeholder" />
        </a-form-item>
        <a-form-item
            label="Field B"
            :label-col="formItemLayout.labelCol"
            :wrapper-col="formItemLayout.wrapperCol"
        >
            <a-input v-decorator="['fieldB']" placeholder="input placeholder" />
        </a-form-item>
        <a-form-item :wrapper-col="buttonItemLayout.wrapperCol">
            <a-button type="primary" @click="handleSubmit"> Submit </a-button>
        </a-form-item>
    </a-form>
</template>

<script>
export default 
    data() 
        this.form = this.$form.createForm(this);
        return 
            formLayout: "horizontal",
            fieldA: "hello kaimo",
            fieldB: "",
        ;
    ,
    computed: 
        formItemLayout() 
            const  formLayout  = this;
            return formLayout === "horizontal"
                ? 
                      labelCol:  span: 4 ,
                      wrapperCol:  span: 14 ,
                  
                : ;
        ,
        buttonItemLayout() 
            const  formLayout  = this;
            return formLayout === "horizontal"
                ? 
                      wrapperCol:  span: 14, offset: 4 ,
                  
                : ;
        ,
    ,
    mounted() 
        // 动态赋值
        setTimeout(() => 
            this.form.setFieldsValue(
                fieldB: "kaimo313"
            )
        , 2000)
    ,
    methods: 
        handleFormLayoutChange(e) 
            this.formLayout = e.target.value;
        ,
        handleSubmit() 
            // 自动校验
            this.form.validateFields((err, values) => 
                console.log(err, values)
                if(!err) 
                    console.log(values);
                
            )
        ,
    ,
;
</script>

效果

以上是关于Vue 开发实战实战篇 # 38:表单初始数据自动校验动态赋值的主要内容,如果未能解决你的问题,请参考以下文章

Vue 开发实战实战篇 # 40:自己封装一个支持自动校验的表单项

Vue 开发实战实战篇 # 39:创建一个分步表单

Vue 开发实战实战篇 # 32:如何使用路由管理用户权限

VUE项目实战11绘制登录组件-数据验证篇

Vue 开发实战基础篇 # 10:生命周期的应用场景和函数式组件

Vue 开发实战实战篇 # 35:如何高效地使用Mock数据进行开发