Я пытаюсь добавить значение ввода в виде <li> в список <ul>.
Я смог добавить его, привязав значение к списку массивов lis. Однако он не остается там, когда я очищаю поле ввода. Как я могу это исправить?
HTML-код:
<div id = "app">
<h1>{{ message }}</h1>
<form v-on:submit.prevent = "addNewTodo">
<input type = "text" v-model = "todo.task">
<button type = "submit">Add todo</button>
</form>
<ul>
<li v-for = "todo in todos" :class = "{ completed: todo.isActive }" @click = "$set(todo, 'isActive', !todo.isActive)">
{{ todo.task }} <span v-on:click = "deleteTodo">{{ todo.delete }}</span>
</li>
</ul>
</div>
JS-код:
var app = new Vue({
el: '#app',
data: {
message: 'List of things to do today',
todos: [
{ task: 'Have breakfast', delete:'(x)'},
{ task: 'Go to the gym', delete:'(x)'},
{ task: 'Study Vuejs', delete:'(x)'}
],
todo: {task: '', delete: '(x)'}
},
methods: {
addNewTodo: function(){
this.todos.push( this.todo );
},
deleteTodo: function(){
this.todos.shift( this.todo )
},
}
});
Вот пример JSfiddle: https://jsfiddle.net/mercenariomode/gwd34815/1/



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы всегда ссылаетесь на это свойство, вы должны правильно клонировать его, например:
let t = {};
Object.assign(t,this.todo)
this.todos.push( t );
Еще одна проблема, которую я вижу в вашем коде, заключается в том, что вы удаляете неправильную задачу, чтобы исправить это, просто передайте индекс выбранной задачи методу deleteTodo следующим образом:
<ul>
<li v-for = "(todo,i) in todos" :class = "{ completed: todo.isActive }" @click = "$set(todo, 'isActive', !todo.isActive)">
{{ todo.task }} <span v-on:click = "deleteTodo(i)">{{ todo.delete }}</span>
</li>
</ul>
и используйте this.todos.splice(i,1);, чтобы удалить данную задачу:
deleteTodo: function(){
this.todos.splice(i,1);
}
Вам нужно изменить ссылку на объект, но в вашем случае было бы лучше привязать «v-модель» к свойству «задача»
HTML-код:
<form v-on:submit.prevent = "addNewTodo">
<input type = "text" v-model = "task">
<button type = "submit">Add todo</button>
</form>
JS-код:
el: '#app',
data: {
message: 'List of things to do today',
todos: [
{ task: 'Have breakfast', delete:'(x)'},
{ task: 'Go to the gym', delete:'(x)'},
{ task: 'Study Vuejs', delete:'(x)'}
],
task: '',
}
а в методе addNewTodo реализовать логику добавления объекта в массив
addNewTodo: function(){
let todo = {task: this.task, delete: '(x)'};
this.todos.push(todo);
this.task = ''; // clear data in input
},
JSFiddle: https://jsfiddle.net/nm29yq7d/1/
Я попробовал ваш код, он не работает. Не возражаете ли вы сделать образец JSfiddle?