实现表单组件 #

表单组件的使用 #

使用组件的方式 #

<template>
    <el-form :model="form" :rules="rules">
        <el-form-item label="用户名" prop="username">
            <el-input v-model="form.username" ></el-input>
        </el-form-item>
        <el-form-item label="密码" prop="password">
            <el-input v-model="form.password" ></el-input>
        </el-form-item>
        <el-form-item>
        <el-form-item>
            <button>确认提交</button>
        </el-form-item>
    </el-form>
</template>
<script>
import Form from './components/Form';
import FormItem from './components/FormItem';
import Input from './components/Input.vue';
export default {
    components:{
        'el-form':Form,
        'el-form-item':FormItem,
        'el-input':Input
    },
    data(){
        return {
            form:{
                username:'',
                password:''
            },
            rules:{
                username:[
                    {required:true,message:'请输入用户名'}
                ],
                password:[
                    {required:true,message:'请输入密码'}
                ]
            }
        }
    }
}
</script>

Form组件的基本结构 #

<template>
    <form onsubmit="return false">
        <slot></slot>
    </form>
</template>
<script>
export default {
    props:{
        model:{
            type:Object
        },
        rules:{
            type:Object
        }
    }
}
</script>

FormItem组件结构 #

<template>
    <div>
        <label v-if="label">{{label}}</label>
        <slot></slot>
        <div>校验文字</div>
    </div>
</template>
<script>
export default {
    props:{
        label:String,
        prop:String
    }
}
</script>

Input组件结构 #

<template>
    <input type="text" :value="inputValue">
</template>
<script>
export default {
    props:{
        value:String
    },
    data(){
        return {inputValue:this.value}
    }
}
</script>

实现组件间的数据传递 #

我们在form组件中直接将当前实例暴露出去

我们在formItem组件中,通过eventsBus订阅input事件

到目前为止基本的校验功能已经实现啦

当点击按钮时校验当前表单是否验证成功 #

<el-form :model="form" :rules="rules" ref="form">
<button @click="validate">确认提交</button>
validate(){ // form组件中校验是通过
    this.$refs.form.validate((valid)=>{
        if(valid){
            alert('校验通过')
        }else{
            alert('校验不通过')
        }
    });
}

// 在form组件中检查所有的formItem是否全部通过校验
validate(cb){
    cb(this.$children.every(child=>child.validateStatus!='error'))
}