addTodo
がトリガーされ、その内部にthis
がある場合、コンテキストはブラウザウィンドウであり、data
オブジェクトではありません。したがって、todos
は未定義となります。私のVueメソッドが適切なコンテキスト(データ)を参照していないのはなぜですか?
私が迷っているものは何ですか?
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 = '';
}
}
});
なぜaddTodo:()=> {の代わりにaddTodo:function(){} - とにかくあなたのコードは正しいです、this.todosは間違いなく定義されるべきです。コードを例と比較してみてください:https://vuejs.org/examples/svg.html – Xatenev
@Xatenev私はそれがより短くてきれいだと思います。それはES6です。しかし、ES6の矢印関数は、コンテキスト(this)を設定するときに古い関数構文と同じ振る舞いをしていないことを覚えています。古い構文に変更すると問題が解決されます。私はあなたがしなければ、なぜこれが秒で動作するのかの答えを書くつもりです。 –
'()=>'は 'this 'の値を囲むコンテキストに変更します。この場合、「this」は「window」と等しくてもよい。あなたの問題があります。簡潔にするには 'addTodos:function(){}'の代わりに 'addTodos(){}'を使うことができます。 –