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

Vue.js中如何处理表单列表并实现嵌套对象ref绑定?

问题分析与解决方案

问题根源

你代码里的:set="forms[item.id]={}"是错误写法:Vue 没有:set这个指令,而且每次组件渲染时,这行代码都会把forms[item.id]重置为空对象,导致输入框绑定的对象被频繁清空,自然无法保存输入内容。

正确实现方式

方式1:提前初始化表单对象

在获取到list数据后,先给forms初始化每个表单对应的嵌套对象,确保v-model绑定的对象存在:

import { reactive, onMounted } from 'vue'

const list = reactive([/* 你的列表数据,比如[{id:1}, {id:2}] */])
const forms = reactive({})

onMounted(() => {
  // 初始化每个表单的空对象
  list.forEach(item => {
    if (!forms[item.id]) {
      forms[item.id] = { name: '', email: '', phone: '' }
    }
  })
})

模板部分去掉错误的:set,直接绑定即可:

<form v-for="item in list" :key="item.id">
  <input v-model="forms[item.id].name" />
  <input v-model="forms[item.id].email" />
  <input v-model="forms[item.id].phone" />
</form>

方式2:模板中动态初始化(适合列表动态变化的场景)

如果list是动态加载或变化的,可以在模板里通过判断确保对象存在,避免直接赋值导致的渲染重置:

<form v-for="item in list" :key="item.id">
  <!-- 先确保当前id对应的表单对象存在 -->
  <template v-if="!forms[item.id]">
    {{ forms[item.id] = { name: '', email: '', phone: '' } }}
  </template>
  <input v-model="forms[item.id].name" />
  <input v-model="forms[item.id].email" />
  <input v-model="forms[item.id].phone" />
</form>

注意:这里的<template>里的赋值只是为了初始化,不会渲染任何内容,也可以通过计算属性或者方法来封装这个初始化逻辑,让模板更干净。

关键注意点

  • 必须给v-for加上:key="item.id",确保每个表单的渲染稳定性。
  • 不要在模板中直接修改响应式对象的结构(比如直接赋值forms[item.id]={}),应该在脚本逻辑中处理,或者用安全的判断方式初始化。

内容的提问来源于stack exchange,提问作者Waqar Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:42:12