VUE中,动态添加的文本框如何实现数据实时双向绑定?
思否 问答 👍 4 含 AI 优化版
问题
VUE中,动态添加的文本框如何实现数据实时双向绑定?
由大模型辅助整理,保留原意,优化结构与可读性。
问题概述
在 Vue 中动态添加一个文本框(<el-input v-model="item.price">),发现新增的文本框和 v-model 绑定的数据无法实时双向同步。
涉及技术
Vue 响应式系统、v-model、数组 push
期望结果
让动态添加的输入框和数据实现正常的双向绑定。
回答
原始回答
denkloge13更新于 2021-04-13
this.goodsPrice.push({...item,price:0});
}
AI 优化 · 回答整理
解答思路
问题的根源不是 v-model,而是新 push 进数组的对象里根本没有 price 字段,并且直接 push 了原始对象的引用,导致数据被意外污染。
示例代码
selectChange(item) {
// 错误写法:直接 push 原对象引用,且缺少 price 字段
// this.goodsPrice.push(item);
// 正确写法:拷贝一份对象,并补上需要双向绑定的字段
this.goodsPrice.push({ ...item, price: 0 });
}
<el-input style="width: 120px" v-model="item.price" />
详细说明
- 原来的
item对象结构大致是{ value: '选项1', label: '黄金糕' },里面并没有price字段,所以v-model="item.price"自然监测不到任何变化。 - 直接
this.goodsPrice.push(item)又把原始对象的引用推入了数组,之后对item.price的修改会同时影响原始数据源,产生难以排查的“数据串了”问题。 - 解决方式是用扩展运算符
{...item, price: 0}拷贝出一个新对象,并显式补上price字段,这样新对象才是响应式且互相独立的,v-model才能正常工作。
小结
遇到动态添加的表单项无法双向绑定,先检查:1)绑定字段是否真实存在于数据对象上;2)是否误用了原始对象的引用而不是拷贝。
由大模型辅助整理,保留原意,补充结构与代码格式。
回答转载自 SegmentFault