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

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

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

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

Q&A

解決済

2回答

412閲覧

Vue.jsで更新した変数でリレンダーされない

naomi3

総合スコア1105

Vue.js

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

0グッド

0クリップ

投稿2020/02/24 13:56

編集2020/02/24 21:18

失礼しました。質問文が消えていました。

前提・実現したいこと

Vueの勉強のため、Excelの「課題管理シート」のWeb化を行っています。

  1. 最上の「+」ボタンクリックで、空の「課題」行を下に追加。
  2. 各行の「+」ボタンクリックで、空の「課題」行がなければ、「No.Xの関連課題」というリンクを持つ「課題」行を追加。
  3. 各行の「+」ボタンクリックで、空の「課題」行があれば、最上の空の「課題」行に「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>

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

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

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

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

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

guest

回答2

0

自己解決

ありがとうございます。
$nextTick()を使うことで解決できました。

Vue

1 let task = JSON.parse(this.newTask); 2 task.relatedTo = relatedToNumero; 3 this.tasks.splice(index, 1, task);

Vue

1 let task = JSON.parse(this.newTask); 2 task.relatedTo = relatedToNumero; 3 this.tasks.splice(index, 1); 4 this.$nextTick(() => { 5 this.tasks.push(task); 6 });

投稿2020/02/27 17:26

naomi3

総合スコア1105

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

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

0

spliceを使うと、そのIndexの入れ替えや削除になります。
課題の「追加」をしたい場合には、pushしてあげたら動くと思います

Javascript

1×this.tasks.splice(index, 1, task) 2this.tasks.push(task)

【補足】

直接関係ないんですが、addTaskRelatedTo()の中にindex変数を作ってあげているので、
indexを呼ぶ時にはthisはつけなくて大丈夫です。
thisで変数を呼ぶのはdata(){return }内の変数を呼ぶ時です。

Javascript

1 2×this.tasks.splice(this.index, 1, task); 3this.tasks.splice(index, 1, task);

投稿2020/02/25 04:37

oec

総合スコア271

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

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

naomi3

2020/02/25 11:49

ご回答ありがとうございます。 3.のケースになるので、同じ位置からの削除と(リンクをつけて)挿入すなわち入れ替えを「.splice(index, 1, task)」で行っています。「this.tasks[index].relatedTo = relatedToNumero;」では動作しなかったので、spliceで入れ替えを行ったつもりですが、変化がありませんね。 【補足】の件は、おっしゃる通りで、質問コードの未修正で、すみませんでした。(反映済みです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問