Vue
by RomainMazB
HTML
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.full.js"></script>
<div id="app">
<button @click="validateForm()">Validate</button>
<Validation-Observer ref="observer">
<Validation-Provider v-for="(domain, index) in domains" v-slot="{ errors }" rules="url" :key="index" tag="div" mode="eager" name="domain">
<input v-model="domain.url" />
<span>{{ errors[0] }}</span>
</Validation-Provider>
</Validation-Observer>
<h3>Test result: {{ test_result }}</h3>
</div>
CSS
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
li {
margin: 8px 0;
}
h2 {
font-weight: bold;
margin-bottom: 15px;
}
del {
color: rgba(0, 0, 0, 0.3);
}
Vue
VeeValidate.extend('url', {
validate: (str) => {
var pattern = new RegExp('^(http(s)?:\\/\\/)'+ // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name
'((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
'(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator
return !!pattern.test(str);
},
message: 'This is not a valid URL'
})
// Register the component globally.
Vue.component('ValidationProvider', VeeValidate.ValidationProvider);
Vue.component('ValidationObserver', VeeValidate.ValidationObserver);
new Vue({
el: "#app",
data: {
domains: [{id: 1, url: 'www.google.com'}, {id: 4, url: 'www.google.moc'}, {id: 6, url: 'www.google.omc'}],
test_result: 'Not validated yet'
},
methods: {
async validateForm() {
let is_valid = await this.$refs.observer.validate()
if(!is_valid) {
this.test_result = 'Failed'
return
}
this.test_result = 'Passed'
}
}
})