【Vue.js】レコードを削除した後も、意図したlist.idを持ったレコードの状態を変更できるようにしたい
現在vue.jsでtodoリストを作成中です。
特定のレコードを削除した後、新たに特定のレコードの状態変更ボタンを押下した際、以下のエラーが出てしまってうまくいかず詰まっています。。
エラー
[Vue warn]: Error in v-on handler: "TypeError: Cannot read property 'state' of undefined"
やりたいこと
レコードを削除した後も、意図したlist.idを持ったレコードの状態を変更できるようにしたい
状況
編集中のコードは現在以下のようになっています。
削除
deleteTask(list_id) { this.lists.splice(list_id, 1) },
状態変更
changeTaskState(list_id) { this.lists[list_id].state = !this.lists[list_id].state },
全体
<template> <div id="app"> <div class="title"> <h1>Todoリスト</h1> </div> <div class="main"> <div class="switch"> <ul class="show-list"> <li v-for="item in items" :key="item.id"> <input type="radio" name="show" :id="item.id" :value="item.value" v-model="show"> <label :for="item.id">{{item.text}}</label> </li> </ul> </div> <div class="tasks"> <table> <tr> <th>ID</th> <th>コメント</th> <th>状態</th> </tr> <tr v-for="(list, index) in showTasks" v-bind:key="index"> <td>{{ list.id }}</td> <td>{{ list.comment }}</td> <td v-if="list.state"><button @click="changeTaskState(list.id)">作業中</button></td> <td v-else><button @click="changeTaskState(list.id)">完了</button></td> <td><button @click="deleteTask(list.id)">削除</button></td> </tr> </table> </div> </div> <div class="addTask"> <h1>新規タスクの追加</h1> <div class="form"> <form @submit.prevent> <input type="text" v-model="comment"> <input type="submit" value="送信" @click="addTask"> </form> </div> </div> </div> </template> <script> export default { data() { return { items: [ {id: 'all', value: 0, text: 'すべて'}, {id: 'doing', value: 1, text: '作業中'}, {id: 'done', value: 2, text: '完了'} ], lists: [], comment: '', show: 0, idNum: 0, } }, methods: { addTask: function(){ const todo = { comment: this.comment, state: true, id: this.idNum } this.idNum++ this.lists.push(todo) this.comment = ''; }, deleteTask(list_id) { this.lists.splice(list_id, 1) }, changeTaskState(list_id) { this.lists[list_id].state = !this.lists[list_id].state }, }, computed: { showTasks() { switch(this.show) { case 0: return this.lists; // 作業中の場合stateがtrueのものだけ表示させる case 1: return this.lists.filter(e => e.state) // 完了の場合stateがfalseのものだけ表示させる case 2: return this.lists.filter(e => !e.state) default: return [] } } } }; </script> <style scoped> ul { list-style: none; margin: 0; padding: 0; } .show-list { display: flex; margin: 5px 0; } </style>
質問
引数の指定の仕方は以下で良いでしょうか。
changeTaskState(list_id)
changeTaskStateの中で以下をしようとしてますが、考え方としてあっていますでしょうか。
this.lists.listのidがlist.idと一致するthis.lists.stateを変更する
どのコード部分が上記エラーを招いているのでしょうか。。
参考にしている記事
https://www.malanka.tech/entry/Passes-arguments-to-the-methods-to-be-executed-by-Vuejs-click
https://teratail.com/questions/259091
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。