import type { App } from 'vue'
import { isExist } from '../utils';
export function int(app: App) {
let isFirstCompleteDeci = false;
app.directive('int', {
mounted(el, binding, vnode, prevVnode) {
const input = el.querySelector('input');
bindEvents(input, input.value);
}
})
const deciHandler = (input: HTMLElement | EventTarget) => {
let value = input.value;
const reg = new RegExp("(?:[^-.0-9]+)?\\-*(0)*([1-9]\\d*)?(?:[^-.0-9]+)?", "g");
const matches = reg.exec(value);
value = matches[2] || '';
if (isExist(matches[1], true) && !value) {
value = matches[1].replace(/0+/, '0');
}
return value
}
const bindEvents = (input: HTMLElement, oldValue: string) => {
let lock = false;
input.addEventListener('compositionstart', () => {
lock = true;
})
input.addEventListener('compositionend', () => {
lock = false;
input.dispatchEvent(new Event('input'))
})
input.addEventListener('input', () => {
if (lock) { return }
const curValue = input.value;
const value = deciHandler(input);
if(oldValue != curValue) {
oldValue = value;
input.value = value;
input.dispatchEvent(new Event('input'))
}
})
}
}
工具函数
export const emptyObj = (obj: any) => {
let value = JSON.stringify(obj)
return value == '{}' || value == '[]';
}
export const isExist = (value: any, zeroValid = false) => {
let flag = true;
/^\s*$/.test(value) && (flag = false)
if (/^-*\d+(\.\d+)?$/.test(value)) {
if ((value == 0 && !zeroValid) || value < 0) {
flag = false;
}
} else {
flag && (flag = !!value);
}
emptyObj(value) && (flag = false);
Array.isArray(value) && value.length == 0 && (flag = false);
return flag;
}