VueJs:如何编辑数组项
VueJs: How to Edit an Array Item
简单的待办事项应用程序。请原谅我的无知,提出了一个相当基本的问题。
但是您将如何着手编辑数组中的某个项目?
通常我会尝试将我的输入值绑定到我的数据对象上的新 属性,然后通过 Vue 的点击将这个新的 属性 分配给旧的 属性双向数据绑定。
像这样:http://jsfiddle.net/z7960up7/
在我的例子中,我使用 v-repeat 指令,它循环遍历我的数据数组,但我不能使用 v-model 指令来使用双向数据绑定,因为如果我这样做。 (看这里:http://jsfiddle.net/doL46etq/2/)
现在我想知道,我将如何更新我的任务数组:
我的想法是在单击时通过我的方法传递 VueObject (this),然后在我的事件处理程序上定义索引,然后使用索引更新任务数组,如下所示:
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);
},
}
这是我的fiddle:
http://jsfiddle.net/doL46etq/3/
但是数据对象根本没有更新,我想知道我将如何着手更新它。
使用 Vue 编辑数组元素的最佳方法是什么?
编辑:一种简单的方法,就是删除元素,然后使用 push 方法将新元素添加到数组中,但我真的只想更新元素,因为我喜欢将数据对象保留在与我的后端同步。
简短的回答:在扩展构造函数中使用一个组件,然后在 HTML 中将索引作为 属性 传递给该组件,并使用计算属性来回 link你的数据。
但不要只满足于简短的回答。这是长篇:
情况:我使用你的 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>
我们想用组件替换此代码。使用此组件可以让我们识别我们正在处理的数据集中的 index/row。
<td v-component="listitem" index="{{$index}}"></td>
下一步:定义组件。
为了不让我们的实例与组件混淆,我们将为 vue 对象创建一个单独的构造函数,这样我们就可以将新元素分配给我们的新对象。
这是使用扩展完成的。
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
实际上,更新数组项的最简单方法是将 任务主体 与 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 的输入字段。
简单的待办事项应用程序。请原谅我的无知,提出了一个相当基本的问题。
但是您将如何着手编辑数组中的某个项目?
通常我会尝试将我的输入值绑定到我的数据对象上的新 属性,然后通过 Vue 的点击将这个新的 属性 分配给旧的 属性双向数据绑定。
像这样:http://jsfiddle.net/z7960up7/
在我的例子中,我使用 v-repeat 指令,它循环遍历我的数据数组,但我不能使用 v-model 指令来使用双向数据绑定,因为如果我这样做。 (看这里:http://jsfiddle.net/doL46etq/2/)
现在我想知道,我将如何更新我的任务数组:
我的想法是在单击时通过我的方法传递 VueObject (this),然后在我的事件处理程序上定义索引,然后使用索引更新任务数组,如下所示:
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);
},
}
这是我的fiddle:
http://jsfiddle.net/doL46etq/3/
但是数据对象根本没有更新,我想知道我将如何着手更新它。
使用 Vue 编辑数组元素的最佳方法是什么?
编辑:一种简单的方法,就是删除元素,然后使用 push 方法将新元素添加到数组中,但我真的只想更新元素,因为我喜欢将数据对象保留在与我的后端同步。
简短的回答:在扩展构造函数中使用一个组件,然后在 HTML 中将索引作为 属性 传递给该组件,并使用计算属性来回 link你的数据。
但不要只满足于简短的回答。这是长篇:
情况:我使用你的 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>
我们想用组件替换此代码。使用此组件可以让我们识别我们正在处理的数据集中的 index/row。
<td v-component="listitem" index="{{$index}}"></td>
下一步:定义组件。
为了不让我们的实例与组件混淆,我们将为 vue 对象创建一个单独的构造函数,这样我们就可以将新元素分配给我们的新对象。
这是使用扩展完成的。
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
实际上,更新数组项的最简单方法是将 任务主体 与 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 的输入字段。