我想提供一个表单(在vuejs中),在填充前一个表单时添加新输入。应删除已清除的输入。至少必须有一个输入。到目前为止一切顺利,在jsfiddle
中得到了这个创建3个项目,输入a
到第一个输入,b
到第二个输入,c
到第三个输入。现在删除b
文本。项目c
也不见了。知道为什么会这样吗?记录功能显示c
位于数组的索引1处,因此它应该在那里,但是vue不会呈现该项目。
答案 0 :(得分:1)
免责声明:我不知道为什么问题中描述的错误会发生。它可能是导致DOM input values and component private state to become out of sync的v-for。如果您知道此行为的原因,请分享
您是正确的this.list
正确更新。您可以通过在输入字段旁边注销名称来查看:
var demo = new Vue({
el: '#demo',
data: {
items: []
},
methods: {
'manage': function(old, new_) {
var i = this.items.length;
while (i--) {
if (!this.items[i]['name']) {
this.items.$remove(this.items[i]);
}
}
}
},
watch: {
'items': {
handler: 'manage',
deep: true
}
}
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<div id="demo">
<div v-for="n in items.length + 1">
{{ items[n]['name'] }}
<input v-model="items[n]['name']"/>
</div>
</div>
&#13;
这可以通过manage
上的keyup
来解决,而不是在列表更改时修复。
以下是如何在keyup
上实现类似的行为:
var demo = new Vue({
el: '#demo',
data: {
items: []
},
methods: {
'manage': function(old, new_) {
var i = this.items.length;
while (i--) {
if (!this.items[i]['name']) {
this.items.$remove(this.items[i]);
}
}
}
}
})
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<div id="demo">
<div v-for="n in items.length + 1">
<input v-model="items[n]['name']" @keyup="manage"/>
</div>
</div>
&#13;
此外,您还在使用缩小版的vue。如果您使用的是未经授权的版本,则会看到您的代码提示某些warnings
。他们可能会导致意外行为。
答案 1 :(得分:0)
我认为你的第三项,即第三项,依赖于第二项。您应该将数据集拆分到循环之外,并使用其他方法处理删除的项目。您循环遍历相同的数据集,因此如果您修改它所显示的一个区域。通过向外部数据集添加/删除项目,您可以删除依赖项。