Vant 没有提供倒计时按钮组件,手动实现一下。

// CountDownButton.vue 实现<template>  <Button    style="min-width: 80px;"    size="small"    type="primary"    :disabled="countDownButtonArgs.timing"    @click="emit('click', successCallback)"  >{{ loading ? loadingText : countDownButtonArgs.timing ? countDownButtonArgs.count : buttonText }}</Button></template><script setup lang="ts">import { reactive } from 'vue'import { Button } from 'vant'const props = defineProps({  maxSecondNum: {    type: Number,    default: 60  },  buttonText: {    type: String,    default: '获取验证码'  },  loadingText: {    type: String,    default: '发送中'  },  loading: {    type: Boolean,    default: false  }})type EmitsType = { (e: 'click', successCallback: () => void): void }const emit = defineEmits<EmitsType>()const countDownButtonArgs = reactive<{ timing: boolean; count: number }>({  timing: false,  count: 0})const successCallback = () => {  countDownButtonArgs.timing = true  countDownButtonArgs.count = props.maxSecondNum  const timer = setInterval(() => {    const { count } = countDownButtonArgs    if (count > 0 && count <= props.maxSecondNum) {      countDownButtonArgs.count--;    } else {      countDownButtonArgs.timing = false      clearInterval(timer)      countDownButtonArgs.count = 0    }  }, 1000)}</script><style lang="less"></style>// 应用举例<template>  <div>    <NavBar title="用户登录"></NavBar>    <Form @submit="onLogin">      <CellGroup inset>        <Field          v-model="phone"          name="tel"          label="手机号"          :rules="[{ required: true, message: '请输出' }]"        />        <Field          v-model="code"          type="password"          name="password"          label="验证码"          :rules="[{ required: true, message: '请输出' }]"        >          <template #button>            <CountDownButton :loading="loading" @click="getCodeFn"></CountDownButton>          </template>        </Field>      </CellGroup>      <div style="margin: 16px;">        <Button round block type="primary" native-type="submit">登录</Button>      </div>    </Form>  </div></template><script setup lang="ts">import { ref } from "vue";import { Form, Field, CellGroup, Button, NavBar, Toast } from 'vant'import CountDownButton from '../../../components/CountDownButton.vue'import { sendSmsCode, smsLogin } from './api'import { useRouter } from 'vue-router'const router = useRouter()const phone = ref('');const code = ref('');const onLogin = async () => {  const b = await smsLogin(phone.value, code.value)  if (b) {    Toast('登录胜利')    router.push('/tvs/home')  }};const loading = ref(false)const getCodeFn = async (successCallback: () => void) => {  if (!phone.value) { Toast('请输出手机号'); return; }  loading.value = true  const b = await sendSmsCode(phone.value)  loading.value = false  successCallback()  if (b) { Toast('验证码发送胜利'); }}</script><style lang="less"></style>

成果如下