<div id="app">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1">待辦事項</span>
</div>
<input type="text" class="form-control" placeholder="準備要做的任務" v-model="newTodo" @keyup.enter="addTodo">
<div class="input-group-append">
<button class="btn btn-primary" type="button" @click="addTodo">新增</button>
</div>
</div>
<div class="card text-center">
<div class="card-header">
<ul class="nav nav-tabs card-header-tabs">
<li class="nav-item">
<a class="nav-link " :class="{'active': visibility =='all'}" @click="visibility='all'" href="#">全部</a>
</li>
<li class="nav-item">
<a class="nav-link " :class="{'active': visibility =='active'}" @click="visibility='active'" href="#">進行中</a>
</li>
<li class="nav-item">
<a class="nav-link" :class="{'active': visibility =='completed'}" @click="visibility='completed'" href="#">已完成</a>
</li>
</ul>
</div>
<ul class="list-group list-group-flush text-left">
<li class="list-group-item" v-for="(item,key) in filteredTodos" @dblclick="editTodo(item)">
<div class="d-flex" v-if="item.id !== cacheTodo.id">
<div class="form-check">
<input type="checkbox" class="form-check-input" :id="item.id" v-model="item.completed">
<label class="form-check-label"
:class="{'completed':item.completed}"
:for="item.id">
{{item.title}}
</label>
</div>
<button type="button" class="close ml-auto" aria-label="Close" @click="removeTodo(item)">
<span aria-hidden="true">×</span>
</button>
</div>
<input type="text" class="form-control"
v-model="cacheTitle"
@keyup.esc="cancelEdit()"
@blur="cancelEdit()"
@keyup.enter="doneEdit(item)"
v-if="item.id === cacheTodo.id">
</li>
<li class="list-group-item">
<input type="text" class="form-control">
</li>
</ul>
<div class="card-footer d-flex justify-content-between">
<span>還有 {{totall}} 筆任務未完成</span>
<a href="#" @click="removeAllItem()">清除所有任務</a>
</div>
</div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
newTodo: '',
todos: [],
visibility:'all',
cacheTodo:{},
cacheTitle:''
},
methods: {
addTodo() {
var value = this.newTodo.trim();
var timestamp = Math.floor(Date.now());
//如果沒有輸入則直接返回
if (!value) {
return;
}
this.todos.push({
id: timestamp,
title: value,
completed: false
});
this.newTodo = '';
},
removeTodo(todo) {
let vm = this;
let newIndex = vm.todos.findIndex(function(item){
return todo.id === item.id;
});
this.todos.splice(newIndex,1);
},
editTodo(item){
this.cacheTodo = item;
this.cacheTitle = item.title;
},
cancelEdit(){
this.cacheTodo = {};
},
doneEdit(item){
item.title = this.cacheTitle;
this.cacheTitle = '';
this.cacheTodo = {};
},
removeAllItem(){
this.todos = [];
this.totall = 0;
}
},
computed:{
filteredTodos(){
let newTodos = [];
if(this.visibility == 'all'){
return this.todos;
}else if(this.visibility == 'active'){
//對todos每一項資料進行循環檢測
this.todos.forEach(function(item){
if(!item.completed){
//將未完成資料放入新的陣列
newTodos.push(item);
}
})
return newTodos;
}else if(this.visibility == 'completed'){
//對todos每一項資料進行循環檢測
this.todos.forEach(function(item){
if(item.completed){
//將未完成資料放入新的陣列
newTodos.push(item);
}
})
return newTodos;
}
},
totall(){
let sum = this.todos.length;
if(sum == 0){
return sum;
}else{
this.todos.forEach(function(item){
if(item.completed){
sum--;
}
})
return sum;
}
}
}
});
</script>
<style>
.completed {
text-decoration: line-through;
}
</style>