如何将vee-validate与vue-datepicker整合实现必填字段校验?
解决vee-validate与vue-datepicker的必填校验问题
问题根源:当前代码中Field组件内部的input仅通过:value="value"单向绑定了日期选择器的值,但未将日期变化同步回vee-validate的表单状态,导致校验状态无法更新——即使选择日期后,错误提示仍会保留,表单无法提交。
修正方案
方法一:同步输入事件与Field状态
复用datepicker插槽提供的inputEvents,让日期选择的事件触发vee-validate的字段状态更新:
<Form @submit="handleEvent" :validation-schema="addEventSchema"> <VueDatePicker v-model="eventDate.startDate" text-input hide-input-icon :enable-time-picker="false" :clearable="false" model-type="yyyy-MM-dd" format="yyyy-MM-dd" > <template #dp-input="{ value, inputEvents }"> <Field name="startDate" v-slot="{ field, errors }" > <input type="text" v-bind="field" v-bind="inputEvents" class="form-control form-control-lg form-control-outlined" :class="{ 'is-invalid': !!errors.length }" placeholder="Start Date" :value="value" autocomplete="off" /> </Field> <label class="form-label-outlined" for="outlined-date-picker"> Start Date </label> <ErrorMessage class="invalid-feedback" name="startDate" /> </template> </VueDatePicker> <button type="submit">Submit</button> </Form>
方法二:直接用Field作为日期输入载体
省略手动编写input,将Field组件与datepicker的插槽参数直接绑定,简化代码:
<Form @submit="handleEvent" :validation-schema="addEventSchema"> <VueDatePicker v-model="eventDate.startDate" text-input hide-input-icon :enable-time-picker="false" :clearable="false" model-type="yyyy-MM-dd" format="yyyy-MM-dd" > <template #dp-input="{ value, inputEvents }"> <Field name="startDate" type="text" v-bind="inputEvents" :value="value" v-slot="{ errors }" class="form-control form-control-lg form-control-outlined" :class="{ 'is-invalid': !!errors.length }" placeholder="Start Date" /> <label class="form-label-outlined" for="outlined-date-picker"> Start Date </label> <ErrorMessage class="invalid-feedback" name="startDate" /> </template> </VueDatePicker> <button type="submit">Submit</button> </Form>
校验规则注意事项
确保你的校验schema中startDate的规则匹配实际场景,比如使用yup定义必填规则:
import { object, string } from 'yup'; const addEventSchema = object({ startDate: string().required('Start date is required') });
内容的提问来源于stack exchange,提问作者LarakBell
相关产品推荐
相关产品推荐

