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

Posted 凯小默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue 开发实战实战篇 # 40:自己封装一个支持自动校验的表单项相关的知识,希望对你有一定的参考价值。

说明

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

自定义表单控件

自定义或第三方的表单控件,也可以与 Form 组件一起使用。只要该组件遵循以下的约定:

  • 提供受控属性 value 或其它与 valuePropName-参数) 的值同名的属性。
  • 提供 onChange 事件或 trigger-参数) 的值同名的事件。
  • 不能是函数式组件。

实现的组件效果

支持下拉选择,然后自定义校验该组件,提交能把选择的数据传递到接口


不通过:

编写组件

新建 ant-design-vue-pro\\src\\components\\ReceiverAccount.vue

<template>
    <a-input-group compact>
        <a-select v-model="type" style="width: 120px;" @change="handleTypeChange">
            <a-select-option value="alipay">支付宝</a-select-option>
            <a-select-option value="bank">银行账户</a-select-option>
        </a-select>
        <a-input style="width: calc(100% - 120px);" v-model="number" @change="handleNumberChange"/>
    </a-input-group>
</template>

<script>
export default 
    props: 
        value: 
            type: Object,
        ,
    ,
    data() 
        const  type, number  = this.value;
        return 
            type: type || "alipay",
            number: number || ""
        ;
    ,
    watch: 
        value(val) 
            // 同步给 type、number
            Object.assign(this, val);
        
    ,
    methods: 
        handleTypeChange(val) 
            this.$emit("change",  ...this.value, type: val );
        ,
        handleNumberChange(e) 
            this.$emit("change",  ...this.value, number: e.target.value );
        
    ,
;
</script>

<style></style>

表单的 vuex 添加状态

const state = 
    step: 
        payAccount: "kaimo313",
        receiverAccount: 
            type: "alipay",
            number: ""
        
    

在 Step1 组件里使用

<template>
    <div>
        <a-form layout="horizontal" :form="form">
            <a-form-item
                label="付款账号"
                :label-col="formItemLayout.labelCol"
                :wrapper-col="formItemLayout.wrapperCol"
            >
                <a-input v-decorator="[
                    'payAccount',
                    
                        initialValue: step.payAccount,
                        rules: [
                            
                                required: true,
                                message: '请输入付款账号'
                            
                        ]
                    ,
                ]" placeholder="请输入付款账号" />
            </a-form-item>
            <a-form-item
                label="收款账号"
                :label-col="formItemLayout.labelCol"
                :wrapper-col="formItemLayout.wrapperCol"
            >
                <ReceiverAccount v-decorator="[
                    'receiverAccount',
                    
                        initialValue: step.receiverAccount,
                        rules: [
                            
                                required: true,
                                message: '请输入收款账号',
                                validator: (rule, value, callback) => 
                                    if(value && value.number) 
                                        callback();
                                    else
                                        callback('收款账号没有填写');
                                    
                                
                            ,
                        ]
                    ,
                ]"/>
            </a-form-item>
            <a-form-item>
                <a-button type="primary" @click="handleSubmit">下一步</a-button>
            </a-form-item>
        </a-form>
    </div>
</template>

<script>
import ReceiverAccount from "@/components/ReceiverAccount.vue";
export default 
    data() 
        this.form = this.$form.createForm(this);
        return 
            formItemLayout:
                labelCol:  span: 4 ,
                wrapperCol:  span: 14 ,
            
        ;
    ,
    components:  ReceiverAccount ,
    computed: 
        step() 
            return this.$store.state.form.step
        
    ,
    created() 
        console.log("this.$store---->", this.$store)
    ,
    methods: 
        handleSubmit() 
            const  form, $router, $store = this;
            form.validateFields((err, values) => 
                console.log(err, values)
                if(!err) 
                    console.log(values);
                    $store.commit(
                        type: "form/saveStepFormData",
                        payload: values
                    );
                    $router.push("/form/step-form/confirm");
                
            )
        
    ,
;
</script>

<style></style>

以上是关于Vue 开发实战实战篇 # 40:自己封装一个支持自动校验的表单项的主要内容,如果未能解决你的问题,请参考以下文章

Vue 开发实战实战篇 # 36:如何与服务端进行交互(Axios)

Vue 开发实战学习笔记48篇(完结)

Vue 开发实战生态篇 # 23:组件库对比:Element UIAnt Design VueiView

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

Vue 开发实战实战篇 # 30:实现一个可动态改变的页面布局

Vue 开发实战实战篇 # 29:如何设计一个高扩展性的路由