我正在尝试提高自己在JavaScript OOP方面的水平,同时也在学习vue.js。我正在建立一个简单的任务列表来教自己,除删除任务功能外,我已完成了大部分任务。我最初只是使用.remove()选项,但是即使在另一个函数检查数组长度的情况下,它也没有更新前端的v-if和v-else语句。因此,我决定尝试拼接数组,但是由于它返回的是未定义的内容,我有点迷失了。因为数组中的每个元素都是一个对象,所以我确定这是我尝试调用该值的方式,但是我不太确定该怎么做。
这是HTML:
<div class="form-group">
<input type="text" id='task-entry' class='px-2' @keyup.enter="addTask">
<a href="#" class='btn btn-info' id='task-button' @click="addTask">Add Task</a>
</div> <!-- form-group -->
<hr class='hr my-5 bg-dark'>
<div class="task-list py-3 bg-white mx-auto w-75">
<ul v-if='taskList.length > 0' class='mb-0 px-2'>
<li v-for="tasks in taskList" class='text-dark p-3 task-item text-left clearfix'>
<div class='task-name float-left'>
<span>{{ tasks.task }}</span>
</div>
<a href="#" class="btn btn-danger remove-task float-right" @click='removeTask'>Remove Task</a>
</li>
</ul>
<div v-else>
You currently have no tasks.
</div>
这是JavaScript:
new Vue({
el: '#app',
data: {
title: 'To Do List',
taskList: [],
showError: false
},
methods: {
addTask: function () {
var task = document.getElementById('task-entry');
if (task.value !== '' && task.value !== ' ') {
this.error(1);
this.taskList.push({
task: task.value
});
task.value = '';
} else {
this.error(0);
}
},
removeTask: function (e) {
if(e.target.classList.contains('remove-task')) {
var targetElement = e.target.parentElement;
var test = targetElement.querySelector('span').innerText;
console.log(test);
console.log(this.taskList[{task: test}]);
} else {
e.preventDefault;
}
},
error: function (value) {
if (value === 0) {
this.showError = true;
} else {
this.showError = false;
}
}
}
});
答案 0 :(得分:2)
尝试一下:(我以VueJS的方式实现了remove函数,真的很简单)
new Vue({
el: '#app',
data: {
title: 'To Do List',
taskList: [],
showError: false
},
methods: {
addTask: function() {
var task = document.getElementById('task-entry');
if (task.value !== '' && task.value !== ' ') {
this.error(1);
this.taskList.push({
task: task.value
});
task.value = '';
} else {
this.error(0);
}
},
removeTask: function(tasks) {
this.taskList.splice(this.taskList.indexOf(tasks), 1)
},
error: function(value) {
if (value === 0) {
this.showError = true;
} else {
this.showError = false;
}
}
}
});
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<div id="app">
<div class="form-group">
<input type="text" id='task-entry' class='px-2' @keyup.enter="addTask">
<a href="#" class='btn btn-info' id='task-button' @click="addTask">Add Task</a>
</div>
<!-- form-group -->
<hr class='hr my-5 bg-dark'>
<div class="task-list py-3 bg-white mx-auto w-75">
<ul v-if='taskList.length > 0' class='mb-0 px-2'>
<li v-for="tasks in taskList" class='text-dark p-3 task-item text-left clearfix'>
<div class='task-name float-left'>
<span>{{ tasks.task }}</span>
</div>
<a href="#" class="btn btn-danger remove-task float-right" @click='removeTask(tasks)'>Remove Task</a>
</li>
</ul>
<div v-else>
You currently have no tasks.
</div>
</div>
有两个小步骤可以使您的代码按预期工作:
S1:在模板中,将事件处理程序更改为@click='removeTask(tasks)'
,如下所示:
<a href="#" class="btn btn-danger remove-task float-right" @click='removeTask(tasks)'>Remove Task</a>
S2:在脚本中,像这样重新编写remove方法:
removeTask: function(tasks) {
this.taskList.splice(this.taskList.indexOf(tasks), 1)
}
答案 1 :(得分:1)
还有一种Vue特定的方式可以实现您要实现的目标,并且您绝对不需要在DOM中查询值。
让我们从您的removeTask
方法开始。
Array.prototype.splice()
使用索引从数组中删除/插入值。您可以使用类似的方法从v-for
获取该索引
<li v-for="(tasks, index) in taskList">
现在您的删除链接可以使用此索引
<a @click.prevent="removeTask(index)">
您的方法可以使用
removeTask (index) {
this.taskList.splice(index, 1)
}
对于添加任务,我建议使用v-model
将新的 task 绑定到您的输入,例如
<input type="text" v-model="newTask" @keyup.enter="addTask">
和
data: {
title: 'To Do List',
taskList: [],
showError: false,
newTask: '' // added this
},
methods: {
addTask () {
if (this.newTask.trim().length > 0) {
this.error(1)
this.taskList.push({ task: this.newTask })
this.newTask = ''
} else {
this.error(0)
}
}
}