當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。但是,您提到的這一點提醒我,設置上下文(this)時,ES6箭頭函數與舊函數語法的行爲不同,並且將其更改爲舊語法可以修復問題。除非你這麼做,否則我會寫一個答案來解釋爲什麼這個工作在一秒鐘內完成。 –
'()=>'將'this'的值更改爲封閉的上下文。在這種情況下,'this'可能等於'window'。這是你的問題。如果你想簡潔一些,你可以使用'addTodos(){}'而不是'addTodos:function(){}'。 –