Ich arbeite an einer grundlegenden Aufgabenanwendung. Jede Aufgaben-/Aufgabenaufgabe wird als Eingabeelement in einer Vue-Komponente aufgelistet, und die <list-item>
werden mit einem v-Symbol angezeigt, das auf ein Aufgaben-Array zeigt.Aktualisieren des gebundenen Werts eines Eingangs bei der Bearbeitung
Ich versuche, den Benutzer zu ermöglichen, jede Aufgabe Eingabe zu bearbeiten, und bei Änderung des Werts, aktualisieren Sie die Array-Element (und nicht nur die Eingabe selbst). Mein @change-Ereignis auf dem Eingang wird ausgelöst, aber ich weiß nicht, was ich nach diesem Punkt tun soll.
https://jsfiddle.net/xbxm7hph/
HTML:
<div class="app">
<div class="add-control-area columns is-mobile is-multiline">
<responsive-container>
<div class="field is-grouped">
<div class="control is-expanded">
<input class="input add-control-text" type="text" placeholder="New Task" v-model="newTask" v-on:keyup.enter="addTask">
</div>
<div class="control">
<a class="button is-white add-control-button" @click="addTask" :disabled="!isThereText">Add Task</a>
</div>
</div>
</responsive-container>
<responsive-container>
<list-item v-for="task, index in tasks" :item="task" :index="index" @task-completed="completeTask(index)" @task-deleted="deleteTask(index)" ></list-item>
</responsive-container>
</div>
</div>
JS:
Vue.component('list-item', {
props: ['item', 'index'],
template: `<div class="task-wrapper">
<input class="task" :value="item" @change="updateTask()">
<div class="task-control delete-task" @click="deleteTask()"></div>
<div class="task-control complete-task" @click="completeTask()"></div>
</div>
`,
methods: {
completeTask: function() {
this.$emit('task-completed', this.index);
},
deleteTask: function() {
this.$emit('task-deleted', this.index);
},
updateTask: function() {
console.log('changed');
}
}
});
Vue.component('responsive-container', {
template: `
<div class="column is-4-desktop is-offset-4-desktop is-10-tablet is-offset-1-tablet is-10-mobile is-offset-1-mobile">
<div class="columns is-mobile">
<div class="column is-12">
<slot></slot>
</div>
</div>
</div>
`
});
var app = new Vue({
el: '.app',
data: {
tasks: [],
completedTasks: [],
newTask: ''
},
methods: {
addTask: function() {
if(this.isThereText) {
this.tasks.push(this.newTask);
this.newTask = '';
this.updateStorage();
}
},
completeTask: function(index) {
this.completedTasks.push(this.tasks[index]);
this.tasks.splice(index, 1);
this.updateStorage();
},
deleteTask: function(index) {
this.tasks.splice(index, 1);
this.updateStorage();
},
updateStorage: function() {
localStorage.setItem("tasks", JSON.stringify(this.tasks));
}
},
computed: {
isThereText: function() {
return this.newTask.trim().length;
}
},
// If there's already tasks stored in localStorage,
// populate the tasks array
mounted: function() {
if (localStorage.getItem("tasks")) {
this.tasks = JSON.parse(localStorage.getItem("tasks"));
}
}
});
'key' ist für benutzerdefinierte Komponenten erforderlich. Die Klammern für die Methodenhandler sind überflüssig. Außerdem binden Sie direkt an "Wert", der eine Eigenschaft ändert. https://vuejs.org/v2/guide/list.html#Components-and-v-for – Bert
@BerTevans warum nicht 'index' verwenden? Und ich weiß, dass die Dokumentation sagt, Schlüssel ist erforderlich, aber ist das nicht nur, wenn Sie möchten, dass die Daten binden?Ich denke, 'v-model' umgeht das. Ich bekomme die erwarteten Ergebnisse und keine Fehler oder Warnungen in der Geige. – thanksd
Sie erhalten keine Warnungen, weil er die Produktionsversion von Vue verwendet. Wir bekommen immer wieder Fragen von Leuten, die 'index' als Variable zu ihren Komponenten benutzen. Das Problem ist 'Index' Änderungen und' ID's nicht. – Bert