当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(){}'。 –