UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 13.6 kB
{"version":3,"file":"useInput.mjs","sources":["../../src/input/useInput.ts"],"sourcesContent":["import { ref, computed, watch, nextTick, toRefs, inject } from 'vue';\nimport { InputValue, TdInputProps } from './type';\nimport { FormItemInjectionKey } from '../form/const';\nimport useVModel from '../hooks/useVModel';\nimport { useFormDisabled } from '../form/hooks';\nimport useLengthLimit from './useLengthLimit';\n\nexport interface ExtendsTdInputProps extends TdInputProps {\n showInput: boolean;\n keepWrapperWidth: boolean;\n allowTriggerBlur: boolean;\n}\n\nexport default function useInput(props: ExtendsTdInputProps, expose: (exposed: Record<string, any>) => void) {\n const { value, modelValue } = toRefs(props);\n const inputValue = ref<InputValue>();\n const isComposition = ref(false);\n const compositionValue = ref<InputValue>();\n const clearIconRef = ref(null);\n const innerClickElement = ref();\n const disabled = useFormDisabled();\n const [innerValue, setInnerValue] = useVModel(value, modelValue, props.defaultValue, props.onChange);\n\n const isHover = ref(false);\n const focused = ref(false);\n const renderType = ref(props.type);\n const inputRef = ref<HTMLInputElement>(null);\n\n const limitParams = computed(() => ({\n value: [undefined, null].includes(innerValue.value) ? undefined : String(innerValue.value),\n status: props.status,\n maxlength: props.maxlength,\n maxcharacter: props.maxcharacter,\n allowInputOverMax: props.allowInputOverMax,\n onValidate: props.onValidate,\n }));\n const { limitNumber, getValueByLimitNumber, tStatus } = useLengthLimit(limitParams);\n\n const showClear = computed(() => {\n return (\n ((innerValue.value && !disabled.value && props.clearable && !props.readonly) || props.showClearIconOnEmpty) &&\n isHover.value\n );\n });\n\n const focus = () => inputRef.value?.focus();\n const blur = () => inputRef.value?.blur();\n\n const emitFocus = (e: FocusEvent) => {\n inputValue.value = innerValue.value;\n if (props.disabled) return;\n focused.value = true;\n props.onFocus?.(innerValue.value, { e });\n };\n\n const emitClear = ({ e }: { e: MouseEvent }) => {\n setInnerValue('', { e, trigger: 'clear' });\n props.onClear?.({ e });\n };\n\n const onClearIconMousedown = (e: MouseEvent) => {\n innerClickElement.value = e.target;\n };\n\n const emitPassword = () => {\n const toggleType = renderType.value === 'password' ? 'text' : 'password';\n renderType.value = toggleType;\n };\n\n const setInputElValue = (v: InputValue = '') => {\n const inputEl = inputRef.value as HTMLInputElement;\n if (!inputEl) return;\n const sV = String(v);\n if (!inputEl.value) {\n return;\n }\n if (inputEl.value !== sV) {\n inputEl.value = sV;\n }\n };\n const inputValueChangeHandle = (e: InputEvent | CompositionEvent) => {\n const { target } = e;\n let val = (target as HTMLInputElement).value;\n // over length: allow delete; not add\n if (props.type !== 'number' && val.length > innerValue.value?.length) {\n val = getValueByLimitNumber(val);\n }\n setInnerValue(val, { e } as { e: InputEvent; trigger: 'input' });\n // 受控\n nextTick(() => {\n setInputElValue(innerValue.value);\n });\n };\n\n const handleInput = (e: InputEvent) => {\n const checkInputType = e.inputType && e.inputType === 'insertCompositionText';\n const {\n currentTarget: { value: val },\n }: any = e;\n if (checkInputType || isComposition.value) {\n compositionValue.value = val;\n return;\n }\n inputValueChangeHandle(e);\n };\n\n const isClearIcon = () => {\n let tmp = innerClickElement.value;\n if (!tmp || !tmp.tagName || !clearIconRef.value?.$el || !['path', 'svg'].includes(tmp.tagName)) return false;\n while (tmp) {\n if (clearIconRef.value?.$el === tmp) {\n return true;\n }\n tmp = tmp.parentNode;\n }\n return false;\n };\n\n const formItem = inject(FormItemInjectionKey, undefined);\n const formatAndEmitBlur = (e: FocusEvent) => {\n if (props.format) {\n inputValue.value = props.format(innerValue.value);\n }\n focused.value = false;\n // 点击清空按钮的时候,不应该触发 onBlur 事件。这个规则在表格单元格编辑中有很重要的应用\n if (!isClearIcon() && props.allowTriggerBlur) {\n props.onBlur?.(innerValue.value, { e });\n formItem?.handleBlur();\n }\n };\n\n const onHandleCompositionend = (e: CompositionEvent) => {\n isComposition.value = false;\n compositionValue.value = '';\n inputValueChangeHandle(e);\n props.onCompositionend?.(innerValue.value, { e });\n };\n const onHandleCompositionstart = (e: CompositionEvent) => {\n isComposition.value = true;\n const {\n currentTarget: { value },\n }: any = e;\n compositionValue.value = value;\n props.onCompositionstart?.(innerValue.value, { e });\n };\n\n const onRootClick = (e: MouseEvent) => {\n inputRef.value?.focus();\n props.onClick?.({ e });\n };\n\n watch(\n () => props.autofocus,\n (value) => {\n if (value === true) {\n nextTick(() => {\n inputRef.value?.focus();\n });\n }\n },\n { immediate: true },\n );\n\n watch(\n innerValue,\n (val, oldVal) => {\n // 初始化时,如果有 format 函数,需要对 value 进行格式化\n if (oldVal === undefined && props.format) {\n inputValue.value = props.format(val);\n } else {\n inputValue.value = val;\n }\n // limit props value\n const newVal = getValueByLimitNumber(val);\n if (newVal !== val && props.type !== 'number') {\n setInnerValue(newVal, { trigger: 'initial' });\n }\n },\n { immediate: true },\n );\n\n watch(\n () => props.type,\n (v) => {\n renderType.value = v;\n },\n { immediate: true },\n );\n\n expose({\n inputRef,\n focus,\n blur,\n });\n\n return {\n isHover,\n focused,\n renderType,\n showClear,\n inputRef,\n clearIconRef,\n inputValue,\n isComposition,\n compositionValue,\n limitNumber,\n tStatus,\n emitFocus,\n formatAndEmitBlur,\n onHandleCompositionend,\n onHandleCompositionstart,\n onRootClick,\n emitPassword,\n handleInput,\n emitClear,\n onClearIconMousedown,\n innerValue,\n };\n}\n"],"names":["innerValue","setInnerValue","inputValue","e","trigger","innerClickElement","val","nextTick","setInputElValue","formItem","watch","immediate","expose","inputRef","focus","blur","isHover","focused","renderType","showClear","clearIconRef","isComposition","compositionValue","limitNumber","tStatus","emitFocus","formatAndEmitBlur","onHandleCompositionend","onHandleCompositionstart","onRootClick","emitPassword","handleInput","emitClear","onClearIconMousedown"],"mappings":"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"}