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

传递keepValueOnUnmount后动态修改useField的name仍丢失表单值,如何解决?

动态修改useField的name参数时,如何阻止旧路径属性被从表单值中移除?

当动态修改useField的name参数时,即便已经给useField传入了keepValueOnUnmount选项,表单中与旧name路径同名的属性仍然会被移除。有没有办法阻止这种情况?

问题根源

vee-validate中,当useField的name动态变更时,旧的字段实例会被销毁。即便开启keepValueOnUnmount,该选项仅针对组件整体卸载场景生效,无法覆盖动态切换字段路径时的自动清理逻辑,导致对应路径的表单值被移除。

解决方案

绕过useField的自动清理逻辑,直接通过useForm提供的API手动操作表单值:

修改Question.vue组件,不再依赖动态变化的useField name,转而直接从表单数据源中读写对应路径的值:

<template>
  <input v-model="currentValue" placeholder="Question" />
</template>

<script>
import { computed } from "vue";
import { useForm } from "vee-validate";

export default {
  props: {
    questionIdx: Number,
  },
  setup(props) {
    const { values, setValue } = useForm();

    // 通过计算属性绑定输入框,手动处理值的读写逻辑
    const currentValue = computed({
      get() {
        return values.questions[props.questionIdx]?.text || "";
      },
      set(newVal) {
        setValue(`questions[${props.questionIdx}].text`, newVal);
      },
    });

    return { currentValue };
  },
};
</script>

原理说明

这种方式直接对接表单的核心数据源,脱离了单个useField实例的生命周期管理。切换问题索引时,不会触发旧字段的清理逻辑,所有问题的text属性都会被完整保留,提交表单时能获取到全部值。

内容的提问来源于stack exchange,提问作者Dusan Jovanovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:57:34