🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1045閲覧

v-ifを使うとデータが出なくなる

shin342

総合スコア22

Vue.js

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/12/29 05:37

前提・実現したいこと

Railsとvue.jsでtodoアプリを作成しています。
完了済のタスクと未完了のタスクを分けて表示したいです。
参考サイトではv-ifとv-forが一緒に記述されており、それで問題なく動くのですが、正しい書き方ではないと思うので分けて記述したいと思っています。
しかし今の書き方ですと完了済みタスク表示ボタンを押した際に完了済のデータが表示されません。
エラーメッセージは特に表示されていません。

動いていた修正前のソースコード

<ul class="collection"> <li v-bind:id="'row_task_' + task.id" class="collection-item" v-for="task in tasks" v-if="!task.is_done"> <input type="checkbox" v-bind:id="'task_' + task.id" v-on:change="doneTask(task.id)" /> <label v-bind:for="'task_' + task.id" class="word-color-black">{{ task.name }}</label> </li> </ul> </div> <!-- 完了済みタスク表示ボタン --> <button class="btn btn-custom" v-on:click="displayFinishedTasks">Display finished tasks</button> <!-- 完了済みタスク一覧 --> <div id="finished-tasks" class="display_none"> <ul class="collection"> <li v-bind:id="'row_task_' + task.id" class="collection-item" v-for="task in tasks" v-if="task.is_done"> <input type="checkbox" v-bind:id="'task_' + task.id" checked="checked" /> <label v-bind:for="'task_' + task.id" class="line-through">{{ task.name }}</label> </li> </ul>

該当のソースコード

<li v-bind:id="'row_task_' + task.id" class="collection-item" v-for="task in tasks" v-if="!task.is_done">の部分をv-ifと分けました。
<div> <ul v-if ="!tasks.is_done" class="collection"> <li v-bind:id="'row_task_' + task.id" class="collection-item" v-for="task in tasks" :key="task.id" > <input type="checkbox" v-bind:id="'task_' + task.id" v-on:change="doneTask(task.id)" /> <label v-bind:for="'task_' + task.id" class="word-color-black">{{ task.name }}</label> </li> </ul> </div> <!-- 完了済みタスク表示ボタン --> <button class="btn btn-custom" v-on:click="displayFinishedTasks">Display finished tasks</button> <!-- 完了済みタスク一覧 --> <div id="finished-tasks" class="display_none"> <ul v-if="tasks.is_done" class="collection"> <li v-bind:id="'row_task_' + task.id" class="collection-item" v-for="task in tasks" :key="task.id" > <input type="checkbox" v-bind:id="'task_' + task.id" checked="checked" /> <label v-bind:for="'task_' + task.id" class="line-through">{{ task.name }}</label> </li> </ul> </div>
<script> import axios from 'axios'; export default { data: function () { return { tasks: [], newTask: '' } }, mounted: function () { this.fetchTasks(); }, methods: { fetchTasks: function () { axios.get('/api/tasks').then((response) => { for(var i = 0; i < response.data.tasks.length; i++) { this.tasks.push(response.data.tasks[i]); } }, (error) => { console.log(error); }); }, createTask: function () { if (!this.newTask) return; axios.post('/api/tasks', { task: { name: this.newTask } }).then((response) => { this.tasks.unshift(response.data.task); this.newTask = ''; }, (error) => { console.log(error); }); }, doneTask: function (task_id) { axios.put('/api/tasks/' + task_id, { task: { is_done: 1 } }).then((response) => { this.moveFinishedTask(task_id); }, (error) => { console.log(error); }); }, displayFinishedTasks: function() { document.querySelector('#finished-tasks').classList.toggle('display_none'); }, moveFinishedTask: function(task_id) { var el = document.querySelector('#row_task_' + task_id); // DOMをクローンしておく var el_clone = el.cloneNode(true); // 未完了の方を先に非表示にする el.classList.add('display_none'); // もろもろスタイルなどをたして完了済みに追加 el_clone.getElementsByTagName('input')[0].checked = 'checked'; el_clone.getElementsByTagName('label')[0].classList.add('line-through'); el_clone.getElementsByTagName('label')[0].classList.remove('word-color-black'); var li = document.querySelector('#finished-tasks > ul > li:first-child'); document.querySelector('#finished-tasks > ul').insertBefore(el_clone, li); } } } </script>

参考サイト

https://qiita.com/naoki85/items/51a8b0f2cbf949d08b11

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

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

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

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

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

guest

回答1

0

ベストアンサー

修正された以下のコードですが、

v-if ="!tasks.is_done"

tasksが配列でis_doneのプロパティが取れず、必ずtrueになります。
(undefinedを論理否定されているので。逆に論理否定されていないv-ifはfalseになります。)

元のコードが

v-if="!task.is_done"

ですので、同じようにするにはv-forの中にv-ifをtaskで書く必要があります。

投稿2020/12/29 07:24

szk.

総合スコア1400

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

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

shin342

2020/12/29 14:25

丁寧にご説明いただきありがとうございました。 納得できました。 vs-codeに注意されたので修正しなければと思ったのですが、無視します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問