|
|
|
@ -3,7 +3,7 @@ import type { ZodType } from 'zod'; |
|
|
|
|
|
|
|
import type { FormSchema, MaybeComponentProps } from '../types'; |
|
|
|
|
|
|
|
import { computed } from 'vue'; |
|
|
|
import { computed, nextTick, ref, watch } from 'vue'; |
|
|
|
|
|
|
|
import { |
|
|
|
FormControl, |
|
|
|
@ -52,6 +52,16 @@ const errors = useFieldError(fieldName); |
|
|
|
const formApi = formRenderProps.form; |
|
|
|
|
|
|
|
const isInValid = computed(() => errors.value?.length > 0); |
|
|
|
const fieldComponentRef = ref<HTMLInputElement | null>(null); |
|
|
|
const focus = () => { |
|
|
|
if ( |
|
|
|
fieldComponentRef.value && |
|
|
|
typeof fieldComponentRef.value.focus === 'function' && |
|
|
|
document.activeElement !== fieldComponentRef.value // 检查当前是否有元素被聚焦 |
|
|
|
) { |
|
|
|
fieldComponentRef.value.focus(); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
const fieldComponent = computed(() => { |
|
|
|
const finalComponent = isString(component) |
|
|
|
@ -156,6 +166,18 @@ const computedProps = computed(() => { |
|
|
|
}; |
|
|
|
}); |
|
|
|
|
|
|
|
watch( |
|
|
|
() => computedProps.value?.autofocus, |
|
|
|
(value) => { |
|
|
|
if (value === true) { |
|
|
|
nextTick(() => { |
|
|
|
focus(); |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
{ immediate: true }, |
|
|
|
); |
|
|
|
|
|
|
|
const shouldDisabled = computed(() => { |
|
|
|
return isDisabled.value || disabled || computedProps.value?.disabled; |
|
|
|
}); |
|
|
|
@ -275,6 +297,7 @@ function createComponentProps(slotProps: Record<string, any>) { |
|
|
|
> |
|
|
|
<component |
|
|
|
:is="fieldComponent" |
|
|
|
ref="fieldComponentRef" |
|
|
|
:class="{ |
|
|
|
'border-destructive focus:border-destructive hover:border-destructive/80 focus:shadow-[0_0_0_2px_rgba(255,38,5,0.06)]': |
|
|
|
isInValid, |
|
|
|
|