<div id="app">
  <input type="email" v-focus v-validation v-model="email">
</div>
Vue.directive('focus', {
  inserted: function(el){
    el.focus();
  }
})
Vue.directive('validation', {
  update: function(el,binding, vnode){
    console.log(vnode.context.email);
    var value = vnode.context.email;
    var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
    
    if (!re.test(value)) {
      el.className = 'form-control is-invalid'
    } else {
      el.className = 'form-control is-valid'
    }
    
  },
  bind: function(el){
    el.className = 'form-control'; 
  }
})
var app = new Vue({
  el:'#app',
  data:{
    email: 'ddd@email'
  },
  mounted: function(){
    console.log('Vue init', this);
  }
})

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js