简单的Todo-App。请原谅我提出一个相当基本的问题。
但是你怎么去编辑阵列上的某个项?
通常我会尝试将输入的值绑定到我的数据对象上的新属性,然后在点击Vue的双向数据绑定时将此新属性分配给旧属性。
像这样:http://jsfiddle.net/z7960up7/
在我的情况下,我使用v-repeat指令,它循环遍历我的数据数组,但我无法使用v-model指令来使用双向数据绑定,因为如果属性的值被破坏,则属性值会被破坏。我这样做了。 (见这里:http://jsfiddle.net/doL46etq/2/)
现在我想知道,我将如何更新我的任务数组:
我的想法是在点击时通过我的方法传递VueObject(this),然后在我的事件处理程序上定义索引,然后使用索引更新tasks数组,如下所示:
HTML:
<input v-el="editInputField" type="text" value="{{ task.body }}" v-on="keyup: doneEdit(this) | key 'enter'"/>
<button v-on="click: editTask(this)">
Edit
</button>
JS:
methods: {
editTask: function (task) {
var taskIndex = this.tasks.indexOf(task.task);
this.tasks[taskIndex] = {
'body': document.querySelector('input').value,
'completed': false
};
console.log(task.task.body);
},
}
这是我的小提琴:
http://jsfiddle.net/doL46etq/3/
但是数据对象根本没有更新,我想知道如何进行更新并更新它。
使用Vue编辑阵列上元素的最佳方法是什么?
编辑:一种简单的方法,就是删除元素,并使用push方法将新元素添加到数组中,但我真的只想更新元素,因为我喜欢保持数据对象与我的后端。
答案 0 :(得分:3)
简短回答:在扩展构造函数中使用组件,然后将索引作为属性传递给HTML中的该组件,并使用计算属性来回链接到您的数据。
但是不要满足于简短的回答。这是漫长的:
情况:我使用您的JSFiddle作为此答案的基础。
用HTML格式:
<td>{{ task.body }}</td>
<td>
<div>
<input v-el="editInputField" type="text" value="{{ task.body }}" v-on="keyup: doneEdit(this) | key 'enter'" v-model="newEdit"/>
</div>
</td>
<td>
<button v-on="click: editTask(this)" class="mdl-button mdl-js-button mdl-button--icon"> <i class="material-icons">create</i>
</button>
</td>
我们希望用组件替换此代码。使用此组件,我们可以识别我们在您的数据集中处理的索引/行。
<td v-component="listitem" index="{{$index}}"></td>
下一步:定义组件。
为了不使用组件覆盖我们的实例,我们将为vue对象创建一个单独的构造函数,因此我们可以将新元素分配给新对象。
这是使用extend。
完成的window.newVue = Vue.extend({
components:
{
'listitem': {
props: ['index'],
computed: {
// both get and set
body: {
get: function () {
return this.$parent.tasks[this.index].body;
},
set: function (v) {
this.$parent.tasks[this.index].body = v
}
}
},
template: '<td>{{ body }}</td><td><div><input type="text" v-model="body" value="{{ body }}"/></div></td><td></td>',
}
}
});
由于我们无法使用扩展来正确定义数据,因此我们假设在编写组件时数据已经存在。
第3步:定义实际数据: 我们现在使用新创建的实例化器,而不是使用Vue作为对象构造函数。
new newVue({
el: '#todoapp',
data: {
tasks: [{
'body': 'Eat breakfast',
'completed': false
}, {
'body': 'Drink milk',
'completed': false
}, {
'body': 'Go to the store',
'completed': false
}],
newTask: '',
},
});
就是这样!
如果您无法关注发生的事情:这是Fiddle!
PS:有关这些代码的更多信息,请访问vuejs.org
答案 1 :(得分:2)
实际上,更新数组项目的最简单方法是使用 v-model 指令双向绑定任务主体。
示例:
http://jsfiddle.net/z7960up7/2/
<div id="demo">
{{ message }}
<div class="edit">
<input type="text" v-model="message">
<button v-on="click: editMessage">Edit</button>
</div>
<pre>{{ $data | json }}</pre>
</div>
每当您模糊输入框或点击编辑按钮时,都会触发事件。
还可以使用 v-class 指令使用css隐藏输入字段。