You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuelidate 2结合Vue3使用,提供计算列表后$model不更新问题

Vuelidate 2 未检测到新增列表元素的问题解决

你的问题核心在于Vuelidate 2的实例没有随着props.data的更新而重新初始化,具体原因和解决方案如下:

问题根源

  1. 你通过计算属性slotsData返回分组后的新数组,当原数据新增元素时,slots-table组件的props.data会更新为新的数组引用,但组件初始化时调用useVuelidate绑定的是最初的props.data数组,Vuelidate不会自动监听props.data的引用变化来重新创建验证实例。
  2. 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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:15:18