<script>代码为
Vue.directive("change-num",{
bind:(el,binding,vnode)=>{
let input = vnode.elm.children[0];
input.addEventListener('compositionstart', () => {
vnode.inputLocking = true
})
input.addEventListener('compositionend', () => {
vnode.inputLocking = false
input.dispatchEvent(new Event('input'))
})
input.addEventListener('input', () => {
if(vnode.inputLocking) {
return;
}
let oldValue = input.value;
let newValue = input.value;
newValue = newValue.replace(/[^\d.]/g, '');
newValue = newValue.replace(/^\./g, '');
newValue = newValue.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
newValue = newValue.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3')
if(newValue) {
let arr = newValue.split('.')
// 去掉开头多余的0
newValue = Number(arr[0]) + (arr[1] === undefined ? '' : '.' + arr[1])
}
// 判断是否需要更新,避免进入死循环
if(newValue !== oldValue) {
input.value = newValue
input.dispatchEvent(new Event('input')) // 通知v-model更新
}
})
// input 事件无法处理小数点后面全是零的情况 因为无法确定用户输入的0是否真的应该清除,如3.02。放在blur中去处理
input.addEventListener('blur', () => {
let oldValue = input.value;
let newValue = input.value;
if(newValue) {
newValue = Number(newValue).toString()
}
// 判断是否需要更新,避免进入死循环
if(newValue !== oldValue) {
input.value = newValue
input.dispatchEvent(new Event('input')) // 通知v-model更新
}
})
}
});
使用Vue.js的自定义指令,在el-input 中直接调用v-change-num,如v-if
<el-col :span="8">
<el-form-item label="参数" prop="param" :rules="[{ required: false, message: '必填,不能为空'}]">
<el-input v-model="beanForm.param" clearable v-change-num placeholder="" class="el_in_width"></el-input>
</el-form-item>
</el-col>