v-for 和自定义组件的未定义行为
Undefined Behavior with v-for and custom components
首先,请原谅糟糕的代码(我们现在没有时间修复)。我知道 eval
很糟糕,但就我们的目的而言,这是唯一对我们如此轻松有效的方法。
这是我们添加和删除行的方式:
methods: {
addRow: function() {
let lastRow = eval(`this.$parent.json${this.path}[this.$parent.json${this.path}.length - 1]`);
lastRow = Object.assign({}, lastRow);
eval(`this.$parent.json${this.path}.push(lastRow)`);
this.$forceUpdate();
},
removeRow: function(index) {
//eval(`this.$parent.json${this.path}.splice(index, 1)`);
eval(`Vue.delete(this.$parent.json${this.path}, index)`);
this.$forceUpdate();
}
https://jsfiddle.net/00e58as4/10/6
要重现问题,请添加一行。然后,更改新行上的文本。尝试删除倒数第二行 - 注意它没有被删除,但最后一行被删除了。但是,如果您检查 json-debug,它是后端数据的实时视图,您会看到正确的行被删除了!
为什么会这样?为什么 UI 和后端不同步?
在使用 v-for
进行迭代时,您应该始终使用 key。尝试像这样添加一个。
<div class = "well" v-for = "item, index in items" :key="item">
首先,请原谅糟糕的代码(我们现在没有时间修复)。我知道 eval
很糟糕,但就我们的目的而言,这是唯一对我们如此轻松有效的方法。
这是我们添加和删除行的方式:
methods: {
addRow: function() {
let lastRow = eval(`this.$parent.json${this.path}[this.$parent.json${this.path}.length - 1]`);
lastRow = Object.assign({}, lastRow);
eval(`this.$parent.json${this.path}.push(lastRow)`);
this.$forceUpdate();
},
removeRow: function(index) {
//eval(`this.$parent.json${this.path}.splice(index, 1)`);
eval(`Vue.delete(this.$parent.json${this.path}, index)`);
this.$forceUpdate();
}
https://jsfiddle.net/00e58as4/10/6
要重现问题,请添加一行。然后,更改新行上的文本。尝试删除倒数第二行 - 注意它没有被删除,但最后一行被删除了。但是,如果您检查 json-debug,它是后端数据的实时视图,您会看到正确的行被删除了!
为什么会这样?为什么 UI 和后端不同步?
在使用 v-for
进行迭代时,您应该始终使用 key。尝试像这样添加一个。
<div class = "well" v-for = "item, index in items" :key="item">