feat: pinInput supports disabled props (#4851)
* feat: pinInput supports disabled props
This commit is contained in:
parent
57d5a919d2
commit
ba36ce8836
@ -10,15 +10,18 @@ defineOptions({
|
|||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
const props = withDefaults(defineProps<PinInputProps>(), {
|
const {
|
||||||
btnLoading: false,
|
codeLength = 6,
|
||||||
codeLength: 6,
|
createText = async () => {},
|
||||||
handleSendCode: async () => {},
|
disabled = false,
|
||||||
maxTime: 60,
|
handleSendCode = async () => {},
|
||||||
});
|
loading = false,
|
||||||
|
maxTime = 60,
|
||||||
|
} = defineProps<PinInputProps>();
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
complete: [];
|
complete: [];
|
||||||
|
sendError: [error: any];
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const timer = ref<ReturnType<typeof setTimeout>>();
|
const timer = ref<ReturnType<typeof setTimeout>>();
|
||||||
@ -30,11 +33,11 @@ const countdown = ref(0);
|
|||||||
|
|
||||||
const btnText = computed(() => {
|
const btnText = computed(() => {
|
||||||
const countdownValue = countdown.value;
|
const countdownValue = countdown.value;
|
||||||
return props.createText?.(countdownValue);
|
return createText?.(countdownValue);
|
||||||
});
|
});
|
||||||
|
|
||||||
const btnLoading = computed(() => {
|
const btnLoading = computed(() => {
|
||||||
return props.loading || countdown.value > 0;
|
return loading || countdown.value > 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
@ -50,10 +53,16 @@ function handleComplete(e: string[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleSend(e: Event) {
|
async function handleSend(e: Event) {
|
||||||
e?.preventDefault();
|
try {
|
||||||
await props.handleSendCode();
|
e?.preventDefault();
|
||||||
countdown.value = props.maxTime;
|
await handleSendCode();
|
||||||
startCountdown();
|
countdown.value = maxTime;
|
||||||
|
startCountdown();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to send code:', error);
|
||||||
|
// Consider emitting an error event or showing a notification
|
||||||
|
emit('sendError', error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
@ -77,6 +86,7 @@ const id = useId();
|
|||||||
<PinInput
|
<PinInput
|
||||||
:id="id"
|
:id="id"
|
||||||
v-model="inputValue"
|
v-model="inputValue"
|
||||||
|
:disabled="disabled"
|
||||||
class="flex w-full justify-between"
|
class="flex w-full justify-between"
|
||||||
otp
|
otp
|
||||||
placeholder="○"
|
placeholder="○"
|
||||||
@ -92,6 +102,7 @@ const id = useId();
|
|||||||
/>
|
/>
|
||||||
</PinInputGroup>
|
</PinInputGroup>
|
||||||
<VbenButton
|
<VbenButton
|
||||||
|
:disabled="disabled"
|
||||||
:loading="btnLoading"
|
:loading="btnLoading"
|
||||||
class="flex-grow"
|
class="flex-grow"
|
||||||
size="lg"
|
size="lg"
|
||||||
|
@ -8,6 +8,10 @@ interface PinInputProps {
|
|||||||
* 发送验证码按钮文本
|
* 发送验证码按钮文本
|
||||||
*/
|
*/
|
||||||
createText?: (countdown: number) => string;
|
createText?: (countdown: number) => string;
|
||||||
|
/**
|
||||||
|
* 是否禁用
|
||||||
|
*/
|
||||||
|
disabled?: boolean;
|
||||||
/**
|
/**
|
||||||
* 自定义验证码发送逻辑
|
* 自定义验证码发送逻辑
|
||||||
* @returns
|
* @returns
|
||||||
|
Loading…
Reference in New Issue
Block a user