Vuelidate 2结合Vue3使用,提供计算列表后$model不更新问题
Vuelidate 2 未检测到新增列表元素的问题解决
你的问题核心在于Vuelidate 2的实例没有随着props.data的更新而重新初始化,具体原因和解决方案如下:
问题根源
- 你通过计算属性
slotsData返回分组后的新数组,当原数据新增元素时,slots-table组件的props.data会更新为新的数组引用,但组件初始化时调用useVuelidate绑定的是最初的props.data数组,Vuelidate不会自动监听props.data的引用变化来重新创建验证实例。 - Vue 3的compat模式下,响应式追踪的行为存在细微差异,进一步导致Vuelidate无法感知数据源的更新。
解决方案
方案1:监听props.data变化,重新初始化Vuelidate
在slots-table组件中,通过watch监听props.data的变化,每当数组更新时重新创建Vuelidate实例:
import { watch, shallowRef } from 'vue'; import { useVuelidate } from '@vuelidate/core'; // 用shallowRef保存验证实例,避免不必要的深度响应式追踪 const v = shallowRef(null); const rules = { $each: helpers.forEach({ start_time: { required }, finish_time: { required }, appointment_reason_id: { required }, max_appointments: { required }, date: { requiredIfCustomSession: requiredIf(props.showDatepicker) }, }), }; // 初始化验证实例 v.value = useVuelidate(rules, props.data, { $autoDirty: true }); // 监听props.data的变化,重新初始化验证 watch(() => props.data, (newData) => { v.value = useVuelidate(rules, newData, { $autoDirty: true }); }, { deep: true }); // 深监听数组内容变化
方案2:确保原数据的响应式修改
新增元素时,务必通过push/splice等方法修改原响应式数组(props.value),而非直接替换数组引用。这样计算属性slotsData才能正确触发更新,保证slots-table的props.data同步变化。
额外优化:减少计算属性的不必要更新
你的计算属性每次调用都会生成全新的数组和分组对象,可利用原数据的唯一id作为标识,或调整分组逻辑,减少不必要的数组重建,提升组件性能。
内容的提问来源于stack exchange,提问作者Ruben R.
相关产品推荐
相关产品推荐

