Ant Design Vue or AntD Vue, is a useful UI framework made for Vue.js.
In this article, we’ll look at how to use it in our Vue apps.
Form Validation Rules
We can set the rules with the rules
prop:
<template>
<a-form :form="form">
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="Name"
>
<a-input
v-decorator="[
'username',
{ rules: [{ required: true, message: 'Please input your name' }] },
]"
placeholder="Please input your name"
/>
</a-form-item>
<a-form-item
:label-col="formItemLayout.labelCol"
:wrapper-col="formItemLayout.wrapperCol"
label="Nickname"
>
<a-input
v-decorator="[
'nickname',
{ rules: [{ required: checkNick, message: 'Please input your nickname' }] },
]"
placeholder="Please input your nickname"
/>
</a-form-item>
<a-form-item :label-col="formTailLayout.labelCol" :wrapper-col="formTailLayout.wrapperCol">
<a-checkbox :checked="checkNick" @change="handleChange">Nickname is required</a-checkbox>
</a-form-item>
<a-form-item :label-col="formTailLayout.labelCol" :wrapper-col="formTailLayout.wrapperCol">
<a-button type="primary" @click="check">Check</a-button>
</a-form-item>
</a-form>
</template>
<script>
const formItemLayout = {
labelCol: { span: 4 },
wrapperCol: { span: 8 }
};
const formTailLayout = {
labelCol: { span: 4 },
wrapperCol: { span: 8, offset: 4 }
};
export default {
data() {
return {
checkNick: false,
formItemLayout,
formTailLayout,
form: this.$form.createForm(this, { name: "dynamic_rule" })
};
},
methods: {
check() {
this.form.validateFields(err => {
if (!err) {
console.info("success");
}
});
},
handleChange(e) {
this.checkNick = e.target.checked;
this.$nextTick(() => {
this.form.validateFields(["nickname"], { force: true });
});
}
}
};
</script>
We set the required
property in the object we added to the rules
property to the checkNick
reactive property so that we can make the nickname required only when the Nickname is required checkbox is checked.
Inline Form
We can set the layout
prop to inline
to make the form fields display inline:
<template>
<a-form layout="inline" :form="form" @submit="handleSubmit">
<a-form-item :validate-status="userNameError() ? 'error' : ''" :help="userNameError() || ''">
<a-input
v-decorator="[
'userName',
{ rules: [{ required: true, message: 'Please input your username!' }] },
]"
placeholder="Username"
>
<a-icon slot="prefix" type="user" style="color:rgba(0,0,0,.25)"/>
</a-input>
</a-form-item>
<a-form-item :validate-status="passwordError() ? 'error' : ''" :help="passwordError() || ''">
<a-input
v-decorator="[
'password',
{ rules: [{ required: true, message: 'Please input your Password!' }] },
]"
type="password"
placeholder="Password"
>
<a-icon slot="prefix" type="lock" style="color:rgba(0,0,0,.25)"/>
</a-input>
</a-form-item>
<a-form-item>
<a-button
type="primary"
html-type="submit"
:disabled="hasErrors(form.getFieldsError())"
>Log in</a-button>
</a-form-item>
</a-form>
</template>
<script>
function hasErrors(fieldsError) {
return Object.keys(fieldsError).some(field => fieldsError[field]);
}
export default {
data() {
return {
hasErrors,
form: this.$form.createForm(this, { name: "horizontal_login" })
};
},
mounted() {
this.$nextTick(() => {
this.form.validateFields();
});
},
methods: {
userNameError() {
const { getFieldError, isFieldTouched } = this.form;
return isFieldTouched("userName") && getFieldError("userName");
},
passwordError() {
const { getFieldError, isFieldTouched } = this.form;
return isFieldTouched("password") && getFieldError("password");
},
handleSubmit(e) {
e.preventDefault();
this.form.validateFields((err, values) => {
if (!err) {
console.log("Received values of form: ", values);
}
});
}
}
};
</script>
Conclusion
We can add form validation and change the layout with Ant Design Vue.