我试图弄清楚this.$set (aka Vue.set)
api在使用它来更新多维数组时是如何工作的。
假设:
new Vue({
el: '#app',
data: {
rows:[{"id": "4", "edit": "true" }, { "id": "5", "edit": "false" }]
},
....
我如何使用$this.set
做这样的事情:
this.rows[0].edit = false
我知道这不起作用:
this.$set(this.rows2, 0, false)
对于KV对阵列使用$ this.set的正确方法是什么?
答案 0 :(得分:2)
由于edit
对象中的rows
属性已设置,因此在这种情况下您不需要使用Vue.set
。您可以设置属性值,Vue会注意到更改:
this.rows[0].edit = false;
这是一个简单的例子:
new Vue({
el: '#app',
data() {
return {
rows:[
{ "id": "4", "edit": true },
{ "id": "5", "edit": false }
],
}
},
methods: {
editNext() {
let index = this.rows.findIndex(r => r.edit);
this.rows[index].edit = false;
let next = ++index % this.rows.length;
this.rows[next].edit = true;
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.min.js"></script>
<div id="app">
<div v-for="(row, i) in rows" v-if="rows[i].edit">
Editing Row ID {{ row.id }}
</div>
<button @click="editNext">Edit Next</button>
</div>
但是,如果最初没有设置行对象的edit
属性(或者如果您只是想要安全),那么您需要使用Vue.set
来添加属性和让它成为被动的:
this.$set(this.rows[0], 'edit', false);
以下是该案例的一个例子:
new Vue({
el: '#app',
data() {
return {
rows:[
{ "id": "4", "edit": true },
{ "id": "5" }
],
}
},
methods: {
editNext() {
let i = this.rows.findIndex(r => r.edit);
this.$set(this.rows[i], 'edit', false);
let next = ++i % this.rows.length;
this.$set(this.rows[next], 'edit', true);
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.min.js"></script>
<div id="app">
<div v-for="row in rows" v-if="row.edit">
Editing Row ID {{ row.id }}
</div>
<button @click="editNext">Edit Next</button>
</div>