UNPKG

@opensig/opendesign

Version:

<p align="center"><img src="../docs/public/opendesign-logo-light.png"/></p> <h1 align="center">opendesign</h1> <p align="center">一个 Vue 3 组件库</p> <p align="center"><b>皮肤可定制,使用 TypeScript</b></p>

202 lines (201 loc) 6.12 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const useComposition = require("../hooks/use-composition.js"); const is = require("../_utils/is.js"); const keycode = require("../_utils/keycode.js"); const vue = require("vue"); function useInput(options) { const { modelValue, defaultValue, format, emits, emitUpdate, validate, valueOnInvalidChange, maxLength, minLength, calculateLength, inputOnOutlimit } = options; const formatFn = (v) => { return is.isFunction(format) ? format(v) : v; }; const calculateStringLength = (v) => { return is.isFunction(calculateLength) ? calculateLength(v) : v == null ? void 0 : v.length; }; const uncontroledValue = vue.ref(defaultValue); const controledValue = modelValue; const computedValue = vue.computed(() => { const cv = controledValue == null ? void 0 : controledValue.value; const ucv = uncontroledValue.value ?? ""; return cv ?? ucv; }); const displayValue = vue.ref(formatFn(computedValue.value)); const inputValueLength = vue.computed(() => { return calculateStringLength(computedValue.value); }); const validateMaxLength = (length) => { if (!is.isNumber(maxLength == null ? void 0 : maxLength.value)) { return true; } return length <= maxLength.value; }; const validateMinLength = (length) => { if (!is.isNumber(minLength == null ? void 0 : minLength.value)) { return true; } return length >= minLength.value; }; const validateLengthFn = (value) => { const len = calculateStringLength(value); return validateMaxLength(len) && validateMinLength(len); }; const isOutLengthLimit = vue.computed(() => { return !validateLengthFn(computedValue.value); }); const mergedValidateFn = (v) => { const r = validateLengthFn(v); if (r && is.isFunction(validate)) { return validate(v); } return r; }; const inputEl = vue.ref(); const composition = useComposition.useComposition({ el: inputEl }); const isFocus = vue.ref(false); const isValid = vue.ref(true); const validateValue = (value) => { isValid.value = value === "" ? true : mergedValidateFn(value); return isValid.value; }; vue.watch( () => [maxLength == null ? void 0 : maxLength.value, minLength == null ? void 0 : minLength.value], () => { validateValue(computedValue.value); } ); let lastValidValue = validateValue(computedValue.value) ? computedValue.value : ""; let lastValue = computedValue.value; vue.watch( () => computedValue.value, (val) => { if (!is.isUndefined(val) && validateValue(val)) { lastValidValue = val; } if (isFocus.value) { displayValue.value = val; } else { displayValue.value = formatFn(val); } } ); const updateValue = (value) => { uncontroledValue.value = value; if (value !== computedValue.value) { emitUpdate(value); } }; const getValidValue = () => { let validVal = computedValue.value; if (!isValid.value) { if (is.isFunction(valueOnInvalidChange)) { validVal = valueOnInvalidChange(computedValue.value, lastValidValue); validateValue(validVal); } else if (lastValidValue !== "") { validVal = lastValidValue; isValid.value = true; } } return validVal; }; const emitChange = (value) => { if (value !== lastValue) { vue.nextTick(() => { lastValue = computedValue.value; emits("change", computedValue.value, lastValue); lastValue = computedValue.value; }); } }; const keepNativeDisplayValue = () => { if (inputEl.value && inputEl.value.value !== displayValue.value) { inputEl.value.value = displayValue.value; } }; const isAllowedToInputOnOutLimit = (value) => { if (!is.isUndefined(maxLength == null ? void 0 : maxLength.value) && (inputOnOutlimit == null ? void 0 : inputOnOutlimit.value) === true) { return true; } const len = calculateStringLength(value); const isLower = validateMaxLength(len); if (isLower) { return true; } if (len < calculateStringLength(computedValue.value)) { return true; } return false; }; const handleInput = (e) => { var _a; const value = (_a = e.target) == null ? void 0 : _a.value; if (composition.isComposing.value) { displayValue.value = value; return; } updateValue(value); emits("input", e, value); let newValue = value; emits("input", e, value); if (!isAllowedToInputOnOutLimit(value)) { newValue = value.substring(0, maxLength == null ? void 0 : maxLength.value); updateValue(newValue); vue.nextTick(() => { keepNativeDisplayValue(); }); } }; const handleFocus = (e) => { if (isFocus.value) { return; } isFocus.value = true; if (format) { displayValue.value = computedValue.value; } emits("focus", e); }; const handleBlur = (e) => { isFocus.value = false; const validValue = getValidValue(); updateValue(validValue); emitChange(validValue); displayValue.value = formatFn(computedValue.value); emits("blur", e); }; const handlePressEnter = (e) => { const keyCode = e.key || e.code; if (!composition.isComposing.value && keyCode === keycode.Enter.key) { const validValue = getValidValue(); updateValue(validValue); emitChange(validValue); emits("pressEnter", e); } }; const clearValue = () => { displayValue.value = ""; isValid.value = true; updateValue(""); emitChange(""); emits("clear"); }; const handleClear = (e) => { e.stopPropagation(); e.preventDefault(); clearValue(); }; return { realValue: vue.computed(() => computedValue.value), displayValue: vue.computed(() => displayValue.value), isValid, inputEl, clearValue, inputValueLength, isOutLengthLimit, handleInput, handleFocus, handleBlur, handlePressEnter, handleClear }; } exports.useInput = useInput;