失礼しました。質問文が消えていました。
前提・実現したいこと
Vueの勉強のため、Excelの「課題管理シート」のWeb化を行っています。
- 最上の「+」ボタンクリックで、空の「課題」行を下に追加。
- 各行の「+」ボタンクリックで、空の「課題」行がなければ、「No.Xの関連課題」というリンクを持つ「課題」行を追加。
- 各行の「+」ボタンクリックで、空の「課題」行があれば、最上の空の「課題」行に「No.Xの関連課題」というリンクを挿入。
発生している問題・エラーメッセージ
1.と2.ができるものの、3.でリンクが描画されません。
ネット記事で「spliceなどを使えばリレンダーされる」とのことですが、リレンダーされません。
どうぞご教授お願い致します。
試したこと
this.$set(this.tasks, index, task);
補足情報(FW/ツールのバージョンなど)
@vue/cli 4.2.2
Vue
1<template> 2 <div id="app"> 3 <div class="buttonBox"> 4 <button class="buttonColor addTask" @click="addTask">+</button> 5 </div> 6 <table border="1" class="taskSheet"> 7 <thead> 8 <tr> 9 <th class="editingColumn">編集</th> 10 <th rowspan="2">No.</th> 11 <th colspan="2">課題</th> 12 </tr> 13 <tr> 14 <th class=" editingColumn">関連課題</th> 15 <th>概要</th> 16 <th>詳細</th> 17 </tr> 18 </thead> 19 <tbody> 20 <TaskRow v-for="(task, index) in tasks" 21 :key="index" 22 :index="index" 23 :numero_="task.numero" 24 :relatedTo_="task.relatedTo" 25 @addTaskRelatedTo="addTaskRelatedTo" /> 26 </tbody> 27 </table> 28 </div> 29</template> 30 31<script> 32import TaskRow from './components/TaskRow.vue' 33 34export default { 35 name: 'App', 36 components: { 37 TaskRow 38 }, 39 data () { 40 return { 41 dirty: false, 42 newTask: JSON.stringify({ numero: 0, relatedTo: 0 }), 43 tasks: [ 44 { numero: 5, relatedTo: 0 45 }, 46 { numero: 0, relatedTo: 0 47 } 48 ] 49 } 50 }, 51 computed: { 52 }, 53 methods: { 54 firstEmptyTaskIndex: function() { 55 for (let i = 0; i < this.tasks.length; i++) { 56 if (this.isEmpty(i)) { 57 return i; 58 } 59 } 60 return -1; 61 }, 62 isEmpty: function(index) { 63 const task = this.tasks[index]; 64 return task.numero <= 0 && task.relatedTo <= 0; 65 }, 66 addTask: function() { 67 this.tasks.push(JSON.parse(this.newTask)); 68 this.dirty = true; 69 return this.tasks.length - 1; 70 }, 71 addTaskRelatedTo: function(relatedToNumero) { 72 let index = this.firstEmptyTaskIndex(); 73 if (index >= 0) { 74 let task = JSON.parse(this.newTask); 75 task.relatedTo = relatedToNumero; // これが反映されない 76 this.tasks.splice(this.index, 1, task); 77 } 78 else { 79 index = this.addTask(); 80 this.tasks[index].relatedTo = relatedToNumero; // これは反映される 81 } 82 this.dirty = true; 83 return index; 84 } 85 } 86 } 87</script> 88 89<style> 90</style>
Vue
1<template> 2 <tr> 3 <!-- 関連課題追加 --> 4 <td> 5 <button class="buttonColor addTaskRelatedTo" @click="$emit('addTaskRelatedTo', numero)">+</button> 6 </td> 7 8 <!-- No. --> 9 <td class="numero rightAlignedCell"> 10 <a :name="'No.' + numero" v-if="numero > 0">{{numero | positiveOnly}}</a> 11 </td> 12 13 <!-- 概要 --> 14 <td> 15 <a v-if="relatedTo > 0" :href="'#No.' + relatedTo">No.{{relatedTo}}の関連課題</a> 16 <br v-if="relatedTo > 0"> 17 <input type="text" /> 18 </td> 19 20 <!-- 詳細 --> 21 <td> 22 </td> 23 24 </tr> 25 </template> 26 27<script> 28export default { 29 name: 'taskRow', 30 props: { 31 index: Number, 32 numero_: Number, 33 relatedTo_: Number, 34 }, 35 filters: { 36 positiveOnly: (n) => { 37 return (n <= 0 ? '' : n); 38 } 39 }, 40 data() { 41 return { 42 numero: this.numero_, 43 relatedTo: this.relatedTo_ 44 } 45 }, 46 47} 48</script> 49<style> 50</style>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。