質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Q&A

0回答

312閲覧

Vue.jsとFirebaseを用いたToDoアプリで完了、未完了、とフィルターをかけた状態でタスク管理をしたい。

ura148

総合スコア0

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

0グッド

0クリップ

投稿2020/07/02 11:38

初めて質問させていただきました。よろしくお願いいたします。

前提・実現したいこと

todoリストのアプリ作成を行っています。
その際未完タスク一覧や完了タスク一覧を表示した状態でタスクの完了未完了を管理するチェックボックスを押すと他のタスクまでチェックボックス が外れてしまいます。

発生している問題・エラーメッセージ

フィルターで【全て】を選んでいる状態で各ToDoのチェックボックスを操作しても問題ないのですが、
【未完タスク一覧】【完了タスク一覧】を選択した状態でToDoのチェックボックスを操作すると1個下と2個下のToDoのチェックボックスまで操作してしまいます

該当のソースコード

Vue.js

1<template> 2 <div class="task"> 3 <h2>タスク</h2> 4 <div> 5 <!-- 初期はVーmodelで"newTodoName"を入れているが空白、故にタスク作った後に空白にしないとミスが起こる --> 6 <input type="text" v-model="newTodoName"> 7 <button type="submit" v-on:click="createTodo()">タスク作成</button> 8 </div> 9 <ul> 10 <li><button type="submit" v-on:click="showTodoType = 'all'">すべて</button></li> 11 <li><button type="submit" v-on:click="showTodoType = 'active'">未完タスク一覧</button></li> 12 <li><button type="submit" v-on:click="showTodoType = 'complete'">完了タスク一覧</button></li> 13 </ul> 14 <!-- todoの一覧表示 --> 15 <ul v-for="(todo, key) in filteredTodos" :key="todo.id"> 16 <li class="card"><input type="checkbox" v-model="todo.isComplete" v-on:click="updateIsCompleteTodo(todo, key)">{{ todo.name + key }}</li> 17 <button type="submit" v-on:click="deleteTodo(key)">削除</button> 18 </ul> 19 </div> 20</template> 21<script> 22import firebase from "firebase"; 23 24export default { 25 name: "Task", 26 data() { 27 return { 28 database: null, 29 todosRef: null, 30 newTodoName: "", 31 showTodoType: "all", 32 todos: [] 33 }; 34 }, 35 created: function() { 36 this.database = firebase.database(); 37 this.uid = firebase.auth().currentUser.uid; 38 // refはreferenceでデータベースにある特定の項目を指し示すメソッド 39 this.todosRef = this.database.ref("todos/" + this.uid); 40 // データに変更があると実行されるfunction 41 var _this = this; 42 this.todosRef.on('value', function(snapshot) { 43 _this.todos = snapshot.val(); // データに変化が起きたときに再取得する 44 }); 45 }, 46 computed: { 47 // フィルターの実装showTodoTypeが変更されると実行される 48 filteredTodos: function () { 49 if (this.showTodoType == 'all') { 50 return this.todos; 51 } else { 52 var showComplete = false; 53 if (this.showTodoType == 'complete') { 54 showComplete = true 55 } 56 var filterTodos = {}; 57 58 for (var key in this.todos) { 59 var todo = this.todos[key]; 60 if (todo.isComplete == showComplete) { 61 filterTodos[key] = todo; 62 console.log(filterTodos[key]); 63 } 64 } 65 console.log(filterTodos); 66 return filterTodos; 67 } 68 } 69 }, 70 methods: { 71 // DBのtodos/[uid]/以下にデータを格納していく 72 createTodo: function() { 73 if (this.newTodoName == "") { return; } 74 this.todosRef.push({ 75 name: this.newTodoName, 76 isComplete: false, 77 }) 78 this.newTodoName = ""; 79 }, 80 // 完了・未完了の値の更新 81 updateIsCompleteTodo: function(todo, key) { 82 todo.isComplete = !todo.isComplete; 83 // DB内のデータを更新する 84 var updates = {}; 85 // todo.idで変更するtodoタスクを指定し、dataが更新されたtodoを挿入する 86 updates[key] = todo; 87 this.todosRef.update(updates) 88 }, 89 // todoの削除 90 deleteTodo: function(key) { 91 this.todosRef.child(key).remove(); 92 } 93 } 94}; 95</script>

試したこと

デバッグをし続けた結果、

this.showTodoType == 'all'

ではない時の下記のループ処理内においてなぜか操作したToDoのチェックボックスの1個下と2個下のToDoのチェックボックスまで操作している事はわかりました。しかしここではチェックボックスの真偽値に関わる

 isComplete: false,

の操作はありません。なぜ影響してしまっているのかわかりません。

else { var showComplete = false; if (this.showTodoType == 'complete') { showComplete = true } var filterTodos = {}; for (var key in this.todos) { var todo = this.todos[key]; if (todo.isComplete == showComplete) { filterTodos[key] = todo; console.log(filterTodos[key]); } } console.log(filterTodos); return filterTodos; } } },

解決方法が分かる方がいらっしゃいましたら教えていただけると幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問