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.
Customized Validation
We can add the validation-status
prop to show the validation status on the form field:
<template>
<a-form :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-item
label="Fail"
validate-status="error"
help="Should be combination of numbers & alphabets"
>
<a-input id="error" placeholder="unavailable choice"/>
</a-form-item>
</a-form>
</template>
<script>
export default {
data() {
return {
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 12 }
}
};
}
};
</script>
The help
prop has the text that is below the form.
labelCol
has the size of the labels.
wrapper-col
has the wrapper’s columns.
Customized Form Controls
We can customize form controls by nesting our own controls into the a-form-item
component:
<template>
<a-form layout="inline" :form="form" @submit="handleSubmit">
<a-form-item label="Price">
<price-input
v-decorator="[
'price',
{
initialValue: { number: 0, currency: 'pesos' },
rules: [{ validator: checkPrice }],
},
]"
/>
</a-form-item>
<a-form-item>
<a-button type="primary" html-type="submit">Submit</a-button>
</a-form-item>
</a-form>
</template>
<script>
const PriceInput = {
props: ["value"],
template: `
<span>
<a-input
type='text'
:value="number"
@change="handleNumberChange"
style="width: 63%; margin-right: 2%;"
/>
<a-select
:value="currency"
style="width: 32%"
@change="handleCurrencyChange"
>
<a-select-option value='pesos'>Pesos</a-select-option>
<a-select-option value='dollar'>Dollar</a-select-option>
</a-select>
</span>
`,
data() {
const value = this.value || {};
return {
number: value.number || 0,
currency: value.currency || "pesos"
};
},
watch: {
value(val = {}) {
this.number = val.number || 0;
this.currency = val.currency || "pesos";
}
},
methods: {
handleNumberChange(e) {
const number = parseInt(e.target.value || 0, 10);
if (isNaN(number)) {
return;
}
this.triggerChange({ number });
},
handleCurrencyChange(currency) {
this.triggerChange({ currency });
},
triggerChange(changedValue) {
this.$emit("change", Object.assign({}, this.$data, changedValue));
}
}
};
export default {
components: {
PriceInput
},
beforeCreate() {
this.form = this.$form.createForm(this, {
name: "customized_form_controls"
});
},
methods: {
handleSubmit(e) {
e.preventDefault();
this.form.validateFields((err, values) => {
if (!err) {
console.log("Received values of form: ", values);
}
});
},
checkPrice(rule, value, callback) {
if (value.number > 0) {
callback();
return;
}
callback("Price must greater than zero!");
}
}
};
</script>
We have the price-input
component to display the custom inputs from the component as one form field.
Form Model
We can use form fields with the v-model
directive. For example, we can write:
main.js
import Vue from "vue";
import App from "./App.vue";
import Antd from "ant-design-vue";
import "ant-design-vue/dist/antd.css";
import { FormModel } from "ant-design-vue";
Vue.config.productionTip = false;
Vue.use(FormModel);
Vue.use(Antd);
new Vue({
render: (h) => h(App)
}).$mount("#app");
App.vue
<template>
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-model-item label="Name">
<a-input v-model="form.name"/>
</a-form-model-item>
<a-form-model-item :wrapper-col="{ span: 14, offset: 4 }">
<a-button type="primary" @click="onSubmit">Create</a-button>
</a-form-model-item>
</a-form-model>
</template>
<script>
export default {
data() {
return {
labelCol: { span: 4 },
wrapperCol: { span: 14 },
form: {
name: ""
}
};
},
methods: {
onSubmit() {
console.log("submit!", this.form);
}
}
};
</script>
We register the FormModel
plugin to let us use v-model
to bind our form fields to reactive properties.
v-model
can be used with any other form control component with the FormModel
plugin.
Conclusion
Form validation can be customized and we can bind form fields to reactive properties with v-model
with Ant Design Vue.