VueJs:如何编辑数组项

时间:2015-08-09 00:13:13

标签: javascript arrays laravel vue.js

简单的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方法将新元素添加到数组中,但我真的只想更新元素,因为我喜欢保持数据对象与我的后端。

2 个答案:

答案 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隐藏输入字段。