UNPKG

vue-form

Version:

Form validation for Vue.js

157 lines (129 loc) 5.48 kB
<!DOCTYPE html> <html> <head> <title>vue-form example</title> <meta charset="utf-8" /> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous"> <style> .required-field>label::after { content: '*'; color: red; margin-left: 0.25rem; } </style> </head> <body> <div id="app" class="container py-5"> <p>Example showing vue-form usage with Bootstrap styles, validation messages are shown on field touch or form submission</p> <vue-form :state="formstate" v-model="formstate" @submit.prevent="onSubmit" @reset="onReset"> <button type="reset">Reset</button> <validate auto-label class="form-group required-field" :class="fieldClassName(formstate.name)"> <label>Name</label> <input type="text" name="name" class="form-control" required v-model.lazy="model.name"> <field-messages name="name" show="$touched || $submitted" class="form-control-feedback"> <div>Success!</div> <div slot="required">Name is a required field</div> </field-messages> </validate> <validate auto-label class="form-group required-field" :class="fieldClassName(formstate.email)"> <label>Email</label> <input type="email" name="email" class="form-control" required v-model.lazy="model.email"> <field-messages auto-label name="email" show="$touched || $submitted" class="form-control-feedback"> <div>Success!</div> <div slot="required">Email is a required field</div> <div slot="email">Email is invalid</div> </field-messages> </validate> <validate auto-label class="form-group required-field" :class="fieldClassName(formstate.phone)"> <label>Phone number (format: xxxx-xxx-xxxx)</label> <input type="tel" name="phone" class="form-control" required pattern="^\d{4}-\d{3}-\d{4}$" v-model.lazy="model.phone"> <field-messages name="phone" show="$touched || $submitted" class="form-control-feedback"> <div>Success!</div> <div slot="required">Phone number is a required field</div> <div slot="pattern">Phone number is invalid</div> </field-messages> </validate> <validate auto-label class="form-group required-field" :class="fieldClassName(formstate.department)"> <label>Department</label> <select class="form-control" name="department" required v-model.lazy="model.department"> <option :value="null">Choose...</option> <option value="1">AAA</option> <option value="2">BBB</option> <option value="3">CCC</option> </select> <field-messages name="department" show="$touched || $dirty || $submitted" class="form-control-feedback"> <div>Success!</div> <div slot="required">Department is a required field</div> </field-messages> </validate> <validate auto-label class="form-group" :class="fieldClassName(formstate.comments)"> <label>Comments</label> <textarea name="comments" class="form-control" maxlength="50" v-model.lazy="model.comments"></textarea> <small class="form-text text-muted">Enter no more than 50 characters.</small> <field-messages name="comments" show="$touched || $submitted" class="form-control-feedback"> <div>Success!</div> <div slot="maxlength">Comments must be less than 50 characters</div> </field-messages> </validate> <field class="form-group"> <label>Not validated</label> <input type="text" name="notValidated" class="form-control" v-model.lazy="model.notValidated"> </field> <div class="py-2 text-center"> <button class="btn btn-primary" type="submit">Submit</button> </div> </vue-form> <pre>{{formstate}}</pre> <pre>{{model}}</pre> </div> <script src="../node_modules/vue/dist/vue.js"></script> <script src="../dist/vue-form.js"></script> <script> var options = { inputClasses: { valid: 'form-control-success', invalid: 'form-control-danger' } } var vm = new Vue({ el: '#app', mixins: [new VueForm(options)], data: { formstate: {}, clonedModel: null, model: { name: '', email: '', phone: '', department: null, comments: '', notValidated: '' } }, created: function() { this.clonedModel = JSON.parse(JSON.stringify(this.model)); }, methods: { fieldClassName: function(field) { if (!field) { return ''; } if ((field.$touched || field.$submitted) && field.$valid) { return 'has-success'; } if ((field.$touched || field.$submitted) && field.$invalid) { return 'has-danger'; } }, onSubmit: function() { console.log(this.formstate.$valid); }, onReset: function() { this.model = JSON.parse(JSON.stringify(this.clonedModel)); console.log('reset'); } } }); </script> </body> </html>