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 的输入字段。