Wenn addTodo
ausgelöst wird und ich this
darin überprüfen, ist der Kontext das Browserfenster, nicht das data
Objekt. So endet todos
undefined.Warum bezieht sich meine Vue-Methode nicht auf den richtigen Kontext (Daten)?
Irgendeine Idee, was ich vermisse?
HTML:
<div id="todo-list">
<input type="text" v-model="newTodo">
<button v-on:click="addTodo">Add</button>
<ul>
<li v-if="todos.length" v-for="todo in todos" class="todo-item">
{{ todo }}
</li>
</ul>
</div>
JS:
new Vue({
el: '#todo-list',
data: {
todos: [],
newTodo: ''
},
methods: {
addTodo:() => {
this.todos.push(this.newTodo);
this.clearNewTodo();
},
clearNewTodo:() => {
this.newTodo = '';
}
}
});
Warum verwenden Sie addTodo:() => {anstelle von addTodo: function() {} - wie auch immer Ihr Code korrekt ist, sollte this.todos defined definiert werden.Versuchen Sie, Ihren Code mit dem Beispiel zu vergleichen: https://vuejs.org/examples/svg.html – Xatenev
@ Xatenev Ich denke, ich finde es kürzer und sauberer. Es ist ES6. Aber Ihre Erwähnung erinnerte mich daran, dass sich die ES6-Pfeilfunktionen bei der Einstellung des Kontextes nicht wie die alte Funktionssyntax verhalten (...) und ... das Ändern der alten Syntax das Problem behebt. Ich werde eine Antwort schreiben, warum das in einer Sekunde funktioniert, es sei denn, du tust es. –
'() =>' ändert den Wert von 'this 'in den umgebenden Kontext. In diesem Fall kann "this" gleich "window" sein. Da ist dein Problem. Wenn Sie etwas knappes wollen, können Sie 'addTodos() {}' anstelle von 'addTodos: function() {}' verwenden. –