自定义指令实现文本框正则校验
Vue.directive('validateNumber', {
bind(el, binding, vnode) {
let lastData = null
el.onkeyup = (e) => {
if (String.fromCharCode(e.keyCode) == 'E' || String.fromCharCode(e.keyCode) == 'KeyE') {
e.target.value = lastData
return false
} else {
lastData = e.target.value
}
e.target.value = e.target.value.replace(/[^\d]/ig, '')
if (!!binding.expression && !!e.target.value) {
let obj = (new Function("return " + binding.expression))()
let keys = Object.keys(obj)
let values = Object.values(obj)
if (keys[0] == 'min') {
if (e.target.value < values[0])
e.target.value = values[0]
}
if (keys[1] == 'max') {
if (e.target.value > values[1])
e.target.value = values[1]
}
}
let _this = vnode.context
_this.accessNestedObject(_this, vnode.data.model.expression, e.target.value)
}
}
})
Vue.prototype.accessNestedObject = function (obj, path, value) {
let keys = path.split('.');
let key = keys[0];
if (keys.length > 1) {
this.accessNestedObject(obj[key], keys.slice(1).join('.'), value);
} else {
obj[key] = value;
}
return obj;
}
<el-input v-model="cron.day" v-validateNumber="{ min: 1, max: 31 }" class="cron-input-width"></el-input>
<el-input v-model="cron.day" v-validateNumber="{ min: 1 }" class="cron-input-width"></el-input>
<el-input v-model="cron.day" v-validateNumber class="cron-input-width"></el-input>