Javascriptだけで作ってたTodoアプリですが、今度はvue.jsを使って作りました。めちゃくちゃ楽でした🥺
挙動について
こちらでは、activeのみを表示させた時にステータスを変更したときは、activeのみ表示のままステータスを変更可能。activeのみ表示のときに追加、削除してもactiveのみの表示から移動せず、そのまま削除される仕様。
コード
Edit fiddle - JSFiddle - Code Playground
JSFiddle - Test your JavaScript, CSS, HTML or CoffeeScript online with JSFiddle.
上のリンクは実際に動くjsfiddleのもの
<div id="app" class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Todo App</div> <div class="card-body"> <input v-model="title" id="todovue-title" class="todovue-input" type="text" name="" value=""> <input v-on:click="add" id="button" type="button" name="button" value="追加"> <ul> <li :class="{ none: todo.view == false }" v-for="(todo, index) in todos"> <input @change="status(index)" type="checkbox" name="status" :checked="todo.status"> <span :class="{ completed: todo.status }">{{ todo.title }}</span> <button v-on:click="sakujo(index)" type="button" name="button">削除</button> </li> </ul> <div> <input type="radio" id="all" name="todo" value="all" v-on:change="change" checked> <label for="all">all</label> </div> <div> <input type="radio" id="active" name="todo" value="active" v-on:change="change"> <label for="active">active</label> </div> <div> <input type="radio" id="completed" name="todo" value="completed" v-on:change="change"> <label for="completed">completed</label> </div> </div> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.0"></script>
javascript
var app = new Vue({ el: '#app', data: function() { return { title: '', todos: [ // {title: 'やること1', status: false, view: true}, // {title: 'やること2', status: false, view: true}, // {title: 'やること3', status: false, view: true}, ] } }, methods: { add() { var todo = { title: this.title, status: false, view: true }; this.todos.push(todo); this.title = ''; }, sakujo(index) { this.todos.splice(index, 1) }, status(index) { if (this.todos[index].status == true) { this.todos[index].status = false } else if (this.todos[index].status == false) { this.todos[index].status = true } }, change(event) { if (event.target.value == 'all') { for (var i = 0; i < this.todos.length; i++) { this.todos[i].view = true } } else if (event.target.value == 'active') { for (var i = 0; i < this.todos.length; i++) { if (this.todos[i].status == true) { this.todos[i].view = false } if (this.todos[i].status == false) { this.todos[i].view = true } } } else if (event.target.value == 'completed') { for (var i = 0; i < this.todos.length; i++) { if (this.todos[i].status == true) { this.todos[i].view = true } if (this.todos[i].status == false) { this.todos[i].view = false } } } } }, })
css
.todovue-input { width: 100%; } ul { list-style: none; } .completed { text-decoration: line-through; } .none { display: none; }
コメント